【问题标题】:How to generate AST from Java source-code? [closed]如何从 Java 源代码生成 AST? [关闭]
【发布时间】:2009-12-28 04:38:40
【问题描述】:

据我所知,将 Java 源代码解析为 AST(抽象语法树)的唯一方法是使用 Java Compiler Tree API: com.sun.source.tree

我有两个问题:

  1. 哪些 JDK 支持 com.sun.source.tree?
  2. 是否有适用于所有 JDK 的便携式替代品?

【问题讨论】:

  • 如果我没记错的话,Eclipse 使用不同版本的 Java 模型和自己的解析器,并且可能有一种方法可以将其重用于一般解析。
  • 第一个问题中的“支持”是什么意思?您是否在询问哪些供应商的 Java 版本包含 com.sun.source.tree 包?我想只有Sun's这样做。如果你想用另一个 JDK(比如 IBM 的)解析源代码,那么可能需要一个独立的解析器库。
  • @Brett,我知道 com.sun.source.tree 只在 JDK6 中引入。我想知道是否所有非 Sun JDK 都支持这个 API。
  • com.sun 不可移植。它可能存在于其他 JDK 中,但不要指望它。

标签: java parsing compiler-construction


【解决方案1】:

关于您的第二个问题,除了 Sun 的解析器之外,还有许多可用的 Java 解析器。这是一个小样本:

  • Eclipse 的org.eclipse.jdt.core.dom 包。
  • Spoon 输出一个非常漂亮的带注释的解析树,带有类型信息和变量绑定(并在内部使用 Eclipse 的解析器)
  • ANTLR 是解析器生成器,但有可用的 Java 语法
  • javaparser(我没用过)

我最好的建议是尝试每种方法,看看哪种方法最适合您的需求。

【讨论】:

  • Eclipse的jdt DOM和Spoon有什么区别?
  • 实际的 AST 类大致类似,但 Spoon 的解析树包含变量绑定等语义信息,而不需要运行大量的 IDE 基础架构。只需将一个 jar 文件添加到类路径即可解析和分析 Java 文件。
【解决方案2】:

您可以获取 tools.jar 并使用它。 javac is open source 这样您就可以获取该代码(假设您可以处理许可证)。 Antlr 也有 Java 语法。

【讨论】:

  • 重新分发 tools.jar:好点! OpenJDK 的类路径异常是一个很好的许可证。
  • google-java-format 使用 com.google.errorprone:javac-shaded 获取 AST。 javac-shaded 本身嵌入了 OpenJDK 解析器。示例可以在JavaInputAstVisitor.java 以 google-java-format 找到。
【解决方案3】:

我使用过 Eclipse 的 AST 解析器。我发现它非常好(它是 Eclipse 插件的一部分,所以使用它确实很有意义)。见Exploring Eclipse's ASTParser

【讨论】:

    【解决方案4】:

    一个工作的、简单易用的 Java 解析器是...JavaParser。该项目已经活跃了几年。虽然它最初托管在 Google 代码上,但现在可以在 GitHub 上找到:https://github.com/javaparser/javaparser

    使用起来非常简单,依赖的数量很少。它也可以在 Maven 上使用。

    它已经使用了几年,所以它工作得很好,并且还允许解析 cmets、更改 AST 并重新生成代码。

    【讨论】:

    • 感谢您更新该项目的链接(它已在几个月前被移动,同时我成为该项目的贡献者:D)
    【解决方案5】:

    我刚刚遇到Jexast,这是从JDT's ASTParserwork independent of Eclipse 的提取(取决于org.eclipse.jdt.internal.compiler.**)。

    我还没有尝试过,但看起来确实很有趣。

    【讨论】:

      【解决方案6】:

      这不是唯一的方法。

      查看我们的 Java Front End,它是在DMS Software Reengineering Toolkit 之上构建的全功能Java 解析器。它解析 Java,并将 AST 构建为内部数据结构。

      DMS 的意义在于它提供了大量的附加有用机制(属性语法、符号表、流分析、包括访问和更新的 AST 操作,以及源到源转换)以分析该 AST 并将其转换为结果和/或修改后的源代码。如果你得到“只是”一个 Java 解析器(例如,JavaCC + Java 语法),恕我直言,你将无法用它做很多事情。 DMS 可以做很多事情,而无需自己发明所有额外的机器。

      如果你真的不想使用 DMS 提供的额外机器,它会dump the tree as XML

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 2011-03-24
        相关资源
        最近更新 更多