ANTLR4还有另一个左递归

时间:2014-04-10 21:07:55

标签: antlr4 left-recursion

我很惭愧地问...... 我用语法编写了一个语法语法,从int到bool,反之亦然。

logic_expr : expr NOT? OR | AND expr
       | expr '|' expr SMALLER | LARGER
       | NUMBER
       | NUMBER_SHORT
       | IDENT
       | LOGIC_DEFINED
       ;
math_expr : expr ADD | SUB expr
      | NUMBER
      | NUMBER_SHORT
      | IDENT
      | LOGIC_FULL
      ;
expr : logic_expr
     | math_expr
     | IDENT
     | LOGIC_DEFINED
     | '(' expr ')'
     ;

但是antlr告诉我“以下几组规则是相互左递归的[logic_expr,expr,math_expr]” 我不明白我的语法有什么问题?

1 个答案:

答案 0 :(得分:4)

从ANTLR 4.2.2开始,ANTLR 4目前不支持包含间接左递归的语法。 issue #522解决了这一限制,我希望将其纳入ANTLR 4.3。

由于ANTLR 4已经支持直接左递归,因此您可以通过内联logic_exprmath_expr规则来解决此问题。我还通过添加您省略的括号编辑了3个破损的备选方案。我没有消除原规则中存在的含糊之处。

expr
       : expr NOT? (OR | AND) expr
       | expr '|' expr (SMALLER | LARGER)
       | NUMBER
       | NUMBER_SHORT
       | IDENT
       | LOGIC_DEFINED
       | expr (ADD | SUB) expr
       | NUMBER
       | NUMBER_SHORT
       | IDENT
       | LOGIC_FULL
       | IDENT
       | LOGIC_DEFINED
       | '(' expr ')'
       ;