我正在尝试用Java语言为ANTLR生成的V3编写一个手动的树遍历器。AST是使用孤岛语法构建的,与ANTLR: call a rule from a different grammar中指定的语法相似。
在AST中,我有一个表达式列表的节点,每个表达式都是子节点。现在我需要知道分隔表达式的逗号的行号。逗号出现在解析过程中,但在AST重写过程中被删除。
我看到一些资源(here和here)指向CommonTokenStream.getTokens的用法,但我不确定如何在处理CommonTokenStream时访问AST。有没有什么方法可以让我用CommonTokenStream来构建AST呢?
发布于 2012-11-12 04:41:30
可以通过CommonTokenStream.getTokens()
访问令牌的完整列表,您可以在调用树遍历器之前调用它。令牌列表将是walker的一个参数。没有必要更改CommonTree,除非您希望将恢复的信息嵌入到树中。
我已经使用标记列表将注释和显式行号(想想FORTRAN)等隐藏标记与最近的可见标记关联起来。这是通过对AST进行后处理并查看行、列和字符索引信息来完成的,这些信息可用于列表中的标记和AST中的节点。
我在AST构建期间尝试这样做的尝试导致了粗糙的、不可维护的代码。后处理代码OTOH是编程-101算法。
https://stackoverflow.com/questions/12935757
复制