2013-12-16 9 views
1

Кто-нибудь знает, есть ли способ получить текущий ATNState? Я реализую ParseTreeListener непосредственно и хотел бы сделать что-то вдоль этих линий:Получить текущее состояние ATN

public class MyParseTreeListener implements ParseTreeListener { 

    private ATN atn; 

    public MyParseTreeListener(ATN atn) { 
     this.atn = atn; 
    } 

    @Override 
    public void visitTerminal(TerminalNode terminalNode) { 
     // atn.getCurrentState(); 
    } 
} 

Спасибо много.

ответ

1

Эта информация не сохраняется в дереве разбора по умолчанию. Для его сохранения вам нужно сделать следующее.

  1. Создайте новый класс, который расширяет TerminalNodeImpl и имеет новое поле для хранения ATNState (я предполагаю, что вы заинтересованы в ATNState, который содержит исходящий переход совпадения для терминала).
  2. Переопределите метод Parser.consume() и продублируйте его содержимое. Замените вызов на ParserRuleContext.addChild(Token) кодом, который создает экземпляр вашего настраиваемого терминала и добавляет его в дерево с помощью ParserRuleContext.addChild(TerminalNode). Не забудьте установить поле parent вашего пользовательского терминала, так как ParserRuleContext.addChild(TerminalNode) не сделает это за вас.
Смежные вопросы