AST[Abstract Syntax Tree]
Abstract Syntax Tree
AST abstract syntax tree (抽象语法结构树),是对java语言的一种抽象,每个节点都能对应到一种java语法,最终一个java文件就是由一棵节点树构成。
package com.sun.tools.javac.tree;
AST 节点类型
com.sun.source.tree.Tree.Kind
| 枚举类型 | Tree节点类型 | 定义 | 示例 |
|---|---|---|---|
| ANNOTATED_TYPE | AnnotatedTypeTree | 注解类型,可以用在任何类型上 注解的Target为:TYPE_PARAMETER TYPE_USE | @NotNull String |
| ANNOTATION | AnnotationTree | 普通的注解 | @Data @JsonProperties(value="sdf") |
| TYPE_ANNOTATION | AnnotationTree | ||
| ARRAY_ACCESS | ArrayAccessTree | 数组访问 | array[3] |
| ARRAY_TYPE | ArrayTypeTree | 数组类型 | int[] |
| ASSIGNMENT | AssignmentTree | 赋值 | a = 1 |
| BLOCK | BlockTree | 语句块 | {} { statements } static |
| BREAK | BreakTree | break | break; break label; |
| CASE | CaseTree | case 语句 | case expression:statements default: statements |
| CATCH | CatchTree | catch 语句 | catch(parameter) block 注:这些语句会有嵌套问题 |
| CLASS INTERFACE ENUM ANNOTATION_TYPE | ClassTree | class 定义 | modifiers class simpleName typeParameters extends extendsClause implements implementsClause { members } |
| COMPILATION_UNIT | CompilationUnitTree | 一个编译单元 包括源文件和package-info.java | |
| CONDITIONAL_EXPRESSION | ConditionalExpressionTree | 三元运算符 | a == 1 ? 1 : 0 |
| CONTINUE | ContinueTree | continue 语句 | continue; continue label; |
| DO_WHILE_LOOP | DoWhileLoopTree | do...while | |
| ENHANCED_FOR_LOOP | EnhancedForLoopTree | 增强for | for(int i: intlist) |
| EXPRESSION_STATEMENT | ExpressionStatementTree | 语句 | |
| MEMBER_SELECT | MemberSelectTree | 对象.操作 | aClass.aparams |
| MEMBER_REFERENCE | MemberReferenceTree | 成员引用表达式 | |
| FOR_LOOP | ForLoopTree | for循环 | |
| IDENTIFIER | IdentifierTree | 识别符,与literal区分开 | a = 1 a 就是一个identifier |
| IF | IfTree | ||
| IMPORT | ImportTree | ||
| INSTANCE_OF | InstanceOfTree | instanceof 表达式 | |
| LABELED_STATEMENT | LabeledStatementTree | label语法 | label : statement |
| METHOD | MethodTree | 方法定义 | 方法 modifiers typeParameters type name (parameters ) body 注解 modifiers type name () default defaultValue |
| METHOD_INVOCATION | MethodInvocationTree | method invoke语法 | |
| MODIFIERS | ModifiersTree | 修饰符(Modifier) 包括注解 | |
| NEW_ARRAY | NewArrayTree | ||
| NEW_CLASS | NewClassTree | ||
| LAMBDA_EXPRESSION | LambdaExpressionTree | lambda表达式 | |
| PRIMITIVE_TYPE | PrimitiveTypeTree | 基础类型 | |
| RETURN | ReturnTree | return | |
| EMPTY_STATEMENT | EmptyStatementTree | 空的";" | |
| SWITCH | SwitchTree | ||
| SYNCHRONIZED | SynchronizedTree | ||
| THROW | ThrowTree | ||
| TRY | TryTree | ||
| PARAMETERIZED_TYPE | ParameterizedTypeTree | 泛型 | List |
| UNION_TYPE | UnionTypeTree | 多变量声明 | try { }catch(Exception e1 |
| INTERSECTION_TYPE | IntersectionTypeTree | T extends MyA & MyB | |
| TYPE_CAST | TypeCastTree | 强转语句 | (int)a |
| TYPE_PARAMETER | TypeParameterTree | ||
| VARIABLE | VariableTree | 变量 | modifiers type name initializer ; modifiers type qualified-name.this |
| WHILE_LOOP | WhileLoopTree | ||
| POSTFIX_INCREMENT POSTFIX_DECREMENT PREFIX_INCREMENT PREFIX_DECREMENT UNARY_PLUS UNARY_MINUS BITWISE_COMPLEMENT LOGICAL_COMPLEMENT | UnaryTree | 运算符 | ++、--、+、-、~、!、*、/、% |
| MULTIPLY DIVIDE REMAINDER PLUS MINUS LEFT_SHIFT RIGHT_SHIFT UNSIGNED_RIGHT_SHIFT LESS_THAN GREATER_THAN LESS_THAN_EQUAL GREATER_THAN_EQUAL EQUAL_TO NOT_EQUAL_TO AND XOR OR CONDITIONAL_AND CONDITIONAL_OR | BinaryTree | 两元运算 | |
| MULTIPLY_ASSIGNMENT DIVIDE_ASSIGNMENT REMAINDER_ASSIGNMENT PLUS_ASSIGNMENT MINUS_ASSIGNMENT LEFT_SHIFT_ASSIGNMENT RIGHT_SHIFT_ASSIGNMENT UNSIGNED_RIGHT_SHIFT_ASSIGNMENT AND_ASSIGNMENT XOR_ASSIGNMENT OR_ASSIGNMENT | CompoundAssignmentTree | 赋值运算符 | +=、-=、*= |
| INT_LITERAL LONG_LITERAL FLOAT_LITERAL DOUBLE_LITERAL BOOLEAN_LITERAL CHAR_LITERAL STRING_LITERAL NULL_LITERAL | LiteralTree | 字面值 | a = 1 (1就是) |
| OTHER | null |
JCTree
com.sun.tools.javac.tree.JCTree 是Tree的一个抽象实现类,有各种实现类,代表着一个个的AST节点。
实现类都是JCTree的内部类 ;

JCTree.Factory
JCTree的各种JC类的构造函数都是protected,也就是说,并不能直接进行初始化,所以现在要使用Factory,Factory是各种JC类的工厂定义。
com.sun.tools.javac.tree.TreeMaker
TreeMaker是JCTree.Factory实现 ;它是常使用的一个类 ;
所有语法节点都是由它生成的,根据Name对象构建一个语法节点。
断点观察


JCTree.JCMethodDecl
public static class JCMethodDecl extends JCTree implements MethodTree {
public JCModifiers mods; //方法修饰符
public Name name; //方法名称
public JCExpression restype;//方法返回值类型
public List<JCTypeParameter> typarams; //方法入参
public JCVariableDecl recvparam; //方法变量
public List<JCVariableDecl> params; //方法变量列表
public List<JCExpression> thrown; //异常
public JCBlock body; //方法体
public JCExpression defaultValue; //默认值
public Symbol.MethodSymbol sym; //所属类
JCModifiers

public static class JCModifiers extends JCTree implements ModifiersTree {
public long flags;
public List<JCAnnotation> annotations;
com.sun.tools.javac.code.Flags
public class Flags {
public static final int PUBLIC = 1;
public static final int PRIVATE = 2;
public static final int PROTECTED = 4;
public static final int STATIC = 8;
public static final int FINAL = 16;
public static final int SYNCHRONIZED = 32;
public static final int VOLATILE = 64;
public static final int TRANSIENT = 128;
public static final int NATIVE = 256;
public static final int INTERFACE = 512;
public static final int ABSTRACT = 1024;
...
public static final int ACC_SUPER = 32;
public static final int ACC_BRIDGE = 64;
com.sun.tools.javac.util.Name
com.sun.tools.javac.util.SharedNameTable.NameImpl extends Name

com.sun.tools.javac.tree.JCTree.JCExpression
com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree extends JCExpression

treeMaker.pos = jcMethodDecl.pos; 的作用
pos属性代表AST节点在源代码中的位置。通过将treeMaker对象的pos属性设置为jcMethodDecl对象的位置,新创建的AST节点将与源代码中的原始方法声明具有相同的位置 ,这在调试方面非常重要。

浙公网安备 33010602011771号