我一直在 ANTLR (C#) 中构建一个类似谷歌的查询语法解析器。
除了一件事,我已经完成了,我已经挣扎了很长时间,也没有解决。
如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1 and word2 and word3”。所以实际上“和”在术语之间是可选的/隐含的。
我需要“and”来形成 AST 子树的根,如果“and”实际上不存在,这将不会顺利。即使使用前瞻/回溯,我也找不到正确的语法来使其工作。
这是我当前使用显式“and”的语法片段:
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 解析字符串,如“羊狗鱼”。
如果有人对如何使我的“和”可选有任何提示,将不胜感激。