2013-12-16 111 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(TerminalNode)替換對ParserRuleContext.addChild(Token)的呼叫。請確保設置您的自定義終端節點的parent字段,因爲ParserRuleContext.addChild(TerminalNode)不會爲您執行此操作。