为什么我的antlr4语法输入'='不匹配

时间:2013-07-02 19:28:05

标签: antlr grammar dsl antlr4 mismatch

我正在尝试构建一个语法,但我遇到了这个错误而无法看到我出错的地方。

如果我输入短语:

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 个答案:

答案 0 :(得分:1)

这是因为你要求它以两种方式匹配'=':一个作为语法中的文字,一个作为COMPARE_OP的一部分。它使用最具体的,即普通的'='。我建议你从COMPARE_OP中分出'='。