📄 parser.java
字号:
t = arguments(typeArgs, t); typeArgs = null; } else if (S.token() == NEW && (mode & EXPR) != 0) { if (typeArgs != null) return illegal(); mode = EXPR; int pos2 = S.pos(); S.nextToken(); if (S.token() == LT) typeArgs = typeArguments(); t = innerCreator(pos2, typeArgs, t); typeArgs = null; } else { t = toP(F.at(pos1).Select(t, ident())); t = argumentsOpt(typeArgs, typeArgumentsOpt(t)); typeArgs = null; } } else { break; } } while ((S.token() == PLUSPLUS || S.token() == SUBSUB) && (mode & EXPR) != 0) { mode = EXPR; t = to(F.at(S.pos()).Unary( S.token() == PLUSPLUS ? JCTree.POSTINC : JCTree.POSTDEC, t)); S.nextToken(); } return toP(t); } /** SuperSuffix = Arguments | "." [TypeArguments] Ident [Arguments] */ JCExpression superSuffix(List<JCExpression> typeArgs, JCExpression t) { S.nextToken(); if (S.token() == LPAREN || typeArgs != null) { t = arguments(typeArgs, t); } else { int pos = S.pos(); accept(DOT); typeArgs = (S.token() == LT) ? typeArguments() : null; t = toP(F.at(pos).Select(t, ident())); t = argumentsOpt(typeArgs, t); } return t; } /** BasicType = BYTE | SHORT | CHAR | INT | LONG | FLOAT | DOUBLE | BOOLEAN */ JCPrimitiveTypeTree basicType() { JCPrimitiveTypeTree t = to(F.at(S.pos()).TypeIdent(typetag(S.token()))); S.nextToken(); return t; } /** ArgumentsOpt = [ Arguments ] */ JCExpression argumentsOpt(List<JCExpression> typeArgs, JCExpression t) { if ((mode & EXPR) != 0 && S.token() == LPAREN || typeArgs != null) { mode = EXPR; return arguments(typeArgs, t); } else { return t; } } /** Arguments = "(" [Expression { COMMA Expression }] ")" */ List<JCExpression> arguments() { ListBuffer<JCExpression> args = lb(); if (S.token() == LPAREN) { S.nextToken(); if (S.token() != RPAREN) { args.append(expression()); while (S.token() == COMMA) { S.nextToken(); args.append(expression()); } } accept(RPAREN); } else { syntaxError(S.pos(), "expected", keywords.token2string(LPAREN)); } return args.toList(); } JCMethodInvocation arguments(List<JCExpression> typeArgs, JCExpression t) { int pos = S.pos(); List<JCExpression> args = arguments(); return toP(F.at(pos).Apply(typeArgs, t, args)); } /** TypeArgumentsOpt = [ TypeArguments ] */ JCExpression typeArgumentsOpt(JCExpression t) { if (S.token() == LT && (mode & TYPE) != 0 && (mode & NOPARAMS) == 0) { mode = TYPE; checkGenerics(); return typeArguments(t); } else { return t; } } List<JCExpression> typeArgumentsOpt() { return typeArgumentsOpt(TYPE); } List<JCExpression> typeArgumentsOpt(int useMode) { if (S.token() == LT) { checkGenerics(); if ((mode & useMode) == 0 || (mode & NOPARAMS) != 0) { illegal(); } mode = useMode; return typeArguments(); } return null; } /** TypeArguments = "<" TypeArgument {"," TypeArgument} ">" */ List<JCExpression> typeArguments() { ListBuffer<JCExpression> args = lb(); if (S.token() == LT) { S.nextToken(); args.append(((mode & EXPR) == 0) ? typeArgument() : type()); while (S.token() == COMMA) { S.nextToken(); args.append(((mode & EXPR) == 0) ? typeArgument() : type()); } switch (S.token()) { case GTGTGTEQ: S.token(GTGTEQ); break; case GTGTEQ: S.token(GTEQ); break; case GTEQ: S.token(EQ); break; case GTGTGT: S.token(GTGT); break; case GTGT: S.token(GT); break; default: accept(GT); break; } } else { syntaxError(S.pos(), "expected", keywords.token2string(LT)); } return args.toList(); } /** TypeArgument = Type * | "?" * | "?" EXTENDS Type {"&" Type} * | "?" SUPER Type */ JCExpression typeArgument() { if (S.token() != QUES) return type(); int pos = S.pos(); S.nextToken(); if (S.token() == EXTENDS) { TypeBoundKind t = to(F.at(S.pos()).TypeBoundKind(BoundKind.EXTENDS)); S.nextToken(); return F.at(pos).Wildcard(t, type()); } else if (S.token() == SUPER) { TypeBoundKind t = to(F.at(S.pos()).TypeBoundKind(BoundKind.SUPER)); S.nextToken(); return F.at(pos).Wildcard(t, type()); } else if (S.token() == IDENTIFIER) { //error recovery reportSyntaxError(S.prevEndPos(), "expected3", keywords.token2string(GT), keywords.token2string(EXTENDS), keywords.token2string(SUPER)); TypeBoundKind t = F.at(Position.NOPOS).TypeBoundKind(BoundKind.UNBOUND); JCExpression wc = toP(F.at(pos).Wildcard(t, null)); JCIdent id = toP(F.at(S.pos()).Ident(ident())); return F.at(pos).Erroneous(List.<JCTree>of(wc, id)); } else { TypeBoundKind t = F.at(Position.NOPOS).TypeBoundKind(BoundKind.UNBOUND); return toP(F.at(pos).Wildcard(t, null)); } } JCTypeApply typeArguments(JCExpression t) { int pos = S.pos(); List<JCExpression> args = typeArguments(); return toP(F.at(pos).TypeApply(t, args)); } /** BracketsOpt = {"[" "]"} */ private JCExpression bracketsOpt(JCExpression t) { if (S.token() == LBRACKET) { int pos = S.pos(); S.nextToken(); t = bracketsOptCont(t, pos); F.at(pos); } return t; } private JCArrayTypeTree bracketsOptCont(JCExpression t, int pos) { accept(RBRACKET); t = bracketsOpt(t); return toP(F.at(pos).TypeArray(t)); } /** BracketsSuffixExpr = "." CLASS * BracketsSuffixType = */ JCExpression bracketsSuffix(JCExpression t) { if ((mode & EXPR) != 0 && S.token() == DOT) { mode = EXPR; int pos = S.pos(); S.nextToken(); accept(CLASS); if (S.pos() == errorEndPos) { // error recovery Name name = null; if (S.token() == IDENTIFIER) { name = S.name(); S.nextToken(); } else { name = names.error; } t = F.at(pos).Erroneous(List.<JCTree>of(toP(F.at(pos).Select(t, name)))); } else { t = toP(F.at(pos).Select(t, names._class)); } } else if ((mode & TYPE) != 0) { mode = TYPE; } else { syntaxError(S.pos(), "dot.class.expected"); } return t; } /** Creator = Qualident [TypeArguments] ( ArrayCreatorRest | ClassCreatorRest ) */ JCExpression creator(int newpos, List<JCExpression> typeArgs) { switch (S.token()) { case BYTE: case SHORT: case CHAR: case INT: case LONG: case FLOAT: case DOUBLE: case BOOLEAN: if (typeArgs == null) return arrayCreatorRest(newpos, basicType()); break; default: } JCExpression t = qualident(); int oldmode = mode; mode = TYPE; if (S.token() == LT) { checkGenerics(); t = typeArguments(t); } while (S.token() == DOT) { int pos = S.pos(); S.nextToken(); t = toP(F.at(pos).Select(t, ident())); if (S.token() == LT) { checkGenerics(); t = typeArguments(t); } } mode = oldmode; if (S.token() == LBRACKET) { JCExpression e = arrayCreatorRest(newpos, t); if (typeArgs != null) { int pos = newpos; if (!typeArgs.isEmpty() && typeArgs.head.pos != Position.NOPOS) { // note: this should always happen but we should // not rely on this as the parser is continuously // modified to improve error recovery. pos = typeArgs.head.pos; } setErrorEndPos(S.prevEndPos()); reportSyntaxError(pos, "cannot.create.array.with.type.arguments"); return toP(F.at(newpos).Erroneous(typeArgs.prepend(e))); } return e; } else if (S.token() == LPAREN) { return classCreatorRest(newpos, null, typeArgs, t); } else { reportSyntaxError(S.pos(), "expected2", keywords.token2string(LPAREN), keywords.token2string(LBRACKET)); t = toP(F.at(newpos).NewClass(null, typeArgs, t, List.<JCExpression>nil(), null)); return toP(F.at(newpos).Erroneous(List.<JCTree>of(t))); } } /** InnerCreator = Ident [TypeArguments] ClassCreatorRest */ JCExpression innerCreator(int newpos, List<JCExpression> typeArgs, JCExpression encl) { JCExpression t = toP(F.at(S.pos()).Ident(ident())); if (S.token() == LT) { checkGenerics(); t = typeArguments(t); } return classCreatorRest(newpos, encl, typeArgs, t); } /** ArrayCreatorRest = "[" ( "]" BracketsOpt ArrayInitializer * | Expression "]" {"[" Expression "]"} BracketsOpt ) */ JCExpression arrayCreatorRest(int newpos, JCExpression elemtype) { accept(LBRACKET); if (S.token() == RBRACKET) { accept(RBRACKET); elemtype = bracketsOpt(elemtype); if (S.token() == LBRACE) { return arrayInitializer(newpos, elemtype); } else { return syntaxError(S.pos(), "array.dimension.missing"); } } else { ListBuffer<JCExpression> dims = new ListBuffer<JCExpression>(); dims.append(expression()); accept(RBRACKET); while (S.token() == LBRACKET) { int pos = S.pos(); S.nextToken(); if (S.token() == RBRACKET) { elemtype = bracketsOptCont(elemtype, pos); } else { dims.append(expression()); accept(RBRACKET); } } return toP(F.at(newpos).NewArray(elemtype, dims.toList(), null)); } } /** ClassCreatorRest = Arguments [ClassBody] */ JCExpression classCreatorRest(int newpos, JCExpression encl, List<JCExpression> typeArgs, JCExpression t) { List<JCExpression> args = arguments(); JCClassDecl body = null; if (S.token() == LBRACE) { int pos = S.pos(); List<JCTree> defs = classOrInterfaceBody(names.empty, false); JCModifiers mods = F.at(Position.NOPOS).Modifiers(0); body = toP(F.at(pos).AnonymousClassDef(mods, defs)); } return toP(F.at(newpos).NewClass(encl, typeArgs, t, args, body)); } /** ArrayInitializer = "{" [VariableInitializer {"," VariableInitializer}] [","] "}" */ JCExpression arrayInitializer(int newpos, JCExpression t) { accept(LBRACE); ListBuffer<JCExpression> elems = new ListBuffer<JCExpression>(); if (S.token() == COMMA) { S.nextToken(); } else if (S.token() != RBRACE) { elems.append(variableInitializer()); while (S.token() == COMMA) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -