一、AstView 的AST節點類型
目的:瞭解節點類型,之後才能理解AST操作。才能準確的對特定的節點進行操作。
ASTView主要包括三部分:AST nodes、node properties、bindings。
ASTView整體結構爲:
ASTView在eclipse中的視圖(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節點)
節點按代碼功能可分爲註釋節點,註解節點,邏輯程序節點
CompilationUnit:Java編譯單元,是整個源文件,即一個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:變量聲明表達式,如for(int i=0;;)循環中的“int i=0”。區別於方法中的變量聲明語句VariableDeclarationStatement
EnhancedForStatement :for-each語句。
IfStatement:if語句
ExpressionStatement:表達式語句,執行某操作。如標準輸出語句,方法調用等。
ReturnStatement :return語句。
BreakStatement:break語句
WhileStatement:while語句
TryStatement:try語句,包括try(或try-with-resources)塊catch塊和finally塊
ThrowStatement:拋出異常語句
MethodInvocation :方法調用節點
SuperMethodInvocation:調用父類方法
SwitchStatement:switch語句
SwitchCase:case字句或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[]是有區別的。後者的類型爲PrimitiveType(int型)。
AssertStatement:斷言語句(形如:assert Expression [ : Expression ] ;)。assert不常用,一般用於測試。IDE工具默認關閉斷言檢查功能,即assert在運行時不會生效。
Assignment:賦值語句,如“i=1”
BooleanLiteral:布爾值(true/false)。
CharacterLiteral:字符常量值,如‘char’
StringLiteral:字符串常量值,如“String”
NumberLiteral:數字常量值,包括int、double、float、long等類型的值
TypeLiteral:類型常量
CastExpression:強制類型轉換子句,如(int) 11.0
CatchClause:catch塊
ClassInstanceCreation:類實例化的new部分,如“new DemoClass()”
ConditionalExpression:條件從句。如“true?1:0”
ConstructorInvocation:構造器調用,在構造方法中出現。如“this();”
SuperConstructorInvocation:父類構造器調用
ContinueStatement:continue語句
DoStatement:do-while循環語句,如“do{}while(i==0);”
EmptyStatement:只有一個結束符號的空語句,即“ ; ”
EnumConstantDeclaration:枚舉常量,包含常量前的文檔註釋
EnumDeclaration:枚舉類型聲明節點,包含Javadoc
FieldAccess:一般變量訪問語句
SuperFieldAccess:使用關鍵詞super訪問父類變量語句
InfixExpression:判斷表達式,返回布爾值
Initializer: AST節點類型,形如:[ static ] Block。區別“static int i;”和“static {int i;}”,前者是FieldDeclaration,後者是Initializer
InstanceofExpression:instanceof 語句
LabeledStatement:標記語句,用於循環中,如“label:for(;;){for(;;){break label;}}”
Modifier:修飾詞節點,包括public、protected、private、static、abstract、final、native、synchronized、transient、volatile、strictfp
ParameterizedType:參數化類型(泛型)節點
PrimitiveType:原始類型節點,8種Java原始類型加上void類型
ParenthesizedExpression:括號表達式,形如:( Expression )
PrefixExpression :前綴表達式, 如++i;
PostfixExpression:後綴表達式,如i++;
QualifiedName:完整名,QualifiedName中每一個名爲一個獨立的SimpleName
SimpleName:直接名,simple與qualified的區別:前者只是給出了最後的一項命名,後者給出了完整的命名,如java.io.IOException是QualifiedName,而IOException爲SimpleName。類比於相對路徑與絕對路徑的區別。
*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:註釋文檔。
MemberRef:Javadoc中成員引用,如
/**
* @see #i
* @see #print(int)
*/
中的“#i”,其中i是類的成員屬性,print(int i)爲成員方法。常用的標記有@see、@link。
MethodRef:Javadoc中方法引用。類似於MemberRef。如例@see #print(int)中的“#print(int)”。
MethodRefParameter:Javadoc中引用方法的參數類型。如例@see #print(int)中的“int”。
TextElement:Javadoc中的的文本內容,包含標記名與標記內容之間的空格,不包括註釋結束符“/** * */”
TagElement:包括標記名和標記內容。如@author leiy。標記內容可以是:TextElement、Name、MethodRef、MemberRef,也可以嵌套一個{TagElement}。
編譯單元的屬性:PACKAGE、IMPORTS、TYPES(對應編譯單元中除了PACKAGE和IMPORTS部分的全部內容)、EnumDeclaration、AnnotationTypeDeclaration 。
TypeDeclaration節點屬性:JAVADOC、MODIFIERS、INTERFACE、NAME、TYPE_PARAMETERS、SUPERCLASS_TYPE、SUPER_INTERFACE_TYPES、BODY_DECLARATIONS等
FieldDeclaration節點屬性:TYPE、FRAGMENTS、MODIFIERS、JAVADOC等
MethodDeclaration節點屬性:JAVADOC、MODIFIERS、CONSTRUCTOR、TYPE_PARAMETERS、RETURN_TYPE2、NAME、RECEIVER_TYPE、RECEIVER_QUALIFIER、PARAMETERS、EXTRA_DIMENSIONS2、THROWN_EXCEPTION_TYPES、BODY。
BODY:方法的主體,即方法大括號中的內容(包括大括號本身)。
STATEMENTS:方法體中STATEMENTS會從第一個非註釋行開始,忽略之前的註釋,但包含之後的註釋。
EXPRESSION:表達式,可以爲一個變量或賦值或比較句子。
THEN_STATEMENT:if語句的then處理塊
ELSE_STATEMENT:if語句的else處理塊
ARGUMENTS:方法的實參
3. Bindings(綁定)
在ASTView中,無論是方法定義還是方法調用,method binding 是相同的;
包括了Java語言的命名實體,給出了不同命名實體(packages, types,fields,methods,constructors,and local variables)的通用協議接口,從編譯器的角度給出了程序結構的完整視圖