Ich versuche, eine Grammatik für arithmetische und boolesche Ausdrücke zu schreiben. Ich verstehe nicht, was ich falsch mache. Für meine Grammatik sagt ANTLR:Boolean und arithmetischer Ausdruck Grammatik in ANTLR
[Fatal] Regel Logic_atom hat nicht-LL (*) Entscheidung wegen rekursive Regelaufrufe von alts 1,2 erreichbar. Auflösen durch Links-Factoring oder Verwenden von syntaktischen Prädikaten oder Verwenden der Option backtrack = true.
Aber ich kann nicht eine Links-Factoring machen. Und ich möchte nicht arith_expr
berühren, weil ich dafür einen Code habe.
Fehler bei logic_atom : LBR logic_expr RBR | cmp_expr ;
Mein Code:
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)=>
wird nicht funktionieren.
Ich habe das auch probiert. Für diese antlrworks zeichnete einen Fehlerbaum. Zum Beispiel: 'x = (1 <2)' zeichnete ein '(... -> cmp_expr -> NoViableAltExpression)' –
@AlexanderLavrukov Ich aktualisierte die Antwort mit der Grammatik, die ich für das Testen und einige Beispielausgaben verwendete. Wenn Sie Zeit haben, versuchen Sie, diese Grammatik selbst auszuführen, um zu sehen, ob Sie Fehler bekommen. – user1201210
@AlexanderLavrukov, stellen Sie sicher, dass Sie ** nicht ** den Interpreter beim Testen verwenden. Verwenden Sie stattdessen den Debugger. –