1.语法树类型标识——枚举类Tag
public enum Tag {
/** For methods that return an invalid tag if a given condition is not met
*/
NO_TAG,
1.1 文件、包、导入
/** Toplevel nodes, of type TopLevel, representing entire source files.
*/
TOPLEVEL,
/** Package level definitions.
*/
PACKAGEDEF,
/** Import clauses, of type Import.
*/
IMPORT,
1.2 属于语句范畴
/** Class definitions, of type ClassDef.
*/
CLASSDEF,
/** Method definitions, of type MethodDef.
*/
METHODDEF,
/** Variable definitions, of type VarDef.
*/
VARDEF,
/** The no-op statement ";", of type Skip
*/
SKIP,
/** Blocks, of type Block.
*/
BLOCK,
/** Do-while loops, of type DoLoop.
*/
DOLOOP,
/** While-loops, of type WhileLoop.
*/
WHILELOOP,
/** For-loops, of type ForLoop.
*/
FORLOOP,
/** Foreach-loops, of type ForeachLoop.
*/
FOREACHLOOP,
/** Labelled statements, of type Labelled.
*/
LABELLED,
/** Switch statements, of type Switch.
*/
SWITCH,
/** Case parts in switch statements, of type Case.
*/
CASE,
/** Synchronized statements, of type Synchonized.
*/
SYNCHRONIZED,
/** Try statements, of type Try.
*/
TRY,
/** Catch clauses in try statements, of type Catch.
*/
CATCH,
/** Conditional expressions, of type Conditional.
*/
CONDEXPR,
/** Conditional statements, of type If.
*/
IF,
/** Expression statements, of type Exec.
*/
EXEC,
/** Break statements, of type Break.
*/
BREAK,
/** Continue statements, of type Continue.
*/
CONTINUE,
/** Return statements, of type Return.
*/
RETURN,
/** Throw statements, of type Throw.
*/
THROW,
/** Assert statements, of type Assert.
*/
ASSERT,
1.3 属于表达式范畴
/** Method invocation expressions, of type Apply.
*/
APPLY,
/** Class instance creation expressions, of type NewClass.
*/
NEWCLASS,
/** Array creation expressions, of type NewArray.
*/
NEWARRAY,
/** Lambda expression, of type Lambda.
*/
LAMBDA,
/** Parenthesized subexpressions, of type Parens.
*/
PARENS,
/** Assignment expressions, of type Assign.
*/
ASSIGN,
/** Type cast expressions, of type TypeCast.
*/
TYPECAST,
/** Type test expressions, of type TypeTest.
*/
TYPETEST,
/** Indexed array expressions, of type Indexed.
*/
INDEXED,
/** Selections, of type Select.
*/
SELECT,
/** Member references, of type Reference.
*/
REFERENCE,
/** Simple identifiers, of type Ident.
*/
IDENT,
/** Literals, of type Literal.
*/
LITERAL,
/** Basic type identifiers, of type TypeIdent.
*/
TYPEIDENT,
/** Array types, of type TypeArray.
*/
TYPEARRAY,
/** Parameterized types, of type TypeApply.
*/
TYPEAPPLY,
/** Union types, of type TypeUnion.
*/
TYPEUNION,
/** Intersection types, of type TypeIntersection.
*/
TYPEINTERSECTION,
/** Formal type parameters, of type TypeParameter.
*/
TYPEPARAMETER,
/** Type argument.
*/
WILDCARD,
/** Bound kind: extends, super, exact, or unbound
*/
TYPEBOUNDKIND,
/** metadata: Annotation.
*/
ANNOTATION,
/** metadata: Type annotation.
*/
TYPE_ANNOTATION,
/** metadata: Modifiers
*/
MODIFIERS,
/** An annotated type tree.
*/
ANNOTATED_TYPE,
/** Error trees, of type Erroneous.
*/
ERRONEOUS,
/** Unary operators, of type Unary.
*/
POS, // +
NEG, // -
NOT, // !
COMPL, // ~
PREINC, // ++ _
PREDEC, // -- _
POSTINC, // _ ++
POSTDEC, // _ --
/** unary operator for null reference checks, only used internally.
*/
NULLCHK,
/** Binary operators, of type Binary.
*/
OR, // ||
AND, // &&
BITOR, // |
BITXOR, // ^
BITAND, // &
EQ, // ==
NE, // !=
LT, // <
GT, // >
LE, // <=
GE, // >=
SL, // <<
SR, // >>
USR, // >>>
PLUS, // +
MINUS, // -
MUL, // *
DIV, // /
MOD, // %
/** 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), // %=
MODULEDEF,
EXPORTS,
OPENS,
PROVIDES,
REQUIRES,
USES,
/** A synthetic let expression, of type LetExpr.
*/
LETEXPR; // ala scheme
2.语法树结点的分类
1)JCCompilationUnit
2)表达式的类结构
3)语句的类结构
4)其他的类结构
3.JCTree——三个重要属性
public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
/* The (encoded) position in the source file. @see util.Position.
*/
public int pos;
/* The type of this node.
*/
public Type type;
/* The tag of this node -- one of the constants declared above.
*/
public abstract Tag getTag();
}
- Tag
是在JCTree里面定义的enum类,用来区分语法树的类型。
其他所有语法树结点类型声明时都要重新覆盖getTag(),赋值结点一种语法树类型。
public static class JCClassDecl extends JCStatement implements ClassTree {
@Override
public Tag getTag() {
return CLASSDEF;
}
}
pos
在源文件中位置type
问题:在语法树生成时,没有跟踪type的生成,需要再跟一遍,以了解type是怎样生成的?
描述结点类型,是真正意义上的Java类型。如下
This class represents Java types. The class itself defines the behavior of the following types:
* base types (tags: BYTE, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE, BOOLEAN),
* type `void' (tag: VOID),
* the bottom type (tag: BOT),
* the missing type (tag: NONE).
The behavior of the following types is defined in subclasses, which are all static inner classes of this class:
* class types (tag: CLASS, class: ClassType),
* array types (tag: ARRAY, class: ArrayType),
* method types (tag: METHOD, class: MethodType),
* package types (tag: PACKAGE, class: PackageType),
* type variables (tag: TYPEVAR, class: TypeVar),
* type arguments (tag: WILDCARD, class: WildcardType),
* generic method types (tag: FORALL, class: ForAll),
* the error type (tag: ERROR, class: ErrorType).