Próbuję napisać gramatykę dla wyrażeń arytmetycznych i boolowskich. Nie rozumiem, co robię źle. Dla mojej gramatyki ANTLR mówi:gramatyka wyrażenie logiczne i arytmetyczne w ANTLR
[fatalna] reguła logic_atom ma decyzję inną niż LL (*) z powodu rekursywnych wywołań reguł osiągalnych z alts 1,2. Rozwiąż przez lewostronne faktoring lub używając predykatu składniowego lub używając opcji backtrack = true.
Ale nie mogę zrobić lewostronnego faktoringu. I nie chcę dotykać arith_expr
, ponieważ do tego mam kod.
Błąd w logic_atom : LBR logic_expr RBR | cmp_expr ;
mojego kodu:
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)=>
nie działa.
Próbowałem tego również. Do tego antlrworks narysował drzewo błędów. Na przykład: 'x = (1 <2)' narysował '(... -> cmp_expr -> NoViableAltExpression)' –
@AlexanderLavrukov I zaktualizowałem odpowiedź gramatyką, której użyłem do testowania i przykładowym wyjściem. Kiedy masz czas, spróbuj uruchomić tę gramatykę samodzielnie, aby zobaczyć, czy daje błędy. – user1201210
@AlexanderLavrukov, upewnij się, że ** nie ** używasz interpretera podczas testów. Zamiast tego użyj debuggera. –