Как конфертировать из antlr v2 в v3 грамматику?

У меня есть грамматика ниже в v2 ANTLR, мне нужна помощь, чтобы преобразовать ее в v3

expression
: ( simpleLookup
  | lookup
  )
  ( x:LSQRBRACKET^ {#x.setType(ATTRIBUTES);} attributesExpr RSQRBRACKET! )?
;enter code here

На самом деле я пробовал ниже, но не уверен, будет ли это так же или нет, а также получаю ошибку ниже при попытке собрать парсер

expression
: ( simpleLookup
  | lookup
  )
  (x=LSQRBRACKET b=attributesExpr RSQRBRACKET )?) -> ^(ATTRIBUTES[$x] $a $b)?
;

и получить ниже ошибки

expecting SEMI, found '->'
unexpected token: $
unexpected token: $
unexpected token: )

Как конвертировать "!" in v3 from v2?

Пожалуйста, помогите мне с вашим опытом.....

У меня есть еще один вопрос: как я могу написать синтаксический анализатор дерева в v3 на уровне грамматики, как в v2, который мы использовали для записи в следующем формате?

class CustomTreeParser extends TreeParser;

1 ответ

Решение

Попробуйте что-то вроде этого:

grammar YourGrammarName;

options {
  output=AST;
}

tokens {
  ATTRIBUTES;
}

// ...

expression
 : ( simpleLookup
   | lookup
   )
   ( x=LSQRBRACKET^ {$x.setType(ATTRIBUTES);} attributesExpr RSQRBRACKET! )?
 ;

// ...

Как конвертировать "!" в v3 от v2?

Встроенный ! Оператор, который исключает определенные правила / токены из AST, остается неизменным в v3.

Еще один вопрос, который у меня есть, как я могу написать синтаксический анализатор дерева в v3 на уровне грамматики, как в v2 ...

Как это:

options {
  output=AST;
}
Другие вопросы по тегам