3

我正在编写一个用 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

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

4

1 回答 1

1

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

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

创建以下树:

在此处输入图像描述

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

propcondition
 : propertyname '=' value -> ^(PROPCONDITION ^('=' propertyname value))
 | propertyname '<' value -> ^(PROPCONDITION ^('<' propertyname value))
 | ...
 ;
于 2012-06-22T12:31:37.793 回答