2016-09-16 12 views
4

Я собираюсь использовать ANTLR 4.5.3 для перевода одной нотации на другую. Я уже разработал описание грамматики, используя плагин в IntelliJ IDEA.Как получить AltNumber в ANTLR?

В моей грамматике одно правило имеет несколько альтернатив.

Когда я смотрю результаты в «Дерево парсов», каждый узел состоит из «имени правила»: «номер строки».

Как получить эту информацию с помощью API? Если я это четко понимаю, номер строки можно получить из getAltNumber(), но это поле пуст.

http://www.antlr.org/api/Java/org/antlr/v4/runtime/RuleContext.html#getAltNumber()

В документации сказано, что реализация по умолчанию не вычисляет и не хранить этот альт Num.

Как получить эту информацию?

+0

Использование «альтернативной маркировки» (TDAR pg 117, 261) было бы лучшим подходом. В противном случае подкласс, предложенный документом '# getAltNumber' - FWIW, никогда не нуждался в этом. – GRosenberg

+0

Вы уверены, что номер строки означает номер альт? Мне кажется, что это будет номер строки в исходном коде. Но тогда я не знаю вывод IntelliJ для грамматик ANTLR. Если вам нужен номер строки, ну, вызовите getLine() :-) –

ответ

1

У меня была точно такая же проблема. Документация должна быть немного более точной, но на самом деле она дает ключ. Кроме того, глядя прямо на плагин может привести к решению: https://github.com/antlr/intellij-plugin-v4/blob/master/src/java/org/antlr/intellij/plugin/preview/AltLabelTextProvider.java

Вы можете просто добавить контекст супер класс, реализующий setAltNumber и getAltNumber, как в примере: https://github.com/antlr/antlr4/blob/master/tool/src/org/antlr/v4/tool/GrammarInterpreterRuleContext.java

Затем обеспечить класс в качестве параметра генератора, например, :

antlr4 -o выход/путь -listener -visitor -DcontextSuperClass = GrammarInterpreterRuleContext -Dlanguage = Java -lib Lib/путь grammar.g4