使用Antlr构建查询语法中隐式“和”的问题

时间:2009-11-15 17:43:01

标签: antlr

我一直在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解析字符串就像“牧羊犬”。

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

2 个答案:

答案 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
    ;