【问题标题】:Problems with implicit "and" in query grammar build using Antlr使用 Antlr 构建查询语法中的隐式“和”问题
【发布时间】:2009-11-15 17:43:01
【问题描述】:

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

除了一件事,我已经完成了,我挣扎了很久,没有解决。

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

我需要“and”来形成 AST 子树的根,如果“and”实际上不存在,则效果不佳。即使使用前瞻/回溯,我也找不到正确的语法来使其工作。

这是我当前使用显式“and”的语法的 sn-p:

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

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

【问题讨论】:

    标签: antlr


    【解决方案1】:

    最好的方法是这样做:

    andexpression : atom (AND_OP^ atom) ;

    也不需要回溯选项。

    特伦斯

    【讨论】:

    • 您好,特伦斯,感谢您的回复。但我希望“and”是可选的,以下不起作用:andexpression: atom (AND_OP?^ atom) 这就是我求助于重写规则的原因。艾伦
    • 老鼠们,现在 Terence 在 stackoverflow 上,祝你好运尝试成为任何 ANTLR 问题的选定答案:)
    【解决方案2】:

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

    expression
        : l=andexpression (OR_OP^ r=andexpression)*
        ;
    
    andexpression
        : atom (andop^ atom)*
        ;
    
    andop
        : AND_OP -> AND_OP
        | -> AND_OP
        ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多