【发布时间】:2013-10-13 21:52:44
【问题描述】:
我正在尝试编写一段代码,它将采用 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 是我语法中最高产生式的名称。
【问题讨论】:
-
有 2 个
toStringTree方法。一个采用Parser实例,而另一个只采用List<String>的规则名称。 -
@280Z28:你陈述了一个真实的事实。使用解析器参数调用
toStringTree会导致实现获取规则列表(recog.getRuleNames())并将其传递给采用List的toStringTree。无论如何,这仍然没有解释如何在编写访问者时获取行号/偏移信息。
标签: pretty-print antlr4 abstract-syntax-tree