1

My ANTLR4 grammar in file power.g4 is this:

assign     : id '=' expr ;
id         : 'A' | 'B' | 'C' ;
expr       : expr '+' term
           | expr '-' term
           | term ;
term       : term '*' factor
           | term '/' factor
           | factor ;
factor     : expr '**' factor
           | '(' expr ')'
           | id ;
WS         : [ \t\r\n]+ -> skip ;

When I run command

antlr4 power.g4

This error occurred:

error(119): power.g4::: The following sets of rules are mutually left-recursive [expr, factor, term]

What can I do?

Behrooz Fard
  • 536
  • 4
  • 26
  • Possible duplicate of [Solving ANTLR Mutually left-recursive rules](https://stackoverflow.com/questions/3556078/solving-antlr-mutually-left-recursive-rules) – Jiri Tousek Nov 03 '17 at 21:11

1 Answers1

2

To avoid the left recursion error, put all forms of an expr in one rule, ordered by desired precedence:

expr       : '(' expr ')'
           | expr '+'  expr 
           | expr '-'  expr 
           | expr '*'  expr 
           | expr '/'  expr 
           | expr '**' expr 
           | id 
           ;
GRosenberg
  • 5,843
  • 2
  • 19
  • 23
  • In v3, there was a cascade of calls, from low to high precedence, as the OP did. In v4, the precedence must be from highest to lowest, see [here](https://stackoverflow.com/questions/47031635/antlr-parser-operator-priority/47034131#47034131). – BernardK Nov 03 '17 at 23:40
  • Yes, as I said, listed in the order of **desired** precedence, whatever that may be. – GRosenberg Nov 04 '17 at 02:18