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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top