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.

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