⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 是一款用JAVA 编写的编译器 具有很强的编译功能
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    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 + -