1

我正在尝试用 Java 为 ANTLR V3 生成的 AST 编写手动树遍历器。AST 是使用岛语法构建的,类似于ANTLR 中指定的语法:从不同的语法中调用规则

在 AST 中,我有一个表达式列表节点,每个表达式都作为子节点。现在我需要知道分隔表达式的逗号的行号。COMMA 存在于解析中,但在 AST 重写期间被删除。

我看到一些资源(此处此处)指向 CommonTokenStream.getTokens 的使用,但我不确定如何在处理 AST 时访问 CommonTokenStream。无论如何我可以获得用于构建 AST 的 CommonTokenStream 吗?

4

1 回答 1

1

可以通过 访问完整的令牌列表CommonTokenStream.getTokens(),您可以在调用 tree walker 之前调用它。令牌列表将是 walker 的参数。无需更改 CommonTree,除非您希望将恢复的信息嵌入树中。

我已经使用标记列表将隐藏标记(例如注释和显式行号(想想 FORTRAN))与最近的可见标记相关联。这是在对 AST 进行后处理并查看可用于列表中的标记和 AST 中的节点的行、列和字符索引信息时完成的。

我在 AST 构建期间尝试这样做的尝试导致了 hacky、不可维护的代码。后处理代码 OTOH 是 Programming-101 算法。

于 2012-11-12T04:41:30.293 回答