2013-12-16 71 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)不会为您执行此操作。