📄 parser.java
字号:
*/ 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 + -