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

时间:2017-08-11 16:29:39

标签: java tree antlr antlr4

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

picture

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

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()方法来获取文本,但我无法获得有关节点的任何信息(我需要知道其类型token(如果节点是令牌)和规则名称(如果不是令牌))。我怎么能这样做?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

节点的类型是"编码"作为节点类......实际代表Token的那些是TermninalRuleImpl

您可以通过Token访问getSymbol(),因此应该有效:

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

如果您需要令牌类型,可以使用getType()的{​​{1}}方法进行检查,该方法将吐出一个在解析器类中定义为常量的数字。