我正在尝试编写一段代码,它将采用 ANTLR4 解析器并使用它为类似于 grun ( misc.TestRig
) 上的 -tree 选项给出的输入生成 AST。但是,我还希望输出包含所有行号/偏移信息。
例如,代替打印
(add (int 5) '+' (int 6))
我想得到
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
或类似的东西。
ANTLR4 的访问者示例还不是很多,但我很确定我可以通过复制toStringTree
(由 grun 使用)的默认实现来完成大部分工作。但是,我没有看到有关行号或偏移量的任何信息。
我希望能够编写像这样的超级简单的代码:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
但似乎没有这么简单。我猜我应该能够从解析器中获取行号信息,但我还没有弄清楚如何去做。如何在遍历中获取此行号/偏移信息?
为了填补以下解决方案中的几个空白,我使用了:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
得到tree
和ruleNames
。 program
是我语法中顶级作品的名称。