如何在ANTLR AST中访问隐藏的令牌?

时间:2012-10-17 13:43:55

标签: antlr antlr3

我正在尝试用Java编写一个手动树步行器,用于ANTLR V3生成的AST。 AST使用岛语法构建,类似于ANTLR: call a rule from a different grammar中指定的格式。

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

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

1 个答案:

答案 0 :(得分:1)

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

我已经使用令牌列表将隐藏的令牌(例如注释和显式行号(想想FORTRAN))与最近的可见令牌相关联。这是在对AST进行后处理并查看可用于列表中的令牌和AST中的节点的行,列和char-index信息之后完成的。

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