【eclipse高效开发】——ASTView节点详解

来源:互联网 发布:什么软件收二手手机 编辑:程序博客网 时间:2024/06/01 10:25

一、AstView 的AST节点类型

目的:了解节点类型,之后才能理解AST操作。才能准确的对特定的节点进行操作。

 

ASTView主要包括三部分:AST nodes、node properties、bindings。

ASTView整体结构为:


ASTVieweclipse中的视图(CompilationUnit根节点未显示):

(注:

ASTView中节点后中括号内的内容表示该节点资源的范围,意为当前节点之前的字符总数+当前节点包含字符数(包含空格),如FieldDeclaration [2295+40]表示fieldDeclaration节点有40字符,该节点之前有2295字符。字母空格中文均算一个字符。

属性后圆括号内的数字表示该抽象节点下有多少个该子类型的节点,如TYPES (2)表示该属性下有两个TypeDeclaration节点。

节点在ASTView中显示为灰色字体,AST节点的孩子节点为该AST节点的属性,属性名的字母均大写。)

部分节点在ASTView中可嵌套使用,如body下有statement,statement下又有body,视具体情况而定。以下节点介绍基于JLS3。JLS2不支持泛型。

1. AST nodes(AST节点)

节点按代码功能可分为注释节点,注解节点,逻辑程序节点

CompilationUnitJava编译单元,是整个源文件,即一个Java文件或class文件,包括前导和尾随空格和注释。它是所有AST节点的根节点。

PackageDeclaration:对应编译单元包声明部分(包括包前的注释注解等)。

ImportDeclaration:对应编译单元import部分。

TypeDeclaration:每个类或接口类型的声明为一个TypeDeclaration节点,包括注释文档。同一编译单元可以有多个类声明。

BodyDeclaration:类的主体,即类大括号中的内容(不包括大括号本身)。

Block:块,在type中的每个大括号的内容为一个块(包括大括号本身)。

MethodDeclaration:方法,包括方法声明和方法体定义。

SingleVariableDeclaration:方法的参数列表,单形参的变量声明,如FileNotFoundException  e”。

FieldDeclaration:属性声明语句

TypeDeclarationStatement:在类内部将一个类声明包装到一个语句块里,如“{class hh{}}”,此处的“class hh{}”是一个TypeDeclarationStatement节点。

VariableDeclarationStatement:局部变量声明语句。

VariableDeclarationFragment:全局属性或局部变量声明的片段,类型之后的变量名以及初始化部分。

VariableDeclarationExpression:变量声明表达式,如forint i=0;;)循环中的“int i=0”。区别于方法中的变量声明语句VariableDeclarationStatement

EnhancedForStatement for-each语句。

IfStatementif语句

ExpressionStatement:表达式语句,执行某操作。如标准输出语句,方法调用等。

ReturnStatement return语句。

BreakStatementbreak语句

WhileStatementwhile语句

TryStatementtry语句,包括try(或try-with-resources)块catch块和finally

ThrowStatement:抛出异常语句

MethodInvocation :方法调用节点

SuperMethodInvocation:调用父类方法

SwitchStatementswitch语句

SwitchCasecase字句或default字句,不包含该字句后的内容,如“case 1:”或“default:”。

SynchronizedStatement:同步控制语句,如synchronized ( new String() ){ }

ThisExpression:返回类的引用或在构造器中调用另一个构造函数。

TypeParameter:参数化类型的类型参数,如List<T>中的参数T

WildcardType:通配符类型,如List<?>的“?”

UnionType:联合类型(C/C++中特有)

 

AnnotationTypeDeclaration:注解类型节点

AnnotationTypeMemberDeclaration:注解类型节点的成员声明节点,如抽象方法或默认方法。

AnonymousClassDeclaration:内部类声明节点。包括枚举的内部类实现。

ArrayCreation:数组初始化部分的节点。如new int[2]new int[]{1,2}。(整个数组创建语句“int array[]=new int[]{1,2};”是一个VariableDeclarationStatement节点)

ArrayInitializer:数组初始化的赋值部分。如{1,2}

ArrayAccess:访问数组的节点,如访问索引值为0的数组值:array[0]

ArrayType:数组类型节点,如“int[]  array;”的int[]部分,这与int array[]是有区别的。后者的类型为PrimitiveTypeint型)。

AssertStatement:断言语句(形如:assert Expression [ : Expression ] ;)。assert不常用,一般用于测试。IDE工具默认关闭断言检查功能,即assert在运行时不会生效。

Assignment:赋值语句,如“i=1

BooleanLiteral:布尔值(true/false)。

CharacterLiteral:字符常量值,如‘char

StringLiteral:字符串常量值,如“String

NumberLiteral:数字常量值,包括intdoublefloatlong等类型的值

TypeLiteral:类型常量

CastExpression:强制类型转换子句,如(int) 11.0

CatchClausecatch

ClassInstanceCreation:类实例化的new部分,如“new DemoClass()

ConditionalExpression:条件从句。如“true1:0

ConstructorInvocation:构造器调用,在构造方法中出现。如“this();

SuperConstructorInvocation:父类构造器调用

ContinueStatementcontinue语句

DoStatementdo-while循环语句,如“do{}while(i==0);

EmptyStatement:只有一个结束符号的空语句,即“;

EnumConstantDeclaration:枚举常量,包含常量前的文档注释

EnumDeclaration:枚举类型声明节点,包含Javadoc

FieldAccess:一般变量访问语句

SuperFieldAccess:使用关键词super访问父类变量语句

InfixExpression:判断表达式,返回布尔值

InitializerAST节点类型,形如:[ static ] Block。区别“static int i;”和“static {int i;}”,前者是FieldDeclaration,后者是Initializer

InstanceofExpressioninstanceof语句

LabeledStatement:标记语句,用于循环中,如“label:for(;;){for(;;){break label;}}

Modifier:修饰词节点,包括publicprotectedprivatestaticabstractfinalnativesynchronizedtransientvolatilestrictfp

ParameterizedType:参数化类型(泛型)节点

PrimitiveType:原始类型节点,8Java原始类型加上void类型

ParenthesizedExpression:括号表达式,形如:( Expression )

PrefixExpression :前缀表达式, 如++i;

PostfixExpression:后缀表达式,如i++;

QualifiedName:完整名,QualifiedName中每一个名为一个独立的SimpleName

SimpleName:直接名,simplequalified的区别:前者只是给出了最后的一项命名,后者给出了完整的命名,如java.io.IOExceptionQualifiedName,IOExceptionSimpleName。类比于相对路径与绝对路径的区别。

*QualifiedType

    Type . SimpleName

如类型 "A.B" 可以有两种方式表示:

QualifiedType(SimpleType(SimpleName("A")),SimpleName("B"))

SimpleType(QualifiedName(SimpleName("A"),SimpleName("B")))

ASTView中一般以第二种方式表示。

SimpleType:直接类型,如List<String>中的“List”和“String”分别是一个SimpleType节点。java.lang.String也为SimpleType

 

 

MarkerAnnotation:标记注解,如@Controller功能同NormalAnnotation@Controller()

NormalAnnotation:标记注解,如@Controller()

SingleMemberAnnotation:单值注解,如@Controller(String),作用同NormalAnnotation@Controller(value=”string”)

MemberValuePair:注解中的赋值对,如@Controller(value="string")中的“value="string"”。

 

 

BlockComment:块注释。/* */

LineComment:行注释。//

Javadoc:注释文档。

MemberRefJavadoc中成员引用,如

/**

 * @see  #i

 * @see #print(int)

 */

中的#i”,其中i是类的成员属性,print(int i)为成员方法。常用的标记有@see@link

MethodRefJavadoc中方法引用。类似于MemberRef。如例@see #print(int)中的“#print(int)”。

MethodRefParameterJavadoc中引用方法的参数类型。如例@see #print(int)中的“int”。

TextElementJavadoc中的的文本内容,包含标记名与标记内容之间的空格,不包括注释结束符“/** * */

TagElement:包括标记名和标记内容。如@author  leiy。标记内容可以是:TextElementNameMethodRefMemberRef,也可以嵌套一个{TagElement}

 

2. The node properties(节点的属性)
每个AST node都有相应的节点属性,有的属性在ASTView中不显示。

 

编译单元的属性:PACKAGEIMPORTSTYPES(对应编译单元中除了PACKAGEIMPORTS部分的全部内容)、EnumDeclarationAnnotationTypeDeclaration

TypeDeclaration节点属性:JAVADOCMODIFIERSINTERFACENAMETYPE_PARAMETERSSUPERCLASS_TYPESUPER_INTERFACE_TYPESBODY_DECLARATIONS

FieldDeclaration节点属性:TYPEFRAGMENTSMODIFIERSJAVADOC

MethodDeclaration节点属性:JAVADOCMODIFIERSCONSTRUCTORTYPE_PARAMETERSRETURN_TYPE2NAMERECEIVER_TYPERECEIVER_QUALIFIERPARAMETERSEXTRA_DIMENSIONS2THROWN_EXCEPTION_TYPESBODY

 

BODY:方法的主体,即方法大括号中的内容(包括大括号本身)。

STATEMENTS:方法体中STATEMENTS会从第一个非注释行开始,忽略之前的注释,但包含之后的注释。

EXPRESSION:表达式,可以为一个变量或赋值或比较句子。

THEN_STATEMENTif语句的then处理块

ELSE_STATEMENTif语句的else处理块

ARGUMENTS:方法的实参

3. Bindings(绑定)

ASTView中,无论是方法定义还是方法调用,method binding是相同的;

包括了Java语言的命名实体,给出了不同命名实体(packagestypesfieldsmethodsconstructorsand local variables)的通用协议接口,从编译器的角度给出了程序结构的完整视图


0 0