ANTLR 3.x - Как отформатировать правила перезаписи - PullRequest
3 голосов
/ 27 февраля 2010

Я сталкиваюсь с проблемой правильного форматирования правил перезаписи, когда в исходном правиле возникают определенные условия.

Как правильно переписать это:

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 Ответ

2 голосов
/ 27 февраля 2010
unaryExpression
    :    (op='!' | op='-') term
         -> ^(UNARY_EXPR[$op] $op term)
    ;

Я использовал UNARY_EXPR[$op], поэтому корневой узел получает некоторую полезную информацию о строке / столбце вместо значения по умолчанию -1.

...