获取ATN的当前状态

时间:2013-12-16 14:45:25

标签: antlr4

有没有人知道是否有办法获得当前的ATNState?我正在直接实现ParseTreeListener,并希望在这些方面做一些事情:

public class MyParseTreeListener implements ParseTreeListener {

    private ATN atn;

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

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,该信息不会保存在解析树中。您需要执行以下操作来保留它。

  1. 创建一个扩展TerminalNodeImpl的新类,并有一个用于存储ATNState的新字段(我假设您对ATNState感兴趣,其中包含终端的传出匹配转换)
  2. 覆盖Parser.consume()方法并复制其内容。将对ParserRuleContext.addChild(Token)的调用替换为创建自定义终端节点实例的代码,并使用ParserRuleContext.addChild(TerminalNode)将其添加到树中。请务必设置自定义终端节点的parent字段,因为ParserRuleContext.addChild(TerminalNode)不会为您执行此操作。