Тот факт, что вы добавили -
в правило синтаксического анализатора в качестве литерального токена, а также заставил OP2
соответствовать этому символу, приводит к тому, что OP2
никогда не соответствует -
.Вам нужно иметь правило лексера, которое соответствует только одному знаку минус (, как я показал ранее ):
op1
: MUL
| DIV
;
op2
: ADD
| MIN
;
...
MUL : '*' ;
DIV : '/' ;
ADD : '+' ;
MIN : '-' ;
, а затем используйте MIN
в вашей унарной альтернативе:
...
| MIN expression #unaryExpression
...
Когда у вас есть отдельное правило MIN : '-' ;
, вы можете сделать это:
...
| '-' expression #unaryExpression
...
, потому что теперь ANTLR «знает», что вы имеете в виду правило, которое соответствует одному -
, но ANTLRне «знает» об этом, когда у вас есть правило лексера, которое соответствует -
или +
, как ваше правило OP2
:
OP2 : '+' | '-' ;