Sto provando a scrivere una grammatica per le espressioni aritmetiche e booleane. Non capisco cosa sto sbagliando. Per la mia grammatica, ANTLR dice:grammatica di espressioni booleane e aritmetiche in ANTLR
La regola [fatale] logic_atom ha una decisione non LL (*) dovuta a invocazioni di regole ricorsive raggiungibili da alts 1,2. Risolvi con il factoring sinistro o usando predicati sintattici o usando l'opzione backtrack = true.
Ma non posso fare a sinistra-factoring. E non voglio toccare arith_expr
, perché per questo ho un codice.
Errore in logic_atom : LBR logic_expr RBR | cmp_expr ;
Il mio codice:
grammar ArithmeticInterpreter;
options {
output = AST;
language = C;
}
//options{greedy=true;}:
axiom : lines EOF! ;
lines : line (SEP! line)* ;
line : (def_var | print_expr | scan_expr)? ;
def_var : VARIABLE ASSIGMENT^ logic_expr ;
print_expr : PRINT_KEYW^ arith_expr ;
scan_expr : SCAN_KEYW^ VARIABLE ;
arith_expr : ((PLS | MNS)^)? term ((PLS | MNS)^ term)*;
term : power ((MLP | DIV)^ power)*;
power : atom (options{greedy=true;}: PWR^ power)*;
atom : INT | FLOAT | VARIABLE | LBR arith_expr RBR -> ^(arith_expr);
logic_expr : logic_atom ((OR | AND)^ logic_atom)*;
logic_atom : LBR logic_expr RBR | cmp_expr ;
cmp_expr: arith_expr (LSS | LSQ | GRT | GRQ | EQL | NEQ) arith_expr;
WS : (' '| '\t'| '\r') {$channel=HIDDEN;};
LBR : '(' ;
RBR : ')' ;
PLS : '+' ;
MNS : '-' ;
MLP : '*' ;
DIV : '/' ;
PWR : '^' ;
LSS : '<' ;
LSQ : '<=' ;
GRT : '>' ;
GRQ : '>=' ;
EQL : '==' ;
NEQ : '!=' ;
AND : '&&' ;
OR : '||' ;
NOT : '!' ;
ASSIGMENT : '=' ;
PRINT_KEYW : 'print' ;
SCAN_KEYW : 'scan' ;
SEP : '\n' | ';' ;
INT : ('0'..'9')+;
FLOAT : INT '.' INT* EXP? | '.' INT EXP? | INT EXP;
fragment EXP : ('e'|'E') (PLS | MNS)? INT;
VARIABLE : SS (SS | '0'..'9')* ;
fragment SS : 'a'..'z' | 'A'..'Z' | '_' ;
// (LBR arith_expr)=>
non è un lavoro.
Anche io ci provo. Per questo antlrworks disegnato un albero di errori. Ad esempio: 'x = (1 <2)' disegnato a '(... -> cmp_expr -> NoViableAltExpression)' –
@AlexanderLavrukov Ho aggiornato la risposta con la grammatica che ho usato per i test e alcuni esempi di output. Quando hai tempo, prova a eseguire questa grammatica tu stesso per vedere se ti dà errori. – user1201210
@AlexanderLavrukov, assicurati di non ** usare l'interprete durante i test. Usa invece il debugger. –