ANTLR4 GRAMMAR gauche erreur récursive
Question
J'ai un problème d'antlr4 en ce moment.
Chaque fois que j'essaie de nourrir des antlr avec cette grammaire 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 lancera une erreur car plus, moins, mults et div sont mutuellement à gauche récursif.
Je ne sais pas comment résoudre ce problème.
(Je sais que cela se produit parce que cette grammaire "expression" pourrait être infiniment bouclée, j'ai eu ce problème auparavant avec une autre grammaire, mais je pouvais résoudre ce moi-même)
Ma seule solution serait de limiter la grammaire de la manière suivante
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')+;
Mais ce n'est pas vraiment ce que je veux que ce soit, car maintenant je pouvais travailler au maximum avec des expressions telles que
2 3 + 5 4 - *
Et la grammaire serait plus complexe qu'elle ne pourrait être réellement.
J'espère que vous pouvez m'aider
La solution
AntlR4 prend uniquement en charge les règles de récursives gauche "directes", non "indirectes", comme vous les avez.
Essayez quelque chose comme ceci:
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-*
n'est pas une expression de RPN valide: elle doit commencer par deux chiffres.