2.3.3 调用classDeclaration()方法解析class语法树语法解析步骤已经逐渐接近尾声,那么还剩下最后一步就是解析 class 主体信息。当语法解析器成功将 import 关键字声明解析为 JCIdent 和 JCFieldAccess 语法节点并整合为一棵JCImport 语法树后,在 parseCompilationUnit()的方法内部就会通过 typeDeclaration()方法调用 classOrInterfaceOrEnumDeclaration()方法将 class 主体信息解析为一棵 JCClassDecl 语法树。如下所示:代码 2-15 classOrInterfaceOrEnumDeclaration()方法的完整代码 JCStatement classOrInterfaceOrEnumDeclaration(JCModifiers mods, String dc) { /* 匹配 Token.CLASS */ if (S.token() == CLASS) { /* 将类类型解析为一颗 JCClassDecl 语法树 */ return classDeclaration(mods, dc); } /* 匹配 Token.INTERFACE */ else if (S.token() == INTERFACE) { /* 将接口类型解析为一颗 JCClassDecl 语法树 */ return interfaceDeclaration(mods, dc); } else if (allowEnums) { /* 匹配 Token.ENUM */ if (S.token() == ENUM) { /* 将枚举类型解析为一颗 JCClassDecl 语法树 */ return enumDeclaration(mods, dc); } else { int pos = S.pos(); ListJCTree errs; if (S.token() == IDENTIFIER) { errs = List .JCTree of(mods, toP(F.at(pos).Ident(ident()))); setErrorEndPos(S.pos()); } else { errs = List.JCTree of(mods); } return toP(F.Exec(syntaxError(pos, errs, "expected3", CLASS, INTERFACE, ENUM))); } } else { /* 匹配 Token.ENUM */ if (S.token() == ENUM) { error(S.pos(), "enums.not.supported.in.source", source.name); allowEnums = true; /* 将枚举类型解析为一颗 JCClassDec