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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top