我正在编写一个用 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
这是要走的路吗?我觉得我在这里缺少一些基本功能。