Eclipse JDT--ASTParser介绍

    技术2025-11-04  5

    要解析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 blog---转载请注明)

    最新回复(0)