270 } |
270 } |
271 S.nextToken(); |
271 S.nextToken(); |
272 } |
272 } |
273 } |
273 } |
274 |
274 |
275 private JCErroneous syntaxError(int pos, String key, Object... arg) { |
275 private JCErroneous syntaxError(int pos, String key, Token... args) { |
276 return syntaxError(pos, null, key, arg); |
276 return syntaxError(pos, null, key, args); |
277 } |
277 } |
278 |
278 |
279 private JCErroneous syntaxError(int pos, List<JCTree> errs, String key, Object... arg) { |
279 private JCErroneous syntaxError(int pos, List<JCTree> errs, String key, Token... args) { |
280 setErrorEndPos(pos); |
280 setErrorEndPos(pos); |
281 reportSyntaxError(pos, key, arg); |
281 reportSyntaxError(pos, key, (Object[])args); |
282 return toP(F.at(pos).Erroneous(errs)); |
282 return toP(F.at(pos).Erroneous(errs)); |
283 } |
283 } |
284 |
284 |
285 private int errorPos = Position.NOPOS; |
285 private int errorPos = Position.NOPOS; |
286 /** |
286 /** |
287 * Report a syntax error at given position using the given |
287 * Report a syntax error at given position using the given |
288 * argument unless one was already reported at the same position. |
288 * argument unless one was already reported at the same position. |
289 */ |
289 */ |
290 private void reportSyntaxError(int pos, String key, Object... arg) { |
290 private void reportSyntaxError(int pos, String key, Object... args) { |
291 if (pos > S.errPos() || pos == Position.NOPOS) { |
291 if (pos > S.errPos() || pos == Position.NOPOS) { |
292 if (S.token() == EOF) |
292 if (S.token() == EOF) |
293 log.error(pos, "premature.eof"); |
293 log.error(pos, "premature.eof"); |
294 else |
294 else |
295 log.error(pos, key, arg); |
295 log.error(pos, key, args); |
296 } |
296 } |
297 S.errPos(pos); |
297 S.errPos(pos); |
298 if (S.pos() == errorPos) |
298 if (S.pos() == errorPos) |
299 S.nextToken(); // guarantee progress |
299 S.nextToken(); // guarantee progress |
300 errorPos = S.pos(); |
300 errorPos = S.pos(); |
309 } |
309 } |
310 |
310 |
311 /** Generate a syntax error at current position unless one was |
311 /** Generate a syntax error at current position unless one was |
312 * already reported at the same position. |
312 * already reported at the same position. |
313 */ |
313 */ |
314 private JCErroneous syntaxError(String key, String arg) { |
314 private JCErroneous syntaxError(String key, Token arg) { |
315 return syntaxError(S.pos(), key, arg); |
315 return syntaxError(S.pos(), key, arg); |
316 } |
316 } |
317 |
317 |
318 /** If next input token matches given token, skip it, otherwise report |
318 /** If next input token matches given token, skip it, otherwise report |
319 * an error. |
319 * an error. |
321 public void accept(Token token) { |
321 public void accept(Token token) { |
322 if (S.token() == token) { |
322 if (S.token() == token) { |
323 S.nextToken(); |
323 S.nextToken(); |
324 } else { |
324 } else { |
325 setErrorEndPos(S.pos()); |
325 setErrorEndPos(S.pos()); |
326 reportSyntaxError(S.prevEndPos(), "expected", keywords.token2string(token)); |
326 reportSyntaxError(S.prevEndPos(), "expected", token); |
327 } |
327 } |
328 } |
328 } |
329 |
329 |
330 /** Report an illegal start of expression/type error at given position. |
330 /** Report an illegal start of expression/type error at given position. |
331 */ |
331 */ |
347 /** Diagnose a modifier flag from the set, if any. */ |
347 /** Diagnose a modifier flag from the set, if any. */ |
348 void checkNoMods(long mods) { |
348 void checkNoMods(long mods) { |
349 if (mods != 0) { |
349 if (mods != 0) { |
350 long lowestMod = mods & -mods; |
350 long lowestMod = mods & -mods; |
351 log.error(S.pos(), "mod.not.allowed.here", |
351 log.error(S.pos(), "mod.not.allowed.here", |
352 Flags.toString(lowestMod).trim()); |
352 Flags.asFlagSet(lowestMod)); |
353 } |
353 } |
354 } |
354 } |
355 |
355 |
356 /* ---------- doc comments --------- */ |
356 /* ---------- doc comments --------- */ |
357 |
357 |
1178 args.append(expression()); |
1178 args.append(expression()); |
1179 } |
1179 } |
1180 } |
1180 } |
1181 accept(RPAREN); |
1181 accept(RPAREN); |
1182 } else { |
1182 } else { |
1183 syntaxError(S.pos(), "expected", keywords.token2string(LPAREN)); |
1183 syntaxError(S.pos(), "expected", LPAREN); |
1184 } |
1184 } |
1185 return args.toList(); |
1185 return args.toList(); |
1186 } |
1186 } |
1187 |
1187 |
1188 JCMethodInvocation arguments(List<JCExpression> typeArgs, JCExpression t) { |
1188 JCMethodInvocation arguments(List<JCExpression> typeArgs, JCExpression t) { |
1276 S.nextToken(); |
1276 S.nextToken(); |
1277 return F.at(pos).Wildcard(t, type()); |
1277 return F.at(pos).Wildcard(t, type()); |
1278 } else if (S.token() == IDENTIFIER) { |
1278 } else if (S.token() == IDENTIFIER) { |
1279 //error recovery |
1279 //error recovery |
1280 reportSyntaxError(S.prevEndPos(), "expected3", |
1280 reportSyntaxError(S.prevEndPos(), "expected3", |
1281 keywords.token2string(GT), |
1281 GT, EXTENDS, SUPER); |
1282 keywords.token2string(EXTENDS), |
|
1283 keywords.token2string(SUPER)); |
|
1284 TypeBoundKind t = F.at(Position.NOPOS).TypeBoundKind(BoundKind.UNBOUND); |
1282 TypeBoundKind t = F.at(Position.NOPOS).TypeBoundKind(BoundKind.UNBOUND); |
1285 JCExpression wc = toP(F.at(pos).Wildcard(t, null)); |
1283 JCExpression wc = toP(F.at(pos).Wildcard(t, null)); |
1286 JCIdent id = toP(F.at(S.pos()).Ident(ident())); |
1284 JCIdent id = toP(F.at(S.pos()).Ident(ident())); |
1287 return F.at(pos).Erroneous(List.<JCTree>of(wc, id)); |
1285 return F.at(pos).Erroneous(List.<JCTree>of(wc, id)); |
1288 } else { |
1286 } else { |
1390 return e; |
1388 return e; |
1391 } else if (S.token() == LPAREN) { |
1389 } else if (S.token() == LPAREN) { |
1392 return classCreatorRest(newpos, null, typeArgs, t); |
1390 return classCreatorRest(newpos, null, typeArgs, t); |
1393 } else { |
1391 } else { |
1394 reportSyntaxError(S.pos(), "expected2", |
1392 reportSyntaxError(S.pos(), "expected2", |
1395 keywords.token2string(LPAREN), |
1393 LPAREN, LBRACKET); |
1396 keywords.token2string(LBRACKET)); |
|
1397 t = toP(F.at(newpos).NewClass(null, typeArgs, t, List.<JCExpression>nil(), null)); |
1394 t = toP(F.at(newpos).NewClass(null, typeArgs, t, List.<JCExpression>nil(), null)); |
1398 return toP(F.at(newpos).Erroneous(List.<JCTree>of(t))); |
1395 return toP(F.at(newpos).Erroneous(List.<JCTree>of(t))); |
1399 } |
1396 } |
1400 } |
1397 } |
1401 |
1398 |
1498 JCBlock block(int pos, long flags) { |
1495 JCBlock block(int pos, long flags) { |
1499 accept(LBRACE); |
1496 accept(LBRACE); |
1500 List<JCStatement> stats = blockStatements(); |
1497 List<JCStatement> stats = blockStatements(); |
1501 JCBlock t = F.at(pos).Block(flags, stats); |
1498 JCBlock t = F.at(pos).Block(flags, stats); |
1502 while (S.token() == CASE || S.token() == DEFAULT) { |
1499 while (S.token() == CASE || S.token() == DEFAULT) { |
1503 syntaxError("orphaned", keywords.token2string(S.token())); |
1500 syntaxError("orphaned", S.token()); |
1504 switchBlockStatementGroups(); |
1501 switchBlockStatementGroups(); |
1505 } |
1502 } |
1506 // the Block node has a field "endpos" for first char of last token, which is |
1503 // the Block node has a field "endpos" for first char of last token, which is |
1507 // usually but not necessarily the last char of the last token. |
1504 // usually but not necessarily the last char of the last token. |
1508 t.endpos = S.pos(); |
1505 t.endpos = S.pos(); |
1840 case RBRACE: case EOF: |
1837 case RBRACE: case EOF: |
1841 return cases.toList(); |
1838 return cases.toList(); |
1842 default: |
1839 default: |
1843 S.nextToken(); // to ensure progress |
1840 S.nextToken(); // to ensure progress |
1844 syntaxError(pos, "expected3", |
1841 syntaxError(pos, "expected3", |
1845 keywords.token2string(CASE), |
1842 CASE, DEFAULT, RBRACE); |
1846 keywords.token2string(DEFAULT), |
|
1847 keywords.token2string(RBRACE)); |
|
1848 } |
1843 } |
1849 } |
1844 } |
1850 } |
1845 } |
1851 |
1846 |
1852 /** MoreStatementExpressions = { COMMA StatementExpression } |
1847 /** MoreStatementExpressions = { COMMA StatementExpression } |
2108 JCExpression init = null; |
2103 JCExpression init = null; |
2109 if (S.token() == EQ) { |
2104 if (S.token() == EQ) { |
2110 S.nextToken(); |
2105 S.nextToken(); |
2111 init = variableInitializer(); |
2106 init = variableInitializer(); |
2112 } |
2107 } |
2113 else if (reqInit) syntaxError(S.pos(), "expected", keywords.token2string(EQ)); |
2108 else if (reqInit) syntaxError(S.pos(), "expected", EQ); |
2114 JCVariableDecl result = |
2109 JCVariableDecl result = |
2115 toP(F.at(pos).VarDef(mods, name, type, init)); |
2110 toP(F.at(pos).VarDef(mods, name, type, init)); |
2116 attach(result, dc); |
2111 attach(result, dc); |
2117 return result; |
2112 return result; |
2118 } |
2113 } |
2239 setErrorEndPos(S.pos()); |
2234 setErrorEndPos(S.pos()); |
2240 } else { |
2235 } else { |
2241 errs = List.<JCTree>of(mods); |
2236 errs = List.<JCTree>of(mods); |
2242 } |
2237 } |
2243 return toP(F.Exec(syntaxError(pos, errs, "expected3", |
2238 return toP(F.Exec(syntaxError(pos, errs, "expected3", |
2244 keywords.token2string(CLASS), |
2239 CLASS, INTERFACE, ENUM))); |
2245 keywords.token2string(INTERFACE), |
|
2246 keywords.token2string(ENUM)))); |
|
2247 } |
2240 } |
2248 } else { |
2241 } else { |
2249 if (S.token() == ENUM) { |
2242 if (S.token() == ENUM) { |
2250 log.error(S.pos(), "enums.not.supported.in.source", source.name); |
2243 log.error(S.pos(), "enums.not.supported.in.source", source.name); |
2251 allowEnums = true; |
2244 allowEnums = true; |
2258 setErrorEndPos(S.pos()); |
2251 setErrorEndPos(S.pos()); |
2259 } else { |
2252 } else { |
2260 errs = List.<JCTree>of(mods); |
2253 errs = List.<JCTree>of(mods); |
2261 } |
2254 } |
2262 return toP(F.Exec(syntaxError(pos, errs, "expected2", |
2255 return toP(F.Exec(syntaxError(pos, errs, "expected2", |
2263 keywords.token2string(CLASS), |
2256 CLASS, INTERFACE))); |
2264 keywords.token2string(INTERFACE)))); |
|
2265 } |
2257 } |
2266 } |
2258 } |
2267 |
2259 |
2268 /** ClassDeclaration = CLASS Ident TypeParametersOpt [EXTENDS Type] |
2260 /** ClassDeclaration = CLASS Ident TypeParametersOpt [EXTENDS Type] |
2269 * [IMPLEMENTS TypeList] ClassBody |
2261 * [IMPLEMENTS TypeList] ClassBody |
2358 if (S.token() == RBRACE || S.token() == SEMI) break; |
2350 if (S.token() == RBRACE || S.token() == SEMI) break; |
2359 defs.append(enumeratorDeclaration(enumName)); |
2351 defs.append(enumeratorDeclaration(enumName)); |
2360 } |
2352 } |
2361 if (S.token() != SEMI && S.token() != RBRACE) { |
2353 if (S.token() != SEMI && S.token() != RBRACE) { |
2362 defs.append(syntaxError(S.pos(), "expected3", |
2354 defs.append(syntaxError(S.pos(), "expected3", |
2363 keywords.token2string(COMMA), |
2355 COMMA, RBRACE, SEMI)); |
2364 keywords.token2string(RBRACE), |
|
2365 keywords.token2string(SEMI))); |
|
2366 S.nextToken(); |
2356 S.nextToken(); |
2367 } |
2357 } |
2368 } |
2358 } |
2369 if (S.token() == SEMI) { |
2359 if (S.token() == SEMI) { |
2370 S.nextToken(); |
2360 S.nextToken(); |
2529 pos = S.pos(); |
2519 pos = S.pos(); |
2530 List<JCTree> err = isVoid |
2520 List<JCTree> err = isVoid |
2531 ? List.<JCTree>of(toP(F.at(pos).MethodDef(mods, name, type, typarams, |
2521 ? List.<JCTree>of(toP(F.at(pos).MethodDef(mods, name, type, typarams, |
2532 List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null))) |
2522 List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null))) |
2533 : null; |
2523 : null; |
2534 return List.<JCTree>of(syntaxError(S.pos(), err, "expected", keywords.token2string(LPAREN))); |
2524 return List.<JCTree>of(syntaxError(S.pos(), err, "expected", LPAREN)); |
2535 } |
2525 } |
2536 } |
2526 } |
2537 } |
2527 } |
2538 } |
2528 } |
2539 } |
2529 } |