2

我收到了这个著名的错误

由于递归规则调用,规则具有非 LL(*) 决策

遵循简单的语法。

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

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

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

我已经经历了以下没有帮助的答案。

  1. 这个问题:我不想将数学表达式和布尔表达式合二为一,所以我不必通过 AST 来验证它。我试图将这两个表达式分开。

  2. 这个问题维基百科没有帮助我理解这种具体情况。而且我认为我不能比这更简化这个语法。

  3. 这个问题这里我想我们有不同的情况。

我不明白这里的左递归是什么。我没有看到任何A-->Ab|b或类似的东西。谁能帮我解决这个问题。

请注意以下。

  • 我没有运算符优先级,我总是使用括号
  • 我不想结合两种类型的表达式
  • 如果有人感兴趣,这适用于 ANTLR4
4

1 回答 1

1

问题是你在 bool_expr 中的两个 alt 的开头有 '('。

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

解决方案是将回溯选项添加到您的语法中:

options {
backtrack=true;
}
于 2014-05-20T11:52:46.613 回答