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

📄 parser.java

📁 是一款用JAVA 编写的编译器 具有很强的编译功能
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     */    void attach(JCTree tree, String dc) {        if (keepDocComments && dc != null) {//          System.out.println("doc comment = ");System.out.println(dc);//DEBUG            docComments.put(tree, dc);        }    }/* -------- source positions ------- */    private int errorEndPos = -1;    private void setErrorEndPos(int errPos) {        if (errPos > errorEndPos)            errorEndPos = errPos;    }    protected int getErrorEndPos() {        return errorEndPos;    }    /**     * Store ending position for a tree.     * @param tree   The tree.     * @param endpos The ending position to associate with the tree.     */    protected void storeEnd(JCTree tree, int endpos) {}    /**     * Store ending position for a tree.  The ending position should     * be the ending position of the current token.     * @param t The tree.     */    protected <T extends JCTree> T to(T t) { return t; }    /**     * Store ending position for a tree.  The ending position should     * be greater of the ending position of the previous token and errorEndPos.     * @param t The tree.     */    protected <T extends JCTree> T toP(T t) { return t; }    /** Get the start position for a tree node.  The start position is     * defined to be the position of the first character of the first     * token of the node's source text.     * @param tree  The tree node     */    public int getStartPos(JCTree tree) {        return TreeInfo.getStartPos(tree);    }    /**     * Get the end position for a tree node.  The end position is     * defined to be the position of the last character of the last     * token of the node's source text.  Returns Position.NOPOS if end     * positions are not generated or the position is otherwise not     * found.     * @param tree  The tree node     */    public int getEndPos(JCTree tree) {        return Position.NOPOS;    }/* ---------- parsing -------------- */    /**     * Ident = IDENTIFIER     */    Name ident() {        if (S.token() == IDENTIFIER) {            Name name = S.name();            S.nextToken();            return name;        } else if (S.token() == ASSERT) {            if (allowAsserts) {                log.error(S.pos(), "assert.as.identifier");                S.nextToken();                return names.error;            } else {                log.warning(S.pos(), "assert.as.identifier");                Name name = S.name();                S.nextToken();                return name;            }        } else if (S.token() == ENUM) {            if (allowEnums) {                log.error(S.pos(), "enum.as.identifier");                S.nextToken();                return names.error;            } else {                log.warning(S.pos(), "enum.as.identifier");                Name name = S.name();                S.nextToken();                return name;            }        } else {            accept(IDENTIFIER);            return names.error;        }}    /**     * Qualident = Ident { DOT Ident }     */    public JCExpression qualident() {        JCExpression t = toP(F.at(S.pos()).Ident(ident()));        while (S.token() == DOT) {            int pos = S.pos();            S.nextToken();            t = toP(F.at(pos).Select(t, ident()));        }        return t;    }    /**     * Literal =     *     INTLITERAL     *   | LONGLITERAL     *   | FLOATLITERAL     *   | DOUBLELITERAL     *   | CHARLITERAL     *   | STRINGLITERAL     *   | TRUE     *   | FALSE     *   | NULL     */    JCExpression literal(Name prefix) {        int pos = S.pos();        JCExpression t = errorTree;        switch (S.token()) {        case INTLITERAL:            try {                t = F.at(pos).Literal(                    TypeTags.INT,                    Convert.string2int(strval(prefix), S.radix()));            } catch (NumberFormatException ex) {                log.error(S.pos(), "int.number.too.large", strval(prefix));            }            break;        case LONGLITERAL:            try {                t = F.at(pos).Literal(                    TypeTags.LONG,                    new Long(Convert.string2long(strval(prefix), S.radix())));            } catch (NumberFormatException ex) {                log.error(S.pos(), "int.number.too.large", strval(prefix));            }            break;        case FLOATLITERAL: {            String proper = (S.radix() == 16 ? ("0x"+ S.stringVal()) : S.stringVal());            Float n;            try {                n = Float.valueOf(proper);            } catch (NumberFormatException ex) {                // error already repoted in scanner                n = Float.NaN;            }            if (n.floatValue() == 0.0f && !isZero(proper))                log.error(S.pos(), "fp.number.too.small");            else if (n.floatValue() == Float.POSITIVE_INFINITY)                log.error(S.pos(), "fp.number.too.large");            else                t = F.at(pos).Literal(TypeTags.FLOAT, n);            break;        }        case DOUBLELITERAL: {            String proper = (S.radix() == 16 ? ("0x"+ S.stringVal()) : S.stringVal());            Double n;            try {                n = Double.valueOf(proper);            } catch (NumberFormatException ex) {                // error already reported in scanner                n = Double.NaN;            }            if (n.doubleValue() == 0.0d && !isZero(proper))                log.error(S.pos(), "fp.number.too.small");            else if (n.doubleValue() == Double.POSITIVE_INFINITY)                log.error(S.pos(), "fp.number.too.large");            else                t = F.at(pos).Literal(TypeTags.DOUBLE, n);            break;        }        case CHARLITERAL:            t = F.at(pos).Literal(                TypeTags.CHAR,                S.stringVal().charAt(0) + 0);            break;        case STRINGLITERAL:            t = F.at(pos).Literal(                TypeTags.CLASS,                S.stringVal());            break;        case TRUE: case FALSE:            t = F.at(pos).Literal(                TypeTags.BOOLEAN,                (S.token() == TRUE ? 1 : 0));            break;        case NULL:            t = F.at(pos).Literal(                TypeTags.BOT,                null);            break;        default:            assert false;        }        if (t == errorTree)            t = F.at(pos).Erroneous();        storeEnd(t, S.endPos());        S.nextToken();        return t;    }//where        boolean isZero(String s) {            char[] cs = s.toCharArray();            int base = ((Character.toLowerCase(s.charAt(1)) == 'x') ? 16 : 10);            int i = ((base==16) ? 2 : 0);            while (i < cs.length && (cs[i] == '0' || cs[i] == '.')) i++;            return !(i < cs.length && (Character.digit(cs[i], base) > 0));        }        String strval(Name prefix) {            String s = S.stringVal();            return (prefix.len == 0) ? s : prefix + s;        }    /** terms can be either expressions or types.     */    public JCExpression expression() {        return term(EXPR);    }    public JCExpression type() {        return term(TYPE);    }    JCExpression term(int newmode) {        int prevmode = mode;        mode = newmode;        JCExpression t = term();        lastmode = mode;        mode = prevmode;        return t;    }    /**     *  Expression = Expression1 [ExpressionRest]     *  ExpressionRest = [AssignmentOperator Expression1]     *  AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" |     *                       "&=" | "|=" | "^=" |     *                       "%=" | "<<=" | ">>=" | ">>>="     *  Type = Type1     *  TypeNoParams = TypeNoParams1     *  StatementExpression = Expression     *  ConstantExpression = Expression     */    JCExpression term() {        JCExpression t = term1();        if ((mode & EXPR) != 0 &&            S.token() == EQ || PLUSEQ.compareTo(S.token()) <= 0 && S.token().compareTo(GTGTGTEQ) <= 0)            return termRest(t);        else            return t;    }    JCExpression termRest(JCExpression t) {        switch (S.token()) {        case EQ: {            int pos = S.pos();            S.nextToken();            mode = EXPR;            JCExpression t1 = term();            return toP(F.at(pos).Assign(t, t1));        }        case PLUSEQ:        case SUBEQ:        case STAREQ:        case SLASHEQ:        case PERCENTEQ:        case AMPEQ:        case BAREQ:        case CARETEQ:        case LTLTEQ:        case GTGTEQ:        case GTGTGTEQ:            int pos = S.pos();            Token token = S.token();            S.nextToken();            mode = EXPR;            JCExpression t1 = term();            return F.at(pos).Assignop(optag(token), t, t1);        default:            return t;        }    }    /** Expression1   = Expression2 [Expression1Rest]     *  Type1         = Type2     *  TypeNoParams1 = TypeNoParams2     */    JCExpression term1() {        JCExpression t = term2();        if ((mode & EXPR) != 0 && S.token() == QUES) {            mode = EXPR;            return term1Rest(t);        } else {            return t;        }    }    /** Expression1Rest = ["?" Expression ":" Expression1]     */    JCExpression term1Rest(JCExpression t) {        if (S.token() == QUES) {            int pos = S.pos();            S.nextToken();            JCExpression t1 = term();            accept(COLON);            JCExpression t2 = term1();            return F.at(pos).Conditional(t, t1, t2);        } else {            return t;        }    }    /** Expression2   = Expression3 [Expression2Rest]     *  Type2         = Type3     *  TypeNoParams2 = TypeNoParams3     */    JCExpression term2() {        JCExpression t = term3();        if ((mode & EXPR) != 0 && prec(S.token()) >= TreeInfo.orPrec) {            mode = EXPR;            return term2Rest(t, TreeInfo.orPrec);        } else {            return t;        }    }    /*  Expression2Rest = {infixop Expression3}     *                  | Expression3 instanceof Type     *  infixop         = "||"     *                  | "&&"     *                  | "|"     *                  | "^"     *                  | "&"     *                  | "==" | "!="     *                  | "<" | ">" | "<=" | ">="     *                  | "<<" | ">>" | ">>>"     *                  | "+" | "-"     *                  | "*" | "/" | "%"     */    JCExpression term2Rest(JCExpression t, int minprec) {        List<JCExpression[]> savedOd = odStackSupply.elems;        JCExpression[] odStack = newOdStack();        List<Token[]> savedOp = opStackSupply.elems;        Token[] opStack = newOpStack();        // optimization, was odStack = new Tree[...]; opStack = new Tree[...];        int top = 0;        odStack[0] = t;        int startPos = S.pos();        Token topOp = ERROR;        while (prec(S.token()) >= minprec) {            opStack[top] = topOp;            top++;            topOp = S.token();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -