如何从Java源代码生成AST?

时间:2009-12-28 04:38:40

标签: java parsing compiler-construction

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

我有两个问题:

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

6 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:7)

您可以使用tools.jar并使用它。 javac is open source所以你可以抓住那些代码(假设你可以处理许可证)。 Antlr也有Java语法。

答案 2 :(得分:7)

我使用过Eclipse的AST解析器。我发现它非常好(它是Eclipse插件的一部分,因此使用它确实有意义)。请参阅Exploring Eclipse's ASTParser

答案 3 :(得分:3)

使用简单易用的Java Parser是...... JavaParser。该项目已经活跃了多年。虽然它最初托管在Google代码上,但现在可以在GitHub上使用:https://github.com/javaparser/javaparser

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

它已经使用了几年,所以它运行得很好并允许解析注释,更改AST并重新生成代码。

答案 4 :(得分:1)

这不是唯一的方法。

请参阅我们的 Java Front End,这是一个基于DMS Software Reengineering Toolkit构建的全功能Java解析器。它解析Java,并将AST构建为内部数据结构。

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

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

答案 5 :(得分:1)

我刚刚遇到Jexast,将JDT's ASTParser提取为work independent of Eclipse(取决于org.eclipse.jdt.internal.compiler.**)。

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