Новичок: 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. Правила токенов всегда следуют за "победой в первом наиболее длинном матче", попытки повторного сопоставления для "лучшего анализа" не предпринимаются.

Другие вопросы по тегам