我一直在ANTLR(C#)中构建类似Google的查询语法解析器。
除了一件我已经挣扎了很长时间而未能解决的事情,我已经完成了。
如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1和word2和word3”。实际上,“和”在术语之间是可选的/隐含的。
我需要“和”来形成AST子树的根,如果“和”实际上并不存在,那就不顺利了。即使有前瞻/回溯,我也找不到合适的语法来使它工作。
这是我当前语法的一个片段,它与明确的“and”:
一起使用expression
: andexpression (OR_OP^ andexpression)*
;
andexpression
options {
backtrack=true;
}
: atom (AND_OP^ atom)*
;
理想情况下,我想使表达式看起来像这样:
andexpression
options {
backtrack=true;
}
: l=atom (AND_OP? r=atom)* -> ^(AND_OP $l $r?)+
;
但我得到的RewriteEmptyStreamException解析字符串就像“牧羊犬”。
如果有人对如何使我的“和”选项有任何提示,我们将不胜感激。
答案 0 :(得分:1)
最好的办法是:
andexpression:atom(AND_OP ^ atom);
回溯选项也是不必要的。
特伦斯
答案 1 :(得分:1)
答案由ANTLR邮件列表上的某人提供。奇迹般有效。在这里重新发布感兴趣的人。
expression
: l=andexpression (OR_OP^ r=andexpression)*
;
andexpression
: atom (andop^ atom)*
;
andop
: AND_OP -> AND_OP
| -> AND_OP
;