Java抽象语法树AST,JCTree 分析
JCTree简要分析
文章目录
JCTree简要分析
JCAnnotatedType
JCAnnotation
JCArrayAccess
JCArrayTypeTree
JCAssert
JCAssign
JCAssignOp
JCBinary
JCBlock
JCBreak
JCCase
JCCatch
JCClassDecl
JCCompilationUnit
JCConditional
JCContinue
JCDoWhileLoop
JCEnhancedForLoop
JCErroneous
JCExpression
JCExpressionStatement
JCFieldAccess
JCForloop
JCFunctionalExpression
JCIdent
JCIf
JCImport
JCinstanceOf
JCLabeledStatement
JCLambda
JCLiteral
JCMemberReference
JCMethodDecl
JCMethodinvocation
JCModifiers
JCNewArray
JCNewClass
JCParens
JCPrimitiveTypeTree
JCReturn
JCSkip
JCStatement
JCSWitch
JCSynchronized
JCThrow
JCTry
JCTypeApply
JCTypeCast
JCTypelntersection
unknown
JCTypeParameter
JCTypeUnion
JCUnary
JCVariableDecl
JCWhileLoop
JCWildcard
JCAnnotatedType
被注解的泛型:(注解的Target为ElementType.TYPE_USE时可注解泛型)
public static class A<T extends @Reality String> {
}
1
2
3
JCAnnotatedType @Reality() String
annotations (List<JCTree.JCAnnotation>) [0] = (JCAnnotation) @Reality()
underlyingType (JCExpression) = (JCIdent) String
protected JCAnnotatedType(List<JCTree.JCAnnotation> var1, JCTree.JCExpression var2) {
Assert.check(var1 != null && var1.nonEmpty());
this.annotations = var1;
this.underlyingType = var2;
}
1
2
3
4
5
JCAnnotation
注解:@annotationType(args) 例子:@Reality(callSuper = false)
JCAnnotation @Reality(callSuper = false)
annotationType (JCTree) = (JCIdent) Reality
args (List<JCExpression>) = callSuper = false
attribute (Compound) = @com.juno.annotations.Reality(callSuper=false)
protected JCAnnotation(JCTree.Tag var1, JCTree var2, List<JCTree.JCExpression> var3) {
this.tag = var1;
this.annotationType = var2;
this.args = var3;
}
1
2
3
4
5
JCArrayAccess
数组访问:a[0] = “123”
index (JCExpression) = 0 (JCLiteral)
indexed (JCExpression) = a (JCIdent)
protected JCArrayAccess(JCTree.JCExpression var1, JCTree.JCExpression var2) {
this.indexed = var1;
this.index = var2;
}
1
2
3
4
JCArrayTypeTree
数组类型:String[] a = new String[2] 中表达式的右边:
elemtype (JCExpression) = String (JCIdent)
二维数组:String[][] a = new String[1][2]解析为:
JCArrayTypeTree String[]
JCIdent String
protected JCArrayTypeTree(JCTree.JCExpression var1) {
this.elemtype = var1;
}
1
2
3
JCAssert
assert断言:assert cond : detail
protected JCAssert(JCTree.JCExpression var1, JCTree.JCExpression var2) {
this.cond = var1;
this.detail = var2;
}
1
2
3
4
JCAssign
赋值:lhs = rhs 例如 i = 1
protected JCAssign(JCTree.JCExpression var1, JCTree.JCExpression var2) {
this.lhs = var1; //左表达式
this.rhs = var2; //右表达式
}
1
2
3
4
JCAssignOp
赋值:lhs opcode rhs 例如 i += 1
protected JCAssignOp(JCTree.Tag var1, JCTree var2, JCTree var3, Symbol var4) {
this.opcode = var1;
this.lhs = (JCTree.JCExpression)var2;
this.rhs = (JCTree.JCExpression)var3;
this.operator = var4;
}
1
2
3
4
5
6
赋值符号opcode的可取值:
/** Assignment operators, of type Assignop.
*/
BITOR_ASG(BITOR), // |=
BITXOR_ASG(BITXOR), // ^=
BITAND_ASG(BITAND), // &=
SL_ASG(SL), // <<=
SR_ASG(SR), // >>=
USR_ASG(USR), // >>>=
PLUS_ASG(PLUS), // +=
MINUS_ASG(MINUS), // -=
MUL_ASG(MUL), // *=
DIV_ASG(DIV), // /=
MOD_ASG(MOD), // %=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
JCBinary
将语句分为二叉结构,例如double i = d + i * f 中第一个JCBinary为:
lhs = d
rhs = i * f
operator = null
opcode = PLUS
第二个JCBinary为:
lhs = i
rhs = f
operator = null
opcode = MUL
protected JCBinary(JCTree.Tag var1, JCTree.JCExpression var2, JCTree.JCExpression var3, Symbol var4) {
this.opcode = var1;
this.lhs = var2;
this.rhs = var3;
this.operator = var4;
}
1
2
3
4
5
6
二元运算符opcode的可取值:
/** Binary operators, of type Binary.
*/
OR, // ||
AND, // &&
BITOR, // |
BITXOR, // ^
BITAND, // &
EQ, // ==
NE, // !=
LT, // <
GT, // >
LE, // <=
GE, // >=
SL, // <<
SR, // >>
USR, // >>>
PLUS, // +
MINUS, // -
MUL, // *
DIV, // /
MOD, // %
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
JCBlock
语句块:{stats} 或 static{stats}(flags = 8L时)
protected JCBlock(long var1, List<JCTree.JCStatement> var3) {
this.stats = var3;
this.flags = var1;
}
1
2
3
4
JCBreak
break语句:break:label
label 为标签名
target 为跳转目标
protected JCBreak(Name var1, JCTree var2) {
this.label = var1;
this.target = var2;
}
1
2
3
4
JCCase
case语句:case pat : stats
protected JCCase(JCTree.JCExpression var1, List<JCTree.JCStatement> var2) {
this.pat = var1;
this.stats = var2;
}
1
2
3
4
JCCatch
catch捕捉异常:catch(param) body
param 定义异常变量 Exception e
body 代码块
protected JCCatch(JCTree.JCVariableDecl var1, JCTree.JCBlock var2) {
this.param = var1;
this.body = var2;
}
1
2
3
4
JCClassDecl
类的定义:
例子:
@Reality
public class MainActivity extends AppCompatActivity {
private int kk = 1;
static {
kk = 2;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mods (JCModifiers) = public
name (Name) = (NameImpl) MainActivity
extending (JCExpression) = (JCIdent) AppCompatActivity
implementing (JCExpression) 实现的接口
defs (List<JCTree>) :
defs(1) : JCMethodDecl
public <init>() {
super();
}
1
2
3
defs(2) : JCBlock
static {
kk = 2;
}
1
2
3
defs(3) : JCVariableDecl
private int kk = 1
1
defs(4) : JCMethodDecl
@Override()
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.text);
Random random = new Random();
}
1
2
3
4
5
6
7
sym (ClassSymbol) = com.juno.utils.MainActivity
protected JCClassDecl(JCTree.JCModifiers var1, Name var2, List<JCTree.JCTypeParameter> var3, JCTree.JCExpression var4, List<JCTree.JCExpression> var5, List<JCTree> var6, ClassSymbol var7) {
this.mods = var1;
this.name = var2;
this.typarams = var3;
this.extending = var4;
this.implementing = var5;
this.defs = var6;
this.sym = var7;
}
1
2
3
4
5
6
7
8
9
JCCompilationUnit
/**
* Everything in one source file is kept in a TopLevel structure.
* @param pid The tree representing the package clause.
* @param sourcefile The source file name.
* @param defs All definitions in this file (ClassDef,Import,and Ski
* @param packge The package it belongs to.
* @param namedImportScope A scope for all named imports.
* @param starImportScope A scope for all import-on-demands.
* @param linelMap Line starting positions,defined only if option-g is set.
* @param docComments A hashtable that stores all documentation comments indexed by the tree nodes they refer to.defined only if option-s is set.
* @param endPositions A hashtable that stores ending positions of source ranges indexed by the tree nodes they belong to. Defined only if option-Xjcov is set.
*/
public static class JCCompilationUnit extends JCTree implements CompilationUnitTre{
public List<JCAnnotation>packageAnnotations:
public JCExpression pid:
public List<JCTree>defs:
public JavaFileObject sourcefile:
public Package Symbol packge:
public ImportScope namedImportScope:
public StarImportScope starImportScope:
public long flags:
public Position.LinelMap linelMap=null:
public Map<JCTree,String>docComments=null:
public Map<JCTree,Integer>endPositions=null:
protected JCCompilationUnit(List<JCAnnotation>packageAnnotations,
JCExpression pid,
List<JCTree>defs,
JavaFileObject sourcefile,
Pack ageSymbol packge,
ImportScope namedImportScope,
Star ImportScope starImportScope){
this.packageAnnotations =packageAnnotations:
this.pid=pid:
this.defs=defs:
this.sourcefile=sourcefile:
this.packge=packge:
this.namedImportScope=namedImportScope:
this.starImportScope=starImportScope:
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
JCConditional
三目运算符:cond ? truepart : falsepart 例如 a ? 1 : 3
protected JCConditional(JCTree.JCExpression var1, JCTree.JCExpression var2, JCTree.JCExpression var3) {
this.cond = var1;
this.truepart = var2;
this.falsepart = var3;
}
1
2
3
4
5
JCContinue
continue跳过一次循环,与break相似:continue label
protected JCContinue(Name var1, JCTree var2) {
this.label = var1;
this.target = var2;
}
1
2
3
4
JCDoWhileLoop
do-while循环:do{body}while(cond)
protected JCDoWhileLoop(JCTree.JCStatement var1, JCTree.JCExpression var2) {
this.body = var1;
this.cond = var2;
}
1
2
3
4
JCEnhancedForLoop
增强循环:for(var : expr) body
例如:
for (String s : list) {
print(s);
}
1
2
3
JCVariableDecl String s 定义字符串变量s
JCIdent list 遍历的容器
JCBlock { print(s); } 遍历块
protected JCEnhancedForLoop(JCTree.JCVariableDecl var1, JCTree.JCExpression var2, JCTree.JCStatement var3) {
this.var = var1;
this.expr = var2;
this.body = var3;
}
1
2
3
4
5
JCErroneous
Error trees
JCExpression
表达式,赋值、调用方法等都算一个表达式,凡是继承JCExpression都算一个表达式
JCExpressionStatement
内部封装了JCExpression,实际上还是个表达式
protected JCExpressionStatement(JCTree.JCExpression var1) {
this.expr = var1;
}
1
2
3
JCFieldAccess
访问父类、其他类的方法、变量时:super.onCreate()
selected (JCIdent) = super
name (NameImpl) = onCreate
protected JCFieldAccess(JCTree.JCExpression var1, Name var2, Symbol var3) {
this.selected = var1;
this.name = var2;
this.sym = var3;
}
1
2
3
4
5
JCForloop
for循环:
for (init; cond; step) {body}(body为JCBlock)
for (init; cond; step) body(body为JCExpressionStatement)
protected JCForLoop(List<JCTree.JCStatement> var1, JCTree.JCExpression var2, List<JCTree.JCExpressionStatement> var3, JCTree.JCStatement var4) {
this.init = var1;
this.cond = var2;
this.step = var3;
this.body = var4;
}
1
2
3
4
5
6
JCFunctionalExpression
函数式表达式:lambda(JCLambda)和method reference(JCMemberReference)继承于JCFunctionalExpression
JCIdent
出现在表达式中的变量名、调用的方法名以及类名等,例子如下(按顺序):
Reality 类(注解)
AppCompatActivity 类
String 类
Override 类
Bundle 类
super super和this都是一个JcIdent
savedInstanceState 调用变量的名字
setContentView 方法
R 类
textView 调用变量的名字
findViewById 方法
R类
@Reality //JCIdent Reality ClassSymbol com.juno.annotations.Reality
//JCIdent AppCompatActivity ClassSymbol android.support.v7.app.AppCompatActivity
public class MainActivity extends AppCompatActivity {
//JCIdent String ClassSymbol java.lang.String
private static final String TAG = "MainActivity";
private int kk = 1;
@Override //JCIdent Override ClassSymbol java.lang.Override
//JCIdent Bundle ClassSymbol android.os.Bundle
protected void onCreate(Bundle savedInstanceState) {
//JCIdent super
//JCIdent savedInstanceState
super.onCreate(savedInstanceState);
//JCIdent setContentView
//JCIdent R
setContentView(R.layout.activity_main);
TextView textView;
//JCIdent textView
//JCIdent findViewById
//JCIdent R
textView = findViewById(R.id.text);
int i = 0;
int j = 1;
//JCIdent i
//JCIdent j
i = j * 3 + 2;
//JCIdent this
this.kk = 0;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
其中TextView textView;这一句是变量定义语句(JCVariableDecl),该语句的vartype属性实际上也是个JCIdent:
JCVariableDecl TextView textView
name (Name) = textView (NameImpl)
vartype (JCExpression) = TextView (JCIdent)
JCIf
if判断语句:if(condition) {thenpart} else {elsepart}
protected JCIf(JCTree.JCExpression var1, JCTree.JCStatement var2, JCTree.JCStatement var3) {
this.cond = var1;
this.thenpart = var2;
this.elsepart = var3;
}
1
2
3
4
5
JCImport
import语句:
import qulid
static (if staticImport) import qulid
protected JCImport(JCTree var1, boolean var2) {
this.qualid = var1;
this.staticImport = var2;
}
1
2
3
4
JCinstanceOf
instanceof语句:expr instanceof clazz,例如textView instanceof View:
JCInstanceOf textView instanceof View
clazz (JCTree) = (JCIdent) View
expr (JCExpression) = (JCIdent) textView
protected JCInstanceOf(JCTree.JCExpression var1, JCTree var2) {
this.expr = var1;
this.clazz = var2;
}
1
2
3
4
JCLabeledStatement
带有标签的语句:label : body
protected JCLabeledStatement(Name var1, JCTree.JCStatement var2) {
this.label = var1;
this.body = var2;
}
1
2
3
4
JCLambda
lambda表达式:此处表达式主体只有一句表达式
textView.setOnClickListener(v -> v.setVisibility(View.INVISIBLE));
1
JCLambda (v)->v.setVisibility(View.INVISIBLE) (表达式整体)
params (List<JCTree.JCVariableDecl>) = (List) /*missing*/ v (参数定义列表)
body (JCTree) = (JCMethodInvocation) v.setVisibility(View.INVISIBLE) (主体)
canCompleteNormally (Boolean) = true (未知)
paramKind (ParameterKind) = IMPLICIT (参数类型隐形/明确)
getBodyKind() (BodyKind) = EXPRESSION (主体是表达式还是块)
当主体变为语句块时:
textView.setOnClickListener(v -> {
v.setVisibility(View.VISIBLE);
});
1
2
3
body (JCTree) = (JCBlock) {v.setVisibility(View.VISIBLE);}
getBodyKind() (BodyKind) = STATEMENT
当参数v指明类型为View时:
textView.setOnClickListener((View v) -> v.setVisibility(View.INVISIBLE));
1
paramKind (ParameterKind) = IMPLICIT (参数类型明确)
JCLiteral
表示常量:int a = 1
typetag (TypeTag) = INT
value (Object) = (Integer) 1
protected JCLiteral(TypeTag var1, Object var2) {
this.typetag = var1;
this.value = var2;
}
1
2
3
4
typetag的可选值有:
INT : int
LONG : long
FLOAT : float
DOUBLE : double
CHAR : char
CLASS : String
BOT : null
1
2
3
4
5
6
7
JCMemberReference
lambda表达式中的方法引用:expr::name
例子:new B(“123”).setObjectUtil(ObjectUtil::new);
JCMemberReference ObjectUtil::new
mode (ReferenceMode) = NEW
name (Name) = (NameImpl)
expr (JCExpression) = (JCIdent) ObjectUtil
例子:new B(“123”).setObjectUtil(this::util);
JCMemberReference this::util
mode (ReferenceMode) = INVOKE
name (Name) = (NameImpl) util
expr (JCExpression) = (JCIdent) this
protected JCMemberReference(ReferenceMode var1, Name var2, JCTree.JCExpression var3, List<JCTree.JCExpression> var4) {
this.mode = var1;
this.name = var2;
this.expr = var3;
this.typeargs = var4;
}
1
2
3
4
5
6
JCMethodDecl
方法的定义:
例子:
@Reality
private static <T extends String> int print(@NonNull final String s) throws RuntimeException {
Log.e(TAG, s);
return 1;
}
1
2
3
4
5
mods (JCModifiers) = @Reality() private static
name (Name) = (NameImpl) print
restype (JCExpression) = (JCPrimitiveTypeTree) int
typarams (JCTypeParameter) = T extends String
recvparam = null
params (List<JCVariableDecl>) [0] = @NonNull() final String s
thrown (JCExpression) = (JCIdent) RuntimeException
body (JCBlock) = {
Log.e(TAG, s);
return 1;
}
defaultVaule (JCExpression) = null
sym (MethodSymbol) = print(java.lang.String)
例子:
@Reality
@interface B {
int value() default 1;
}
1
2
3
4
name (Name) = (NameImpl) value
restype (JCExpression) = (JCPrimitiveTypeTree) int
typarams (JCTypeParameter) 泛型列表为空
recvparam = null
params (List<JCVariableDecl>) 参数定义为空
thrown (JCExpression) 抛出列表为空
body (JCBlock) 方法体为空
defaultVaule (JCExpression) = (JCLiteral) 1
sym (MethodSymbol) = value()
protected JCMethodDecl(JCTree.JCModifiers var1, Name var2, JCTree.JCExpression var3, List<JCTree.JCTypeParameter> var4, JCTree.JCVariableDecl var5, List<JCTree.JCVariableDecl> var6, List<JCTree.JCExpression> var7, JCTree.JCBlock var8, JCTree.JCExpression var9, MethodSymbol var10) {
this.mods = var1;
this.name = var2;
this.restype = var3;
this.typarams = var4;
this.params = var6;
this.recvparam = var5;
this.thrown = var7;
this.body = var8;
this.defaultValue = var9;
this.sym = var10;
}
1
2
3
4
5
6
7
8
9
10
11
12
JCMethodinvocation
方法执行语句: meth(args)
例子:notNull(before)
meth (JCExpression) = (JCIdent) notNull
args (List<JCExpression>) = (JCIdent) before
例子:proxy.invoke(target, method, args)
meth (JCExpression) = (JCFieldAccess) proxy.invoke
args (List<JCExpression>) = (JCIdent) target, method, args
protected JCMethodInvocation(List<JCTree.JCExpression> var1, JCTree.JCExpression var2, List<JCTree.JCExpression> var3) {
this.typeargs = var1 == null ? List.nil() : var1;
this.meth = var2;
this.args = var3;
}
1
2
3
4
5
JCModifiers
类、变量、方法等的修饰符和注解:例如:
@Reality private static final String TAG = "MainActivity";
1
flags (long) = 26L (2L | 8L | 16L)
annotations (List<JCTree.JCAnnotation>) = @Reality()
protected JCModifiers(long var1, List<JCTree.JCAnnotation> var3) {
this.flags = var1;
this.annotations = var3;
}
1
2
3
4
flags的可取值:
1L : public
2L : private
4L : protected
8L : static
16L : final
32L : synchronized
64L : volatile
128L : transient
256L : native
1024L : abstract
2048L : strictfp
8589934592L : default
1
2
3
4
5
6
7
8
9
10
11
12
方法默认flags不为default,而是0L
JCNewArray
new数组:
例子:String[] s = new String[]{“123”,“456”};
JCNewArray new String[]{“123”, “456”}
elemtype (JCExpression) = (JCIdent) String
dims (List<JCTree.JCExpression>) 空
elems (List<JCTree.JCExpression>) [0] = (JCLiteral) “123”
elems (List<JCTree.JCExpression>) [1] = (JCLiteral) “456”
例子:B[][] b = new B[3][4];
JCNewArray new B[3][4]
elemtype (JCExpression) = (JCIdent) B
dims (List<JCTree.JCExpression>) [0] = (JCLiteral) 3
dims (List<JCTree.JCExpression>) [1] = (JCLiteral) 4
elems (List<JCTree.JCExpression>) 空
protected JCNewArray(JCTree.JCExpression var1, List<JCTree.JCExpression> var2, List<JCTree.JCExpression> var3) {
this.elemtype = var1;
this.dims = var2;
this.annotations = List.nil();
this.dimAnnotations = List.nil();
this.elems = var3;
}
1
2
3
4
5
6
7
JCNewClass
new一个对象:
例子:new B(“123”)
JCNewClass new B(“123”)
clazz (JCExpression) = (JCTypeApply) B
args (List<JCTree.JCExpression>) [0] = (JCLiteral) “123”
protected JCNewClass(JCTree.JCExpression var1, List<JCTree.JCExpression> var2, JCTree.JCExpression var3, List<JCTree.JCExpression> var4, JCTree.JCClassDecl var5) {
this.encl = var1;
this.typeargs = var2 == null ? List.nil() : var2;
this.clazz = var3;
this.args = var4;
this.def = var5;
}
1
2
3
4
5
6
7
JCParens
括号:(expr) 存在于if、计算式、synchronized中
protected JCParens(JCTree.JCExpression var1) {
this.expr = var1;
}
1
2
3
JCPrimitiveTypeTree
基本类型:
基本类型的赋值:int i = 0 :
typetag = INT
方法的返回值:void print(String s) {Log.e(TAG, s);}
typetag = VOID
protected JCPrimitiveTypeTree(TypeTag var1) {
this.typetag = var1;
}
1
2
3
typetag可选值:
INT : int
LONG : long
FLOAT : float
DOUBLE : double
DOOLEAN : boolean
CHAR : char
BYTE : byte
short : short
VOID : void
1
2
3
4
5
6
7
8
9
JCReturn
return语句:return expr
protected JCReturn(JCTree.JCExpression var1) {
this.expr = var1;
}
1
2
3
JCSkip
空操作,即一个无效的分号 “;”
JCStatement
声明:凡是继承JCStatement都是一个声明,在JCBlock中拿到的都是JCStatement,想在JCBlock中拿到JCExpression就用JCExpressionStatement
JCSWitch
switch语句:switch(selector) {cases}
protected JCSwitch(JCTree.JCExpression var1, List<JCTree.JCCase> var2) {
this.selector = var1;
this.cases = var2;
}
1
2
3
4
JCSynchronized
synchronized同步锁:synchronized(lock){block}
protected JCSynchronized(JCTree.JCExpression var1, JCTree.JCBlock var2) {
this.lock = var1;
this.body = var2;
}
1
2
3
4
JCThrow
抛出异常:throw expr
protected JCThrow(JCTree.JCExpression var1) {
this.expr = var1;
}
1
2
3
JCTry
try块:try body catchers finally finalizer
protected JCTry(List<JCTree> var1, JCTree.JCBlock var2, List<JCTree.JCCatch> var3, JCTree.JCBlock var4) {
this.body = var2;
this.catchers = var3;
this.finalizer = var4;
this.resources = var1;
}
1
2
3
4
5
6
resources不知道是什么
JCTypeApply
泛型参数:List list = new ArrayList<>()
对于List list:
clazz (JCExpression) = (JCIdent) List
arguments (List<JCTree.JCExpression>) [0] = (JCIdent) String
对于new ArrayList<>():
clazz (JCExpression) = (JCIdent) ArrayList
arguments (List<JCTree.JCExpression>) = empty
protected JCTypeApply(JCTree.JCExpression var1, List<JCTree.JCExpression> var2) {
this.clazz = var1;
this.arguments = var2;
}
1
2
3
4
JCTypeCast
类型转换:(clazz)expr
例子:View textView = ((TextView) findViewById(R.id.text));
JCTypeCast (TextView)findViewById(R.id.text)
clazz (JCTree) = (JCIdent) TextView
expr (JCExpression) = (JCMethodInvocation) findViewById(R.id.text)
例子:TextView t = (TextView) textView;
JCTypeCast (TextView)textView
clazz (JCTree) = (JCIdent) TextView
expr (JCExpression) = (JCIdent) textView
protected JCTypeCast(JCTree var1, JCTree.JCExpression var2) {
this.clazz = var1;
this.expr = var2;
}
1
2
3
4
JCTypelntersection
unknown
泛型交叉:
public static class A<T extends String & Runnable> {
}
1
2
3
protected JCTypeIntersection(List<JCTree.JCExpression> var1) {
this.bounds = var1;
}
1
2
3
JCTypeParameter
类的泛型定义:class
JCTypeParameter @Anno() T extends View
name (Name) = (NameImpl) T
bounds (List<JCTree.JCExpression>) [0] = (JCIdent) View
JCAnnotation @MainActivity.A()
protected JCTypeParameter(Name var1, List<JCTree.JCExpression> var2, List<JCTree.JCAnnotation> var3) {
this.name = var1;
this.bounds = var2;
this.annotations = var3;
}
1
2
3
4
5
JCTypeUnion
catch块中异常的或定义:T1 | T2 | … Tn
try{
...
}catch (ClassCastException | ArrayIndexOutOfBoundsException e){
...
}
1
2
3
4
5
JCTypeUnion ClassCastException | ArrayIndexOutOfBoundsException
alternatives (List<JCTree.JCExpression>) [0] = (JCIdent) ClassCastException
alternatives (List<JCTree.JCExpression>) [1] = (JCIdent) ArrayIndexOutOfBoundsException
protected JCTypeUnion(List<JCTree.JCExpression> var1) {
this.alternatives = var1;
}
1
2
3
JCUnary
一元运算语句:i++中
opcode = POSTINC
arg = i (实际是JCIdent类型)
protected JCUnary(JCTree.Tag var1, JCTree.JCExpression var2) {
this.opcode = var1;
this.arg = var2;
}
1
2
3
4
/** Unary operators, of type Unary.
*/
POS, // +
NEG, // -
NOT, // !
COMPL, // ~
PREINC, // ++ _
PREDEC, // -- _
POSTINC, // _ ++
POSTDEC, // _ --
1
2
3
4
5
6
7
8
9
10
JCVariableDecl
定义变量: mods vartype name = init
例子:final TextView textView = findViewById(R.id.text);
JCVariableDecl final TextView textView = findViewById(R.id.text)
mods (JCModifiers) = final
name (Name) = (NameImpl) textView
vartype (JCExpression) = (JCIdent) TextView
init (JCExpression) = (JCMethodInvocation) findViewById(R.id.text)
例子:double i = 1 + 2 * 3;
JCVariableDecl double i = 1 + 2 * 3
name (Name) = (NameImpl) i
vartype (JCExpression) = (JCPrimitiveTypeTree) double
init (JCExpression) = (JCBinary) 1 + 2 * 3
例子:int k = cond ? 0 : 1;
JCVariableDecl int k = cond ? 0 : 1
init (JCExpression) = (JCConditional) cond ? 0 : 1
protected JCVariableDecl(JCTree.JCModifiers var1, Name var2, JCTree.JCExpression var3, JCTree.JCExpression var4, VarSymbol var5) {
this.mods = var1;
this.name = var2;
this.vartype = var3;
this.init = var4;
this.sym = var5;
}
1
2
3
4
5
6
7
JCWhileLoop
while循环:while(cond){body}
为什么body不是Statement List或Block?
protected JCWhileLoop(JCTree.JCExpression var1, JCTree.JCStatement var2) {
this.cond = var1;
this.body = var2;
}
1
2
3
4
JCWildcard
泛型中的"?"通配符:Class<? super String> c;
JCWildcard ? super String
kind (TypeBoundKind) = ? super
inner (JCTree) = (JCIdent) String
protected JCWildcard(JCTree.TypeBoundKind var1, JCTree var2) {
var1.getClass();
this.kind = var1;
this.inner = var2;
}
————————————————
版权声明:本文为CSDN博主「Lazyjam」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013998373/article/details/90050810
Java抽象语法树AST,JCTree 分析的更多相关文章
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
- 理解Babel是如何编译JS代码的及理解抽象语法树(AST)
Babel是如何编译JS代码的及理解抽象语法树(AST) 1. Babel的作用是? 很多浏览器目前还不支持ES6的代码,但是我们可以通过Babel将ES6的代码转译成ES5代码,让所有的浏览器都 ...
- 抽象语法树(AST)
AST描述 在计算机科学中,抽象语法树(AST)或语法树是用编程语言编写的源代码的抽象语法结构的树表示.树的每个节点表示在源代码中出现的构造.语法是“抽象的”,因为它不代表真实语法中出现的每个细节,而 ...
- 从零写一个编译器(九):语义分析之构造抽象语法树(AST)
项目的完整代码在 C2j-Compiler 前言 在上一篇完成了符号表的构建,下一步就是输出抽象语法树(Abstract Syntax Tree,AST) 抽象语法树(abstract syntax ...
- Clang之语法抽象语法树AST
语法分析器的任务是确定某个单词流是否能够与源语言的语法适配,即设定一个称之为上下文无关语言(context-free language)的语言集合,语法分析器建立一颗与(词法分析出的)输入单词流对应的 ...
- 五分钟了解抽象语法树(AST)babel是如何转换的?
抽象语法树 什么是抽象语法树? It is a hierarchical program representation that presents source code structure acco ...
- AST抽象语法树 Javascript版
在javascript世界中,你可以认为抽象语法树(AST)是最底层. 再往下,就是关于转换和编译的"黑魔法"领域了. 现在,我们拆解一个简单的add函数 function add ...
- AST抽象语法树
抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语法树并 ...
- JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
随机推荐
- Swift编码总结4
1.swift @discardableResult 声明: swift正常的方法如果有返回值的话,调用的时候必须有一个接收方,否则的话编译器会报一个警告,如果在方法前加上 @discardableR ...
- Oracle表存在则删除后再重建
简单的执行方式: drop table USERINFO; create table USERINFO ( EnglishName ), ChineseName ), Sex ), Age int, ...
- c# Aspose.Cells 通过Excel模板生产excel数据再打印
多的不说,我们先来利用Northwind做两个小demo.先说说Aspose.Cells的模板语法: &=DataSource.Field,&=[DataSource].[Field] ...
- word 转化为PDF 目录没了
https://jingyan.baidu.com/article/ca00d56c5d5f8de99febcf54.html 点文件-->导出-->创建PDF-->选项--> ...
- 微前端框架 single-spa
单体应用对比前端微服务化 普通的前端单体应用 微前端架构 1.基本概念 实现一套微前端架构,可以把其分成四部分(参考:https://alili.tech/archive/11052bf4/) 加载器 ...
- 深入浅出JVM(一):运行时数据区域
程序计数器 线程私有 指向了正在执行的虚拟机字节码指令的地址:如果是本地方法,数值为空 没有 OutOfMemoryError 错误的区域 Java虚拟机栈 线程私有: 生命周期与线程相同: 代表着 ...
- 嵌入式02 STM32 实验01 端口复用和重映射
内设与外设: 端口复用和端口重映射都需要了解内设和外设,那么什么是内设?什么是外设? 内设:单片机内部集成的功能一般包括:串口模块.SPI模块(Serial Peripheral Interface ...
- day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池
day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- [洛谷P3227][HNOI2013]切糕
题目大意:有一个$n\times m$的切糕,每一个位置的高度可以在$[1,k]$之间,每个高度有一个代价,要求四联通的两个格子之间高度最多相差$D$,问可行的最小代价.$n,m,k,D\leqsla ...
- postman 测试Api接口注意事项
1.简单数据传输 2.对象传输 使用的是post方式请求 在Headers设置: 在Body写入对象信息,主要红线的地方:1.raw选中 2.j'son格式 form表单提交数据测试 在header里 ...