java - Eclipse JDT Java Parser 中是否有任何类型的 "line visitor"?如果没有,有人知道一个好的解决方法吗?

标签 java parsing eclipse-jdt tree-traversal visitor-pattern

我想从 Java 文件访问 AST 中的节点并提取与这些节点相关的一些信息。但是,我想通过源代码文件中的行引导的 AST。我知道有关于与每个节点关联的线路的信息,但问题是访问节点的默认方式是通过特定访问者。所以:1. 为了避免对节点的冗余访问,2. 在尝试枚举所有可能的节点类型(或访问者)时不要产生开销,以及 3. 为了以有序的方式访问节点中的信息,我需要一种“Line Visitor”,这样我就可以按照源代码文件中的行访问 AST 节点中的信息。有人知道使用 Eclipse JDT API 或什至是解决方法的标准方法吗?

最佳答案

我无法根据 Eclipse AST 的直接知识来说话。然而,就这些简单地用 Java 表示的传统 AST 而言,在没有任何其他帮助的情况下,访问树节点的方式几乎就是遍历树。 p>

当然,您可能可以通过 Eclipse 与此类节点关联的某种类型的文件位置信息(行、列...)来过滤 AST 节点,并简单地过滤标记有您想要的行的 AST。除非你真的非常关心这需要多长时间(最坏的情况是文件大小呈线性关系,我在其他系统上的经验表明你平均每个源代码行得到 ~5-7 个节点),这应该足以满足你的目的。

如果您想直接访问与特定行号关联的树节点,我猜您运气不好。显然,您可以通过遍历树一次并收集具有特定行号的所有节点来自己构建这样的 map ;那么您就可以获得所需的访问权限。 [你真的只需要关联一行的 first AST 就可以使用这张 map ] 同样,构建此列表的树步行是线性时间,您只需支付一次。 FWIW,我构建处理 AST 的工具已有 ~~30 年,但并未发现它特别有用。

如果您坚持要降低构建此 map 的成本,我会查看解析机制并对其进行修改以完成这项工作。它制造所有这些 AST 节点,并且在制造这样的节点时它知道正在处理的源代码的行号。随着 AST 节点的生成,构建 map 应该很容易。如果您的解析器有任何好处,它实际上是线性时间,添加这项工作不会改变线性度。

关于java - Eclipse JDT Java Parser 中是否有任何类型的 "line visitor"?如果没有,有人知道一个好的解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51164508/

相关文章:

java - JVM 能够进行简单的递归调用预计算吗?

html - 使用Text.XML.Cursor获取特定的HTML表列

java - 有没有像这个Class.getObject(Hello.a,0)这样的函数?

java - 用 Java 处理数据库中的大列表

java编译类路径

parsing - 在 UNIX 中创建二进制文件

xml - 解析器与词法分析器和 XML

java - 安装的 JRE/JDK 未显示在 Eclipse Mars 的执行环境中

eclipse - 使用 UIMA,JDTsolveBinding() 始终返回 null

java - 将 Eclipse JDT Core 集成到新编辑器中