“隐性”问题;及;使用Antlr在查询语法构建中

“隐性”问题;及;使用Antlr在查询语法构建中,antlr,Antlr,我一直在用ANTLR(C#)构建一个类似google的查询语法解析器 我已经完成了,除了一件事,我已经挣扎了很长时间,但没有解决 如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1、word2和word3”。因此实际上,“and”在术语之间是可选的/隐含的 我需要“and”来形成AST子树的根,如果“and”实际上不存在,那么这就不太好。即使使用了lookahead/backtrack,我也找不到正确的语法来实现它 下面是我当前语法的一个片段,它使用显式的“an

我一直在用ANTLR(C#)构建一个类似google的查询语法解析器

我已经完成了,除了一件事,我已经挣扎了很长时间,但没有解决

如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1、word2和word3”。因此实际上,“and”在术语之间是可选的/隐含的

我需要“and”来形成AST子树的根,如果“and”实际上不存在,那么这就不太好。即使使用了lookahead/backtrack,我也找不到正确的语法来实现它

下面是我当前语法的一个片段,它使用显式的“and”:

理想情况下,我希望使andexpression看起来像这样:

andexpression
options {
backtrack=true;
}
    : l=atom (AND_OP? r=atom)* -> ^(AND_OP $l $r?)+
    ;
但我得到了重写EmptyStreamException解析字符串,比如“牧羊犬鱼”


如果有人对如何选择“和”选项有任何建议,我们将不胜感激。

最好的方法是:

andexpression:原子(和原子)

回溯选项也是不必要的


特伦斯的回答是由ANTLR邮件列表上的某个人提供的。工作起来很有魅力。重新张贴在这里为那些感兴趣的人

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

andexpression
    : atom (andop^ atom)*
    ;

andop
    : AND_OP -> AND_OP
    | -> AND_OP
    ;

嗨,特伦斯,谢谢你的回复。但我希望“and”是可选的,而以下选项不起作用:andexpression:atom(和_OP?^atom),这就是我求助于重写规则的原因。AllenRats,既然Terence在stackoverflow上,祝你好运尝试成为任何ANTLR问题的选择答案:)
expression
    : l=andexpression (OR_OP^ r=andexpression)*
    ;

andexpression
    : atom (andop^ atom)*
    ;

andop
    : AND_OP -> AND_OP
    | -> AND_OP
    ;