解析EclipseJDTJava解析器中是否存在任何类型的“行访问者”?如果没有,是否有人知道一个好的解决方法?
我想从Java文件访问AST中的节点,并提取一些与这些节点相关的信息。但是,我想通过源代码文件中的行引导的AST。我知道有与每个节点相关联的行的信息,但问题是访问节点的默认方式是通过特定的访问者。所以:1。为了避免对节点的冗余访问,2。不要在尝试枚举所有可能的节点类型(或访问者)时生成开销,以及3。为了以有序的方式访问节点中的信息,我需要一种“行访问者”,这样我就可以按照源代码文件中的行访问AST节点中的信息。有人知道用EclipseJDTAPI或者甚至是解决方法来实现这一点的标准方法吗
# 1 楼答案
我不能直接从Eclipse AST的知识来说话。然而,如果这些是传统的AST,那么在没有任何其他帮助的情况下,访问树节点的方式基本上就是遍历树
当然,您可能可以通过某种类型的文件位置信息(行、列等)来过滤AST节点Eclipse与这样的节点相关联,只需过滤标有所需行的AST。除非你真的,真的关心这需要多长时间(最糟糕的情况是文件大小呈线性,我在其他系统中的经验表明,每个源代码行平均有5-7个节点),否则这就足够满足你的需要了
如果您想直接访问与特定行号关联的树节点,我猜您运气不好。显然,你可以通过遍历一次树并收集所有具有特定行号的节点来构建这样一个地图;然后你就可以得到你想要的权限了。[你真的只需要将一行的第一个AST关联起来{有序树行走中最左边的部分),这个地图就可以使用了] 同样地,构建此列表的树行走是线性时间,您只需支付一次。 FWIW,我已经构建了处理AST的工具~~ 30年了,还没有发现它特别有用
如果您坚持,并且希望降低构建此地图的成本,我会查看解析机制内部,并对其进行修改以完成这项工作。它制造所有这些AST节点,并且在制造此类节点时知道正在处理的源的行号。生成AST节点时,应该很容易构建映射。如果你的解析器很好,它实际上是线性时间,添加这项工作不会改变线性