记住AST中的ANTLR规则/节点

时间:2012-06-22 10:53:05

标签: antlr

我正在编写一个用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
: propertyname '=' value -> ^(PROPCONDITION propertyname '=' value)
// ...

然后给出:

4 PROPCONDITION
  5 color
  20 =
  8 1

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

1 个答案:

答案 0 :(得分:1)

是的,这是要走的路。请注意,如果您创建名为PROPCONDITION的根,则可以删除'='符号:这样的条件总是会有两个孩子,对吗?左手侧和右手侧。

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

创建以下树:

enter image description here

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

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