ANTLR4:如何以方便的格式打印树

ANTLR4: How to print a tree in a convenient format

我正在尝试以这种格式打印生成的树:

所以我需要获取有关树节点的信息。我按如下方式生成它:

public static void main(String[] args) throws Exception{
    CharStream cs = new ANTLRFileStream("test.txt");
    ExampleLexer lexer = new ExampleLexer(cs);
    TokenStream tokens = new CommonTokenStream(lexer);
    ExampleParser parser = new ExampleParser(tokens);
    ParseTree tree = parser.mainRule();
}

我可以使用 tree.getChild(int childNumber) 方法访问子树,并使用 tree.getChild(int childNumber).getText() 方法获取它们的文本,但我无法获取有关节点的任何信息(我需要知道类型令牌的名称(如果节点是令牌)和规则名称(如果那不是令牌))。我该怎么做?

提前致谢。

节点的类型是"encoded"作为节点class...实际代表一个Token的是一个TermninalRuleImpl.

您可以通过 getSymbol() 访问 Token,所以类似的东西应该可以工作:

if(node instanceof TerminalNodeImpl) {
    Token representedToken = ((TerminalNodeImpl) node).getSymbol();
}

如果您需要令牌类型,您可以使用 TokengetType() 方法检查它,这将吐出一个在您的解析器中定义为常量的数字-class.