2013-07-02 33 views
2

我正在嘗試構建一個語法,但在此錯誤上陷入困境,無法看到我出錯的地方。爲什麼我在我的antl4語法中得到不匹配的輸入'='

如果我輸入詞組:

if(hello = "test", 1, 0) 

到antlr4 testrig我得到* 「不匹配輸入 '=' 期待COMPARE_OP」 *。我究竟做錯了什麼?

這裏是我的全部語法:

prog: (expr|stats); 
val_expr: (rename|rex); 
cond_expr: (match|xif|compare_op); 
expr: (val_expr|cond_expr|var|math_expr|eval); 
rename : 'rename' var 'as' LITERAL; // match keyword hello followed by an 
count : 'count' ('as' LITERAL)* ('by' var (',' var)*)*; // 
match : 'match' '(' cond_expr ',' expr ')'; // match(x, y) 
xif : 'if' '(' cond_expr ',' expr ',' expr ')'; // if(x, y, z) 
var: (VARNAME|LITERAL|BLANK); 
stats: 'stats' count; 
eval: 'eval' VARNAME '=' expr; 
rex: 'rex' ('field' '=' var)* LITERAL; 
compare_op: math_term COMPARE_OP math_term; 
math_expr: math_term (MATH_OP math_term)*; 
math_term: (var|DIGITS); 

VARNAME : [a-zA-Z_]([a-zA-Z0-9_])*; 
DIGITS: [0-9]+; 
WS : [ \t\r\n]+ -> skip ; 
BLANK: '""'; 
LITERAL : '"' ('\\"' | .)*? '"' ; 
COMPARE_OP: ([=><]|'>='|'<='); 
MATH_OP: ('+'|'/'|'%'|'*'|'-'); 

回答

1

這是因爲你要求它在兩個方面匹配「=」:一個在語法文字和一個作爲COMPARE_OP的一部分。它使用最具體的,這是簡單的'='。我建議你從COMPARE_OP中分出'='。

+0

謝謝,將代碼更改爲:'COMPARE_OPS:([><]|'> ='|'<='); EQUALS:'=';' – whisperstream

相關問題