Question

I'm very ashamed to ask... I wrote a grammar for the language with typecast from int to bool and vice versa.

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 ')'
     ;

But antlr tells me "The following sets of rules are mutually left-recursive [logic_expr, expr, math_expr]" I cant understand what's wrong in my grammar?

Was it helpful?

Solution

As of ANTLR 4.2.2, ANTLR 4 does not currently support grammars which contain indirect left recursion. This limitation is addressed by issue #522, which I'm hopeful makes it into ANTLR 4.3.

Since ANTLR 4 already supports direct left recursion, you can solve this problem by inlining your logic_expr and math_expr rules. I also edited 3 broken alternatives by adding parentheses you omitted. I did not remove the ambiguity which was present in the original rules.

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 ')'
       ;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top