ANTLR 3.x - Как отформатировать правила перезаписи
Я сталкиваюсь с проблемой правильного форматирования правил перезаписи, когда в исходном правиле возникают определенные условия.
Как правильно переписать это:
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
1 ответ
unaryExpression
: (op='!' | op='-') term
-> ^(UNARY_EXPR[$op] $op term)
;
Я использовал UNARY_EXPR[$op]
поэтому корневой узел получает некоторую полезную информацию о строке / столбце вместо значения по умолчанию -1.