langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
changeset 10950 e87b50888909
parent 10948 063463f6535f
child 11055 ec1418effa77
equal deleted inserted replaced
10949:42f7cc0468dd 10950:e87b50888909
    35 import com.sun.tools.javac.util.*;
    35 import com.sun.tools.javac.util.*;
    36 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
    36 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
    37 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
    37 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
    38 import com.sun.tools.javac.util.List;
    38 import com.sun.tools.javac.util.List;
    39 
    39 
       
    40 import static com.sun.tools.javac.parser.Tokens.TokenKind.*;
       
    41 import static com.sun.tools.javac.parser.Tokens.TokenKind.ASSERT;
       
    42 import static com.sun.tools.javac.parser.Tokens.TokenKind.CASE;
       
    43 import static com.sun.tools.javac.parser.Tokens.TokenKind.CATCH;
       
    44 import static com.sun.tools.javac.parser.Tokens.TokenKind.EQ;
       
    45 import static com.sun.tools.javac.parser.Tokens.TokenKind.GT;
       
    46 import static com.sun.tools.javac.parser.Tokens.TokenKind.IMPORT;
       
    47 import static com.sun.tools.javac.parser.Tokens.TokenKind.LT;
    40 import static com.sun.tools.javac.util.ListBuffer.lb;
    48 import static com.sun.tools.javac.util.ListBuffer.lb;
    41 import static com.sun.tools.javac.parser.Tokens.TokenKind.*;
    49 import static com.sun.tools.javac.tree.JCTree.Tag.*;
    42 
    50 
    43 /** The parser maps a token sequence into an abstract syntax
    51 /** The parser maps a token sequence into an abstract syntax
    44  *  tree. It operates by recursive descent, with code derived
    52  *  tree. It operates by recursive descent, with code derived
    45  *  systematically from an LL(1) grammar. For efficiency reasons, an
    53  *  systematically from an LL(1) grammar. For efficiency reasons, an
    46  *  operator precedence scheme is used for parsing binary operation
    54  *  operator precedence scheme is used for parsing binary operation
   756             }
   764             }
   757         }
   765         }
   758         Assert.check(top == 0);
   766         Assert.check(top == 0);
   759         t = odStack[0];
   767         t = odStack[0];
   760 
   768 
   761         if (t.getTag() == JCTree.PLUS) {
   769         if (t.hasTag(JCTree.Tag.PLUS)) {
   762             StringBuffer buf = foldStrings(t);
   770             StringBuffer buf = foldStrings(t);
   763             if (buf != null) {
   771             if (buf != null) {
   764                 t = toP(F.at(startPos).Literal(TypeTags.CLASS, buf.toString()));
   772                 t = toP(F.at(startPos).Literal(TypeTags.CLASS, buf.toString()));
   765             }
   773             }
   766         }
   774         }
   789         protected StringBuffer foldStrings(JCTree tree) {
   797         protected StringBuffer foldStrings(JCTree tree) {
   790             if (!allowStringFolding)
   798             if (!allowStringFolding)
   791                 return null;
   799                 return null;
   792             List<String> buf = List.nil();
   800             List<String> buf = List.nil();
   793             while (true) {
   801             while (true) {
   794                 if (tree.getTag() == JCTree.LITERAL) {
   802                 if (tree.hasTag(LITERAL)) {
   795                     JCLiteral lit = (JCLiteral) tree;
   803                     JCLiteral lit = (JCLiteral) tree;
   796                     if (lit.typetag == TypeTags.CLASS) {
   804                     if (lit.typetag == TypeTags.CLASS) {
   797                         StringBuffer sbuf =
   805                         StringBuffer sbuf =
   798                             new StringBuffer((String)lit.value);
   806                             new StringBuffer((String)lit.value);
   799                         while (buf.nonEmpty()) {
   807                         while (buf.nonEmpty()) {
   800                             sbuf.append(buf.head);
   808                             sbuf.append(buf.head);
   801                             buf = buf.tail;
   809                             buf = buf.tail;
   802                         }
   810                         }
   803                         return sbuf;
   811                         return sbuf;
   804                     }
   812                     }
   805                 } else if (tree.getTag() == JCTree.PLUS) {
   813                 } else if (tree.hasTag(JCTree.Tag.PLUS)) {
   806                     JCBinary op = (JCBinary)tree;
   814                     JCBinary op = (JCBinary)tree;
   807                     if (op.rhs.getTag() == JCTree.LITERAL) {
   815                     if (op.rhs.hasTag(LITERAL)) {
   808                         JCLiteral lit = (JCLiteral) op.rhs;
   816                         JCLiteral lit = (JCLiteral) op.rhs;
   809                         if (lit.typetag == TypeTags.CLASS) {
   817                         if (lit.typetag == TypeTags.CLASS) {
   810                             buf = buf.prepend((String) lit.value);
   818                             buf = buf.prepend((String) lit.value);
   811                             tree = op.lhs;
   819                             tree = op.lhs;
   812                             continue;
   820                             continue;
   898                 nextToken();
   906                 nextToken();
   899                 mode = EXPR | TYPE | NOPARAMS;
   907                 mode = EXPR | TYPE | NOPARAMS;
   900                 t = term3();
   908                 t = term3();
   901                 if ((mode & TYPE) != 0 && token.kind == LT) {
   909                 if ((mode & TYPE) != 0 && token.kind == LT) {
   902                     // Could be a cast to a parameterized type
   910                     // Could be a cast to a parameterized type
   903                     int op = JCTree.LT;
   911                     JCTree.Tag op = JCTree.Tag.LT;
   904                     int pos1 = token.pos;
   912                     int pos1 = token.pos;
   905                     nextToken();
   913                     nextToken();
   906                     mode &= (EXPR | TYPE);
   914                     mode &= (EXPR | TYPE);
   907                     mode |= TYPEARG;
   915                     mode |= TYPEARG;
   908                     JCExpression t1 = term3();
   916                     JCExpression t1 = term3();
  1152             }
  1160             }
  1153         }
  1161         }
  1154         while ((token.kind == PLUSPLUS || token.kind == SUBSUB) && (mode & EXPR) != 0) {
  1162         while ((token.kind == PLUSPLUS || token.kind == SUBSUB) && (mode & EXPR) != 0) {
  1155             mode = EXPR;
  1163             mode = EXPR;
  1156             t = to(F.at(token.pos).Unary(
  1164             t = to(F.at(token.pos).Unary(
  1157                   token.kind == PLUSPLUS ? JCTree.POSTINC : JCTree.POSTDEC, t));
  1165                   token.kind == PLUSPLUS ? POSTINC : POSTDEC, t));
  1158             nextToken();
  1166             nextToken();
  1159         }
  1167         }
  1160         return toP(t);
  1168         return toP(t);
  1161     }
  1169     }
  1162 
  1170 
  1625                 }
  1633                 }
  1626                 /* fall through to default */
  1634                 /* fall through to default */
  1627             default:
  1635             default:
  1628                 Token prevToken = token;
  1636                 Token prevToken = token;
  1629                 JCExpression t = term(EXPR | TYPE);
  1637                 JCExpression t = term(EXPR | TYPE);
  1630                 if (token.kind == COLON && t.getTag() == JCTree.IDENT) {
  1638                 if (token.kind == COLON && t.hasTag(IDENT)) {
  1631                     nextToken();
  1639                     nextToken();
  1632                     JCStatement stat = parseStatement();
  1640                     JCStatement stat = parseStatement();
  1633                     stats.append(F.at(pos).Labelled(prevToken.name(), stat));
  1641                     stats.append(F.at(pos).Labelled(prevToken.name(), stat));
  1634                 } else if ((lastmode & TYPE) != 0 &&
  1642                 } else if ((lastmode & TYPE) != 0 &&
  1635                            (token.kind == IDENTIFIER ||
  1643                            (token.kind == IDENTIFIER ||
  1700         case FOR: {
  1708         case FOR: {
  1701             nextToken();
  1709             nextToken();
  1702             accept(LPAREN);
  1710             accept(LPAREN);
  1703             List<JCStatement> inits = token.kind == SEMI ? List.<JCStatement>nil() : forInit();
  1711             List<JCStatement> inits = token.kind == SEMI ? List.<JCStatement>nil() : forInit();
  1704             if (inits.length() == 1 &&
  1712             if (inits.length() == 1 &&
  1705                 inits.head.getTag() == JCTree.VARDEF &&
  1713                 inits.head.hasTag(VARDEF) &&
  1706                 ((JCVariableDecl) inits.head).init == null &&
  1714                 ((JCVariableDecl) inits.head).init == null &&
  1707                 token.kind == COLON) {
  1715                 token.kind == COLON) {
  1708                 checkForeach();
  1716                 checkForeach();
  1709                 JCVariableDecl var = (JCVariableDecl)inits.head;
  1717                 JCVariableDecl var = (JCVariableDecl)inits.head;
  1710                 accept(COLON);
  1718                 accept(COLON);
  1833         }
  1841         }
  1834         case ENUM:
  1842         case ENUM:
  1835         default:
  1843         default:
  1836             Token prevToken = token;
  1844             Token prevToken = token;
  1837             JCExpression expr = parseExpression();
  1845             JCExpression expr = parseExpression();
  1838             if (token.kind == COLON && expr.getTag() == JCTree.IDENT) {
  1846             if (token.kind == COLON && expr.hasTag(IDENT)) {
  1839                 nextToken();
  1847                 nextToken();
  1840                 JCStatement stat = parseStatement();
  1848                 JCStatement stat = parseStatement();
  1841                 return F.at(pos).Labelled(prevToken.name(), stat);
  1849                 return F.at(pos).Labelled(prevToken.name(), stat);
  1842             } else {
  1850             } else {
  1843                 // This Exec is an "ExpressionStatement"; it subsumes the terminating semicolon
  1851                 // This Exec is an "ExpressionStatement"; it subsumes the terminating semicolon
  2086      */
  2094      */
  2087     JCExpression annotationFieldValue() {
  2095     JCExpression annotationFieldValue() {
  2088         if (token.kind == IDENTIFIER) {
  2096         if (token.kind == IDENTIFIER) {
  2089             mode = EXPR;
  2097             mode = EXPR;
  2090             JCExpression t1 = term1();
  2098             JCExpression t1 = term1();
  2091             if (t1.getTag() == JCTree.IDENT && token.kind == EQ) {
  2099             if (t1.hasTag(IDENT) && token.kind == EQ) {
  2092                 int pos = token.pos;
  2100                 int pos = token.pos;
  2093                 accept(EQ);
  2101                 accept(EQ);
  2094                 JCExpression v = annotationValue();
  2102                 JCExpression v = annotationValue();
  2095                 return toP(F.at(pos).Assign(t1, v));
  2103                 return toP(F.at(pos).Assign(t1, v));
  2096             } else {
  2104             } else {
  2616                     type = to(F.at(pos).TypeIdent(TypeTags.VOID));
  2624                     type = to(F.at(pos).TypeIdent(TypeTags.VOID));
  2617                     nextToken();
  2625                     nextToken();
  2618                 } else {
  2626                 } else {
  2619                     type = parseType();
  2627                     type = parseType();
  2620                 }
  2628                 }
  2621                 if (token.kind == LPAREN && !isInterface && type.getTag() == JCTree.IDENT) {
  2629                 if (token.kind == LPAREN && !isInterface && type.hasTag(IDENT)) {
  2622                     if (isInterface || tk.name() != className)
  2630                     if (isInterface || tk.name() != className)
  2623                         error(pos, "invalid.meth.decl.ret.type.req");
  2631                         error(pos, "invalid.meth.decl.ret.type.req");
  2624                     return List.of(methodDeclaratorRest(
  2632                     return List.of(methodDeclaratorRest(
  2625                         pos, mods, null, names.init, typarams,
  2633                         pos, mods, null, names.init, typarams,
  2626                         isInterface, true, dc));
  2634                         isInterface, true, dc));
  2813 
  2821 
  2814     /** Check that given tree is a legal expression statement.
  2822     /** Check that given tree is a legal expression statement.
  2815      */
  2823      */
  2816     protected JCExpression checkExprStat(JCExpression t) {
  2824     protected JCExpression checkExprStat(JCExpression t) {
  2817         switch(t.getTag()) {
  2825         switch(t.getTag()) {
  2818         case JCTree.PREINC: case JCTree.PREDEC:
  2826         case PREINC: case PREDEC:
  2819         case JCTree.POSTINC: case JCTree.POSTDEC:
  2827         case POSTINC: case POSTDEC:
  2820         case JCTree.ASSIGN:
  2828         case ASSIGN:
  2821         case JCTree.BITOR_ASG: case JCTree.BITXOR_ASG: case JCTree.BITAND_ASG:
  2829         case BITOR_ASG: case BITXOR_ASG: case BITAND_ASG:
  2822         case JCTree.SL_ASG: case JCTree.SR_ASG: case JCTree.USR_ASG:
  2830         case SL_ASG: case SR_ASG: case USR_ASG:
  2823         case JCTree.PLUS_ASG: case JCTree.MINUS_ASG:
  2831         case PLUS_ASG: case MINUS_ASG:
  2824         case JCTree.MUL_ASG: case JCTree.DIV_ASG: case JCTree.MOD_ASG:
  2832         case MUL_ASG: case DIV_ASG: case MOD_ASG:
  2825         case JCTree.APPLY: case JCTree.NEWCLASS:
  2833         case APPLY: case NEWCLASS:
  2826         case JCTree.ERRONEOUS:
  2834         case ERRONEOUS:
  2827             return t;
  2835             return t;
  2828         default:
  2836         default:
  2829             JCExpression ret = F.at(t.pos).Erroneous(List.<JCTree>of(t));
  2837             JCExpression ret = F.at(t.pos).Erroneous(List.<JCTree>of(t));
  2830             error(ret, "not.stmt");
  2838             error(ret, "not.stmt");
  2831             return ret;
  2839             return ret;
  2834 
  2842 
  2835     /** Return precedence of operator represented by token,
  2843     /** Return precedence of operator represented by token,
  2836      *  -1 if token is not a binary operator. @see TreeInfo.opPrec
  2844      *  -1 if token is not a binary operator. @see TreeInfo.opPrec
  2837      */
  2845      */
  2838     static int prec(TokenKind token) {
  2846     static int prec(TokenKind token) {
  2839         int oc = optag(token);
  2847         JCTree.Tag oc = optag(token);
  2840         return (oc >= 0) ? TreeInfo.opPrec(oc) : -1;
  2848         return (oc != NO_TAG) ? TreeInfo.opPrec(oc) : -1;
  2841     }
  2849     }
  2842 
  2850 
  2843     /**
  2851     /**
  2844      * Return the lesser of two positions, making allowance for either one
  2852      * Return the lesser of two positions, making allowance for either one
  2845      * being unset.
  2853      * being unset.
  2851             return pos1;
  2859             return pos1;
  2852         return (pos1 < pos2 ? pos1 : pos2);
  2860         return (pos1 < pos2 ? pos1 : pos2);
  2853     }
  2861     }
  2854 
  2862 
  2855     /** Return operation tag of binary operator represented by token,
  2863     /** Return operation tag of binary operator represented by token,
  2856      *  -1 if token is not a binary operator.
  2864      *  No_TAG if token is not a binary operator.
  2857      */
  2865      */
  2858     static int optag(TokenKind token) {
  2866     static JCTree.Tag optag(TokenKind token) {
  2859         switch (token) {
  2867         switch (token) {
  2860         case BARBAR:
  2868         case BARBAR:
  2861             return JCTree.OR;
  2869             return OR;
  2862         case AMPAMP:
  2870         case AMPAMP:
  2863             return JCTree.AND;
  2871             return AND;
  2864         case BAR:
  2872         case BAR:
  2865             return JCTree.BITOR;
  2873             return BITOR;
  2866         case BAREQ:
  2874         case BAREQ:
  2867             return JCTree.BITOR_ASG;
  2875             return BITOR_ASG;
  2868         case CARET:
  2876         case CARET:
  2869             return JCTree.BITXOR;
  2877             return BITXOR;
  2870         case CARETEQ:
  2878         case CARETEQ:
  2871             return JCTree.BITXOR_ASG;
  2879             return BITXOR_ASG;
  2872         case AMP:
  2880         case AMP:
  2873             return JCTree.BITAND;
  2881             return BITAND;
  2874         case AMPEQ:
  2882         case AMPEQ:
  2875             return JCTree.BITAND_ASG;
  2883             return BITAND_ASG;
  2876         case EQEQ:
  2884         case EQEQ:
  2877             return JCTree.EQ;
  2885             return JCTree.Tag.EQ;
  2878         case BANGEQ:
  2886         case BANGEQ:
  2879             return JCTree.NE;
  2887             return NE;
  2880         case LT:
  2888         case LT:
  2881             return JCTree.LT;
  2889             return JCTree.Tag.LT;
  2882         case GT:
  2890         case GT:
  2883             return JCTree.GT;
  2891             return JCTree.Tag.GT;
  2884         case LTEQ:
  2892         case LTEQ:
  2885             return JCTree.LE;
  2893             return LE;
  2886         case GTEQ:
  2894         case GTEQ:
  2887             return JCTree.GE;
  2895             return GE;
  2888         case LTLT:
  2896         case LTLT:
  2889             return JCTree.SL;
  2897             return SL;
  2890         case LTLTEQ:
  2898         case LTLTEQ:
  2891             return JCTree.SL_ASG;
  2899             return SL_ASG;
  2892         case GTGT:
  2900         case GTGT:
  2893             return JCTree.SR;
  2901             return SR;
  2894         case GTGTEQ:
  2902         case GTGTEQ:
  2895             return JCTree.SR_ASG;
  2903             return SR_ASG;
  2896         case GTGTGT:
  2904         case GTGTGT:
  2897             return JCTree.USR;
  2905             return USR;
  2898         case GTGTGTEQ:
  2906         case GTGTGTEQ:
  2899             return JCTree.USR_ASG;
  2907             return USR_ASG;
  2900         case PLUS:
  2908         case PLUS:
  2901             return JCTree.PLUS;
  2909             return JCTree.Tag.PLUS;
  2902         case PLUSEQ:
  2910         case PLUSEQ:
  2903             return JCTree.PLUS_ASG;
  2911             return PLUS_ASG;
  2904         case SUB:
  2912         case SUB:
  2905             return JCTree.MINUS;
  2913             return MINUS;
  2906         case SUBEQ:
  2914         case SUBEQ:
  2907             return JCTree.MINUS_ASG;
  2915             return MINUS_ASG;
  2908         case STAR:
  2916         case STAR:
  2909             return JCTree.MUL;
  2917             return MUL;
  2910         case STAREQ:
  2918         case STAREQ:
  2911             return JCTree.MUL_ASG;
  2919             return MUL_ASG;
  2912         case SLASH:
  2920         case SLASH:
  2913             return JCTree.DIV;
  2921             return DIV;
  2914         case SLASHEQ:
  2922         case SLASHEQ:
  2915             return JCTree.DIV_ASG;
  2923             return DIV_ASG;
  2916         case PERCENT:
  2924         case PERCENT:
  2917             return JCTree.MOD;
  2925             return MOD;
  2918         case PERCENTEQ:
  2926         case PERCENTEQ:
  2919             return JCTree.MOD_ASG;
  2927             return MOD_ASG;
  2920         case INSTANCEOF:
  2928         case INSTANCEOF:
  2921             return JCTree.TYPETEST;
  2929             return TYPETEST;
  2922         default:
  2930         default:
  2923             return -1;
  2931             return NO_TAG;
  2924         }
  2932         }
  2925     }
  2933     }
  2926 
  2934 
  2927     /** Return operation tag of unary operator represented by token,
  2935     /** Return operation tag of unary operator represented by token,
  2928      *  -1 if token is not a binary operator.
  2936      *  No_TAG if token is not a binary operator.
  2929      */
  2937      */
  2930     static int unoptag(TokenKind token) {
  2938     static JCTree.Tag unoptag(TokenKind token) {
  2931         switch (token) {
  2939         switch (token) {
  2932         case PLUS:
  2940         case PLUS:
  2933             return JCTree.POS;
  2941             return POS;
  2934         case SUB:
  2942         case SUB:
  2935             return JCTree.NEG;
  2943             return NEG;
  2936         case BANG:
  2944         case BANG:
  2937             return JCTree.NOT;
  2945             return NOT;
  2938         case TILDE:
  2946         case TILDE:
  2939             return JCTree.COMPL;
  2947             return COMPL;
  2940         case PLUSPLUS:
  2948         case PLUSPLUS:
  2941             return JCTree.PREINC;
  2949             return PREINC;
  2942         case SUBSUB:
  2950         case SUBSUB:
  2943             return JCTree.PREDEC;
  2951             return PREDEC;
  2944         default:
  2952         default:
  2945             return -1;
  2953             return NO_TAG;
  2946         }
  2954         }
  2947     }
  2955     }
  2948 
  2956 
  2949     /** Return type tag of basic type represented by token,
  2957     /** Return type tag of basic type represented by token,
  2950      *  -1 if token is not a basic type identifier.
  2958      *  -1 if token is not a basic type identifier.