почему я получаю несоответствующий вход '=' в моей грамматике antl4

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

 Смежные вопросы

  • Нет связанных вопросов^_^