2013-07-02 30 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

相关问题