Новичок: ANTLR4 Grammar не обрабатывает отрицательные числа
В настоящее время я работаю над простой грамматикой ANTLR4 для вычисления математических выражений. На данный момент моя грамматика должна уметь анализировать простые операции, такие как умножение, деление, сложение и вычитание... Вот моя грамматика:
grammar WRB;
options {
language = Java;
}
prog: stat+;
stat: expr SEPARATOR #printExpr
| ID ASSIGN expr SEPARATOR #assignment
;
expr: expr op=(MUL|DIV) expr #punkt
| expr op=(ADD|SUB) expr #strich
| num #number
| (SIGN)? ID #ref
| '(' expr ')' #klammer
;
ID : [a-zA-Z]+;
DIGITS : [0-9]+ ;
ASSIGN: '=';
MUL: '*';
DIV: '/';
ADD: '+';
SUB: '-';
integer: (SIGN)? DIGITS;
floating: (integer)? '.' DIGITS;
num: (integer | floating);
SIGN: '+' | '-';
SEPARATOR: ';';
WS: [ \t\r\n]+ -> skip ;
Все отлично работает кроме отрицательных чисел. Вот синтаксическое дерево для образца "-4 + 9":
Я новичок в распознавании языков и грамматике. Я не понимаю, почему ANTLR обрабатывает отрицательный знак как посторонний ввод, неexpr
Правило погрузиться в #number
альтернатива?
Заранее спасибо.
1 ответ
Без тестирования: попробуйте удалить SIGN
Правило, переписать integer
как (SUB|ADD)? DIGITS
. Насколько я понимаю,SIGN
никогда не будет совпадать, потому что следует SUB
а также ADD
. Правила токенов всегда следуют за "победой в первом наиболее длинном матче", попытки повторного сопоставления для "лучшего анализа" не предпринимаются.