【发布时间】:2009-11-15 17:43:01
【问题描述】:
我一直在用 ANTLR (C#) 构建一个类似于 google 的查询语法解析器。
除了一件事,我已经完成了,我挣扎了很久,没有解决。
如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1 and word2 and word3”。所以实际上“和”在术语之间是可选的/隐含的。
我需要“and”来形成 AST 子树的根,如果“and”实际上不存在,则效果不佳。即使使用前瞻/回溯,我也找不到正确的语法来使其工作。
这是我当前使用显式“and”的语法的 sn-p:
expression
: andexpression (OR_OP^ andexpression)*
;
andexpression
options {
backtrack=true;
}
: atom (AND_OP^ atom)*
;
理想情况下,我想让 andexpression 看起来像这样:
andexpression
options {
backtrack=true;
}
: l=atom (AND_OP? r=atom)* -> ^(AND_OP $l $r?)+
;
但我得到 RewriteEmptyStreamException 解析字符串,如“羊狗鱼”。
如果有人对如何使我的“和”成为可选项有任何提示,将不胜感激。
【问题讨论】:
标签: antlr