Errore ricorsivo sinistro della grammatica antlr4
Domanda
Sto avendo un bel problema con Antlr4 in questo momento.
Ogni volta che provo a nutrire Antlr con questa grammatica RPN
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
plus : expression expression '+';
minus : expression expression '-';
mult : expression expression '*';
div : expression expression '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
Antlr lancerà un errore perché Plus, meno, mult e div sono reciprocamente sinistro ricorsivo.
Non so come risolverlo.
(So che questo si verifica perché con questa grammatica "espressione" potrebbe essere infinitamente in loop, ho avuto questo problema prima con un'altra grammatica, ma potrei sistemarlo da solo)
La mia unica soluzione sarebbe quella di limitare la grammatica nel modo seguente
grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER NUMBER '-';
mult2: NUMBER NUMBER '*';
div2: NUMBER NUMBER '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;
.
Ma questo non è proprio quello che voglio che sia, perché ora potrei lavorare al massimo con espressioni come
2 3 + 5 4 - *
.
e la grammatica sarebbe più complessa di quanto non possa essere.
Spero che voi ragazzi possa aiutarmi
Soluzione
Antlr4 supporta solo "diretti" regole ricorsive sinistra, non "indiretto", come li hai.
Prova qualcosa del genere:
grammar RPN;
parse : expression EOF;
expression
: expression expression '+'
| expression expression '-'
| expression expression '*'
| expression expression '/'
| NUMBER
;
NUMBER : '-'? ('0'..'9')+;
SPACES : [ \t\r\n] -> skip;
.
BTW, 23+54-*
non è un'espressione RPN valida: deve iniziare con due numeri.