📄 parser.java
字号:
}
}
t = F.at(pos).Select(t, ident());
break;
default:
break loop;
}
}
break;
case BYTE:
case SHORT:
case CHAR:
case INT:
case LONG:
case FLOAT:
case DOUBLE:
case BOOLEAN:
t = bracketsSuffix(bracketsOpt(basicType()));
break;
case VOID:
if ((mode & EXPR) != 0) {
S.nextToken();
if (S.token == DOT) {
t = bracketsSuffix(F.at(pos).TypeIdent(Type.VOID));
} else {
return illegal(pos);
}
} else {
return illegal();
}
break;
default:
return illegal();
}
while (true) {
int pos1 = S.pos;
if (S.token == LBRACKET) {
S.nextToken();
if (S.token == RBRACKET && (mode & TYPE) != 0) {
mode = TYPE;
S.nextToken();
return bracketsOpt(F.at(pos1).TypeArray(t));
} else {
if ((mode & EXPR) != 0) {
mode = EXPR;
Tree t1 = term();
t = F.at(pos1).Indexed(t, t1);
}
accept(RBRACKET);
}
} else if (S.token == DOT) {
S.nextToken();
if (S.token == SUPER && (mode & EXPR) != 0) {
mode = EXPR;
t = F.at(pos).Select(t, names._super);
S.nextToken();
t = arguments(t);
} else if (S.token == NEW && (mode & EXPR) != 0) {
mode = EXPR;
int pos2 = S.pos;
S.nextToken();
t = innerCreator(pos2, t);
} else {
t = argumentsOpt(F.at(pos).Select(t, ident()));
}
} else {
break;
}
}
while ((S.token == PLUSPLUS || S.token == SUBSUB) && (mode & EXPR) != 0) {
mode = EXPR;
t = F.at(S.pos).Unary(S.token == PLUSPLUS ? Tree.POSTINC :
Tree.POSTDEC, t);
S.nextToken();
}
if (genEndPos)
endPositions.put(t, new Integer(S.prevEndPos));
return t;
}
/**
* SuperSuffix = Arguments | "." Ident [Arguments]
*/
Tree superSuffix(Tree t) {
S.nextToken();
if (S.token == LPAREN) {
t = arguments(t);
} else {
int pos = S.pos;
accept(DOT);
t = argumentsOpt(F.at(pos).Select(t, ident()));
}
return t;
}
/**
* BasicType = BYTE | SHORT | CHAR | INT | LONG | FLOAT | DOUBLE | BOOLEAN
*/
Tree basicType() {
Tree t = F.at(S.pos).TypeIdent(typetag(S.token));
S.nextToken();
return t;
}
/**
* ArgumentsOpt = [ Arguments ]
*/
Tree argumentsOpt(Tree t) {
if ((mode & EXPR) != 0 && S.token == LPAREN) {
mode = EXPR;
return arguments(t);
} else {
return t;
}
}
/**
* Arguments = "(" [Expression { COMMA Expression }] ")"
*/
List arguments() {
int pos = S.pos;
ListBuffer args = new ListBuffer();
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();
}
Tree arguments(Tree t) {
int pos = S.pos;
List args = arguments();
return F.at(pos).Apply(t, args);
}
/**
* BracketsOpt = {"[" "]"}
*/
private Tree bracketsOpt(Tree t) {
while (S.token == LBRACKET) {
int pos = S.pos;
S.nextToken();
accept(RBRACKET);
t = F.at(pos).TypeArray(t);
}
return t;
}
/**
* BracketsSuffixExpr = "." CLASS
* BracketsSuffixType =
*/
Tree bracketsSuffix(Tree t) {
if ((mode & EXPR) != 0 && S.token == DOT) {
mode = EXPR;
int pos = S.pos;
S.nextToken();
accept(CLASS);
t = 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 )
*/
Tree creator(int newpos) {
switch (S.token) {
case BYTE:
case SHORT:
case CHAR:
case INT:
case LONG:
case FLOAT:
case DOUBLE:
case BOOLEAN:
return arrayCreatorRest(newpos, basicType());
default:
Tree t = qualident();
if (S.token == LBRACKET)
return arrayCreatorRest(newpos, t);
else if (S.token == LPAREN)
return classCreatorRest(newpos, null, t);
else
return syntaxError("left-paren.or.left-square-bracket.expected");
}
}
/**
* InnerCreator = Ident [TypeArguments] ClassCreatorRest
*/
Tree innerCreator(int newpos, Tree encl) {
Tree t = F.at(S.pos).Ident(ident());
return classCreatorRest(newpos, encl, t);
}
/**
* ArrayCreatorRest = "[" ( "]" BracketsOpt ArrayInitializer
* | Expression "]" {"[" Expression "]"} BracketsOpt )
*/
Tree arrayCreatorRest(int newpos, Tree elemtype) {
accept(LBRACKET);
if (S.token == RBRACKET) {
S.nextToken();
elemtype = bracketsOpt(elemtype);
if (S.token == LBRACE) {
return arrayInitializer(elemtype);
} else {
syntaxError(S.pos, "array.dimension.missing");
return errorTree;
}
} else {
ListBuffer dims = new ListBuffer();
dims.append(expression());
accept(RBRACKET);
while (S.token == LBRACKET) {
int pos = S.pos;
S.nextToken();
if (S.token == RBRACKET) {
S.nextToken();
elemtype = bracketsOpt(F.at(pos).TypeArray(elemtype));
} else {
dims.append(expression());
accept(RBRACKET);
}
}
return F.at(newpos).NewArray(elemtype, dims.toList(), null);
}
}
/**
* ClassCreatorRest = Arguments [ClassBody]
*/
Tree classCreatorRest(int newpos, Tree encl, Tree t) {
List args = arguments();
ClassDef body = null;
if (S.token == LBRACE)
body = F.at(S.pos).ClassDef(0, names.empty, TypeParameter.emptyList,
null, Tree.emptyList, classOrInterfaceBody(names.empty, false));
return F.at(newpos).NewClass(encl, t, args, body);
}
/**
* ArrayInitializer = "{" [VariableInitializer {"," VariableInitializer}] [","] "}"
*/
Tree arrayInitializer(Tree t) {
int pos = S.pos;
accept(LBRACE);
ListBuffer elems = new ListBuffer();
if (S.token == COMMA) {
S.nextToken();
} else if (S.token != RBRACE) {
elems.append(variableInitializer());
while (S.token == COMMA) {
S.nextToken();
if (S.token == RBRACE)
break;
elems.append(variableInitializer());
}
}
accept(RBRACE);
return F.at(pos).NewArray(t, Tree.emptyList, elems.toList());
}
/**
* VariableInitializer = ArrayInitializer | Expression
*/
Tree variableInitializer() {
return S.token == LBRACE ? arrayInitializer(null) : expression();
}
/**
* ParExpression = "(" Expression ")"
*/
Tree parExpression() {
int pos = S.pos;
accept(LPAREN);
Tree t = expression();
accept(RPAREN);
return genEndPos ? F.at(pos).Parens(t) : t;
}
/**
* Block = "{" BlockStatements "}"
*/
Block block(long flags) {
int pos = S.pos;
accept(LBRACE);
List stats = blockStatements();
Block t = F.at(pos).Block(flags, stats);
while (S.token == CASE || S.token == DEFAULT) {
syntaxError("orphaned", keywords.token2string(S.token));
blockStatements();
}
t.endpos = S.pos;
accept(RBRACE);
return t;
}
Block block() {
return block(0);
}
/**
* BlockStatements = { BlockStatement }
* BlockStatement = LocalVariableDeclarationStatement
* | ClassOrInterfaceDeclaration
* | [Ident ":"] Statement
* LocalVariableDeclarationStatement
* = [FINAL] Type VariableDeclarators ";"
*/
List blockStatements() {
ListBuffer stats = new ListBuffer();
while (true) {
int pos = S.pos;
switch (S.token) {
case RBRACE:
case CASE:
case DEFAULT:
case EOF:
return stats.toList();
case LBRACE:
case IF:
case FOR:
case WHILE:
case DO:
case TRY:
case SWITCH:
case SYNCHRONIZED:
case RETURN:
case THROW:
case BREAK:
case CONTINUE:
case SEMI:
case ELSE:
case FINALLY:
case CATCH:
stats.append(statement());
break;
case FINAL:
{
String dc = S.docComment;
long flags = modifiersOpt();
if (S.token == INTERFACE || S.token == CLASS) {
stats.append(classOrInterfaceDeclaration(flags, dc));
} else {
pos = S.pos;
Name name = S.name;
Tree t = type();
stats.appendList(variableDeclarators(flags, t));
accept(SEMI);
}
break;
}
case ABSTRACT:
case STRICTFP:
{
String dc = S.docComment;
long flags = modifiersOpt();
stats.append(classOrInterfaceDeclaration(flags, dc));
break;
}
case INTERFACE:
case CLASS:
stats.append(classOrInterfaceDeclaration(0, S.docComment));
break;
case ASSERT:
if (allowAsserts) {
stats.append(statement());
break;
}
default:
Name name = S.name;
Tree t = term(EXPR | TYPE);
if (S.token == COLON && t.tag == Tree.IDENT) {
S.nextToken();
Tree stat = statement();
stats.append(F.at(pos).Labelled(name, stat));
} else if ((lastmode & TYPE) != 0 &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -