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节点将与源代码中的原始方法声明具有相同的位置 ,这在调试方面非常重要。

posted @ 2023-07-11 19:37  北feng  阅读(167)  评论(0)    收藏  举报