抽象语法树AST(Abstract Syntax Tree)是对程序代码的结构化表示,是对代码进行词法分析、语法分析后得到的产物。可以通过维基百科https://en.wikipedia.org/wiki/Abstract_syntax_tree了解具体的概念。
Eclipse作为开源的Java IDE就提供了一个库来帮助我们达到将Java源代码结构化为AST目的,它的名字是JDT(Java Development Tools)。Eclipse JDT的ASTParser类则具体实现这种解析。
另外,对于一颗抽象语法树,JDT引入了binding的概念,即定义了一个IBinding接口,一个binding代表了一个Java语言的命名实体,用于从编译器的角度来描绘程序结构,实体从不同的类型可分为packages, types, fields, methods, constructors, and local variables。在Eclipse JDT ASTParser进行AST解析过程中,如果开启了ResolveBindings功能,编译器便将为它所创建出的每一个AST叶子节点提供所分解的binding信息。
对于分解得到的binding信息,可以使得你所结构化出的AST更加细节化,其更加倾向于语义层次的分析,尤其是实现诸如IDE编辑器中的一些代码编写的问题警报的识别。
Eclipse的插件ASTView(http://www.eclipse.org/jdt/ui/astview/index.php)实际上是一个对AST的全面实现:
所结构化的代码参考如下:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
public class FileHelper {
public static String getFileContent(String file){
BufferedReader reader = null;
//测试AST
StringBuffer sb = new StringBuffer();
int a;
try {
String line = null;
reader = new BufferedReader(new FileReader(file));
while ((line=reader.readLine()) != null) {
sb.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {