我正在嘗試爲算術和布爾表達式編寫一個語法。我不明白我做錯了什麼。對於我的語法,ANTLR說:ANTLR中的布爾和算術表達式語法
[fatal] rule logic_atom由於從alts 1,2可到達的遞歸規則調用而具有非LL(*)決策。通過左分解或使用語法謂詞或使用backtrack = true選項進行解析。
但我不能做左保理。我不想觸摸arith_expr
,因爲我有一個代碼。
錯誤logic_atom : LBR logic_expr RBR | cmp_expr ;
我的代碼:
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)=>
是不行的。
我也試過了。爲此antlrworks繪製了一個bug樹。例如:'x =(1 <2)'繪製了一個'(... - > cmp_expr - > NoViableAltExpression)' –
@AlexanderLavrukov我用我用於測試的語法和一些示例輸出更新了答案。當你得到時間時,試着自己運行這個語法來看看它是否給你帶來錯誤。 – user1201210
@AlexanderLavrukov,確保你**不**在測試時使用解釋器。改用調試器。 –