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();
}
如果您需要令牌类型,您可以使用 Token
的 getType()
方法检查它,这将吐出一个在您的解析器中定义为常量的数字-class.
我正在尝试以这种格式打印生成的树:
所以我需要获取有关树节点的信息。我按如下方式生成它:
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();
}
如果您需要令牌类型,您可以使用 Token
的 getType()
方法检查它,这将吐出一个在您的解析器中定义为常量的数字-class.