Я сталкиваюсь с проблемой правильного форматирования правил перезаписи, когда в исходном правиле возникают определенные условия.
Как правильно переписать это:
unaryExpression: op=('!' | '-') t=term
-> ^(UNARY_EXPR $op $t)
Мне кажется, Antlr не нравится, когда я ставлю что-то в круглых скобках с меткой, а "op =" завершается неудачно. Также я попробовал:
unaryExpression: ('!' | '-') t=term
-> ^(UNARY_EXPR ('!' | '-') $t)
Antlr не нравится или '|' и выдает ошибку грамматики.
Замена класса символов на имя токена действительно решает эту проблему, однако она порождает множество других проблем с моей грамматикой.
--- редактировать ----
Добавлена вторая проблема. Пожалуйста, помогите мне отформатировать это правило с помощью древовидной грамматики:
multExpression
: unaryExpression (MULT_OP unaryExpression)*
;
Довольно просто: я ожидаю, что каждый совпавший токен будет заключен в родительский (мнимый) токен MULT
, чтобы я получил что-то вроде:
MULT
o
|
o---o---o---o---o
| | | | |
'3' '*' '6' '%' 2