0

我一直在 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 解析字符串,如“羊狗鱼”。

如果有人对如何使我的“和”可选有任何提示,将不胜感激。

4

2 回答 2

1

最好的方法是这样做:

andexpression : atom (AND_OP^ atom) ;

回溯选项也是不必要的。

特伦斯

于 2009-11-15T18:22:49.007 回答
1

答案是由 ANTLR 邮件列表中的某个人提供的。奇迹般有效。在这里重新发布给有兴趣的人。

expression
    : l=andexpression (OR_OP^ r=andexpression)*
    ;

andexpression
    : atom (andop^ atom)*
    ;

andop
    : AND_OP -> AND_OP
    | -> AND_OP
    ;
于 2009-11-17T12:23:37.910 回答