Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问ANTLR AST中的隐藏令牌?_Antlr_Antlr3 - Fatal编程技术网

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

如何访问ANTLR AST中的隐藏令牌?,antlr,antlr3,Antlr,Antlr3,我正试图用Java为ANTLR V3生成的AST编写一个手动树遍历器。AST是使用类似于中指定的岛语法构建的 在AST中,我有一个表达式列表的节点,每个表达式都是子节点。现在我需要知道分隔表达式的逗号行号。逗号出现在解析中,但在AST重写过程中被删除 我看到一些资源(和)指向CommonTokenStream.getTokens的用法,但我不确定在处理AST时如何访问CommonTokenStream。我是否可以获取用于构建AST的CommonTokenStream?可以通过CommonToke

我正试图用Java为ANTLR V3生成的AST编写一个手动树遍历器。AST是使用类似于中指定的岛语法构建的

在AST中,我有一个表达式列表的节点,每个表达式都是子节点。现在我需要知道分隔表达式的逗号行号。逗号出现在解析中,但在AST重写过程中被删除


我看到一些资源(和)指向CommonTokenStream.getTokens的用法,但我不确定在处理AST时如何访问CommonTokenStream。我是否可以获取用于构建AST的CommonTokenStream?

可以通过
CommonTokenStream.getTokens()
访问令牌的完整列表,您可以在调用树行者之前调用该列表。令牌列表将成为walker的一个参数。不需要更改CommonTree,除非您希望恢复的信息嵌入到树中

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


我试图在AST构建过程中实现这一点,结果导致代码变得粗糙,无法维护。后处理代码OTOH是编程-101算法。

可以通过
CommonTokenStream.getTokens()
访问令牌的完整列表,您可以在调用树行者之前调用该列表。令牌列表将成为walker的一个参数。不需要更改CommonTree,除非您希望恢复的信息嵌入到树中

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


我试图在AST构建过程中实现这一点,结果导致代码变得粗糙,无法维护。后处理代码OTOH是编程-101算法。

1“一些资源”有点模糊:你能指出实际资源(参考/链接)吗?2) 如果在解析过程中从AST中删除标记,那么这些标记(显然)在树遍历器中不可用。如果您需要树漫游器中的
逗号
信息,请将其包括在内。谢谢Bart。我已经编辑了这篇文章以包含链接。只是想知道是否有一种方法可以访问树节点之间的所有令牌,因为节点具有
getTokenStartIndex()
getTokenStopIndex()
,而不会使AST与
逗号
令牌混淆。或者我需要扩展CommonTree以包含源令牌流吗?您所指的第一个链接是关于访问在词法分析阶段被丢弃(或者更好:隐藏)的令牌。这不是您要做的:lexer不会隐藏您的逗号标记(您在解析器规则中省略了它们)。但是,看起来它可以帮你解决这个问题。是的,巴特,但是当我在编写一个手动树遍历器(用java,而不是ANTLR树解析器)时,看起来我需要扩展CommonTree来保存TokenStream对象,并将其设置在解析阶段,然后可以在遍历器中访问。1)“一些资源”有点模糊:你能指出实际的资源(参考/链接)吗?2) 如果在解析过程中从AST中删除标记,那么这些标记(显然)在树遍历器中不可用。如果您需要树漫游器中的
逗号
信息,请将其包括在内。谢谢Bart。我已经编辑了这篇文章以包含链接。只是想知道是否有一种方法可以访问树节点之间的所有令牌,因为节点具有
getTokenStartIndex()
getTokenStopIndex()
,而不会使AST与
逗号
令牌混淆。或者我需要扩展CommonTree以包含源令牌流吗?您所指的第一个链接是关于访问在词法分析阶段被丢弃(或者更好:隐藏)的令牌。这不是您要做的:lexer不会隐藏您的逗号标记(您在解析器规则中省略了它们)。但是,看起来它可以帮你解决这个问题。是的,巴特,但是当我在编写一个手动树遍历器(在java中,而不是在ANTLR树解析器中)时,看起来我需要扩展CommonTree来保存TokenStream对象,并将其设置在解析阶段,然后可以在遍历器中访问它。