要解析Java源码,首先要建立ASTParser的实例。此过程最重要的一点是,你要告诉parser需要解析的内容类型。ASTParser支持对以下四种内容的解析:
1. K_COMPILATION_UNIT: 一个编译单元,一般就是完整的Java文件
2. K_STATEMENTS: Java statements,比如赋值语句,或是if语句块,while语句块等。此类型不需要文件是完整的编译单元,但需要是完整的statements。比如if语句块要作为一个完整的statement输入,否则会报错。
3. K_EXPRESSION: Java expressions
4. K_CLASS_BODY_DECLARATIONS: Java class里的元素
以下的例子以K_COMPILATION_UNIT为例创建ASTParser,也就是解析一个完整的Java文件。
// Initialize ASTParser ASTParser parser = ASTParser.newParser(AST.JLS3); //initialize parser.setKind(ASTParser.K_COMPILATION_UNIT); //to parse compilation unit parser.setSource(content.toCharArray()); //content is a string which stores the java source parser.setResolveBindings(true); CompilationUnit result = (CompilationUnit) parser.createAST(null);
其中,变量content是一个字符串,储存了读入的java源文件内容。最后一行,parser.createAST方法返回了一个ASTNode类。ASTNode是语法树各节点的抽象基类,它的子类分别代表各种类型的节点比如CompilationUnit, Statement, Expression, Comment, PackageDeclaration等等。具体参见
http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/WhileStatement.html。
这里,我们将其转换成CompilationUnit类。
其实以上这四种类型是存在层次关系的:一个完整的编译单元包括imported packages, class。Class里又包括field和methods,而method又可以被分成一系列statements。也就是说,一个完整的java文件被分成几个基本部分,每个部分又可以继续往下分。
比如说,Statement的子类包括IfStatement, WhileStatement, ExpressionStatement等等。IfStatment类提供getElseStatement, getThenStatment,还有提取if条件等各种方法。像是ExpressionStatement类,支持通过getExpression方法得到源文件对应的Expression,而Expression类则包括如Assignment, MethodInvocation,ArrayCreation种种类型。
关于Statement的类层次结构和各类的方法可以参见:
http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/WhileStatement.html
至此,利用createAST,java的源文件已经被解析成AST并且储存于Compilation的实例result中了。我会在下一篇文章介绍一些使用AST的具体操作。
(From my CSDN blog---转载请注明)