【问题标题】:Remember ANTLR rules/nodes in AST记住 AST 中的 ANTLR 规则/节点
【发布时间】:2012-06-22 20:46:00
【问题描述】:

我正在编写一个用 ANTLR 实现的简单查询解析器,我想检索查询的树表示。为此,我使用options { output = AST }。然后我解析查询得到树(代码是python):

lexer = MyQueryLexer(char_stream)
tokens = antlr3.CommonTokenStream(lexer)
parser = MyQueryParser(tokens)
q = parser.query()  # query is my root rule
# do something with q.tree

现在,我从解析器获得的树不包含任何规则名称,只是平面列表中的标记。我可以使用重写规则和^/! 将它们放入树结构中,但它们仍然只是标记。例如,其中一个查询的一部分可能是color = 1。这符合以下规则(简化):

propcondition
: propertyname '=' value

那会变成:

# token type, text
5 color
20 =
8 1

有了'='^我可以把它变成:

20 =
  5 color
  8 1

但我希望该片段记住它是作为“propcondition”匹配的。我能找到的最接近的事情是引入带有重写规则的假令牌:

propcondition
: propertyname '=' value -> ^(PROPCONDITION propertyname '=' value)
// ...

然后给出:

4 PROPCONDITION
  5 color
  20 =
  8 1

这是要走的路吗?我感觉这里缺少一些基本功能。

【问题讨论】:

    标签: antlr


    【解决方案1】:

    是的,这就是要走的路。请注意,如果您创建一个名为 PROPCONDITION 的根,则可以删除 '=' 符号:这样的条件将永远有两个孩子,对吧?一个左边,一个右边。

    propcondition
     : propertyname '=' value -> ^(PROPCONDITION propertyname value)
     ;
    

    创建以下树:

    如果有更多的运营商,你可以这样做:

    propcondition
     : propertyname '=' value -> ^(PROPCONDITION ^('=' propertyname value))
     | propertyname '<' value -> ^(PROPCONDITION ^('<' propertyname value))
     | ...
     ;
    

    【讨论】:

    • 谢谢!我不确定我将如何处理'=',因为会有几个运算符。要么把它留在那里,要么为每个条件创建不同的标记。我想一个和另一个一样好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多