Antlr删除左递归,同时分别保持数学表达式和bool表达式

时间:2014-05-08 14:26:17

标签: java antlr grammar antlr3 left-recursion

我收到了这个着名的错误

  由于递归规则调用,

规则具有非LL(*)决策

用于遵循简单的语法。

expr
    :   INTEGER         
    |   '(' expr '+' expr ')'
    ;

bool_expr
    :   '(' bool_expr 'and' bool_expr ')'
    |   '(' expr '<' expr ')'
    ;

INTEGER
    : '0'..'9'+
    ;
WS  
    : (' ' | '\t' | ('\r')? '\n')+ {$channel = HIDDEN; }
    ;

我已经按照以下答案进行了检查。

  1. This Question:我不想将数学表达式和布尔表达式合并为一个,所以我不必通过AST验证它。我试图分别保留这两个表达式。

  2. This Question维基百科无法帮助我了解这一具体情况。而且我认为我不能简化这种语法。

  3. This Question我认为我们有不同的情况。

  4. 我无法理解这里的左递归是什么。我没有看到任何A-->Ab|b或类似的东西。任何人都可以帮我解决这个问题。

    请注意以下内容。

    • 我没有运营商优先权,我总是使用括号
    • 我不想合并两种表达方式
    • 如果有兴趣,这适用于ANTLR4

1 个答案:

答案 0 :(得分:1)

问题是你在bool_expr的两个人的开头就已经开始了。

A-->'('AB|'('B也包含递归问题。 @see生成的解析器。

解决方案是在语法中添加回溯选项:

options {
backtrack=true;
}