langtools/src/share/classes/com/sun/tools/javac/parser/Parser.java
changeset 939 38e24969c7e9
parent 735 372aa565a221
child 1258 1cf37d8837d1
equal deleted inserted replaced
938:13aae74ca013 939:38e24969c7e9
   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) {
  1251             default:
  1251             default:
  1252                 accept(GT);
  1252                 accept(GT);
  1253                 break;
  1253                 break;
  1254             }
  1254             }
  1255         } else {
  1255         } else {
  1256             syntaxError(S.pos(), "expected", keywords.token2string(LT));
  1256             syntaxError(S.pos(), "expected", LT);
  1257         }
  1257         }
  1258         return args.toList();
  1258         return args.toList();
  1259     }
  1259     }
  1260 
  1260 
  1261     /** TypeArgument = Type
  1261     /** TypeArgument = Type
  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     }