我正在编写一个用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
这是要走的路吗?我有一种感觉,我在这里缺少一些基本功能。
答案 0 :(得分:1)
是的,这是要走的路。请注意,如果您创建名为PROPCONDITION
的根,则可以删除'='
符号:这样的条件总是会有两个孩子,对吗?左手侧和右手侧。
propcondition
: propertyname '=' value -> ^(PROPCONDITION propertyname value)
;
创建以下树:
如果有更多的运营商,你可以这样做:
propcondition
: propertyname '=' value -> ^(PROPCONDITION ^('=' propertyname value))
| propertyname '<' value -> ^(PROPCONDITION ^('<' propertyname value))
| ...
;