【eclipse高效開發】——ASTView節點詳解

一、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)的通用協議接口,從編譯器的角度給出了程序結構的完整視圖


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章