亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? parser.java

?? java編譯器gjc源碼 java編譯環(huán)境
?? JAVA
?? 第 1 頁 / 共 5 頁
字號(hào):
/**
 * @(#)Parser.java	1.39 03/01/23
 *
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.sun.tools.javac.v8.parser;
import com.sun.tools.javac.v8.tree.*;

import com.sun.tools.javac.v8.code.*;

import com.sun.tools.javac.v8.util.*;

import com.sun.tools.javac.v8.tree.Tree.*;


/**
 * The parser maps a token sequence into an abstract syntax
 *  tree. It operates by recursive descent, with code derived
 *  systematically from an LL(1) grammar. For efficiency reasons, an
 *  operator precedence scheme is used for parsing binary operation
 *  expressions.
 */
public class Parser implements Tokens {

    /**
     * 操作符的優(yōu)先級(jí),后面的算符優(yōu)先算法會(huì)用到
     */
    private static final int infixPrecedenceLevels = 10;

    /**
     * 詞法分析類
     */
    private Scanner S;

    /**
     * 語法樹構(gòu)造工廠
     */
    private TreeMaker F;

    /**
     * 錯(cuò)誤診斷的log信息
     */
    private Log log;

    /**
     * 關(guān)鍵字表
     */
    private Keywords keywords;

    /**
     * 對(duì)源語言設(shè)置的類
     */
    private Source source;

    /**
     * The name table.
     */
    private Name.Table names;

    /**
     * Construct a parser from a given scanner, tree factory and log.
     *  @param genEndPos Should endPositions be generated?
     */
    public Parser(Context context, Scanner S, boolean keepDocComments,
            boolean genEndPos) {
        super();
        this.S = S;
        this.F = TreeMaker.instance(context);
        this.log = Log.instance(context);
        this.names = Name.Table.instance(context);
        this.keywords = Keywords.instance(context);
        this.keepDocComments = keepDocComments;
        this.source = Source.instance(context);
        this.allowAsserts = source.ordinal >= Source.JDK1_4.ordinal;
        this.genEndPos = genEndPos;
        if (keepDocComments)
            docComments = new Hashtable();
        if (genEndPos)
            endPositions = new Hashtable();
    }

    /**
      * Switch: should we keep docComments?
      */
    boolean keepDocComments;

    /**
     * Switch: should we recognize assert statements, or just give a warning?
     */
    boolean allowAsserts;

    /**
     * Switch: should we store the ending positions?
     */
    boolean genEndPos;

    /**
     * When terms are parsed, the mode determines which is expected:
     *     mode = EXPR        : an expression
     *     mode = TYPE        : a type
     *     mode = NOPARAMS    : no parameters allowed for type
     */
    static final int EXPR = 1;
    static final int TYPE = 2;
    static final int NOPARAMS = 4;

    /**
     * The current mode.
     */
    private int mode = 0;

    /**
     * The mode of the term that was parsed last.
     */
    private int lastmode = 0;
    static Tree errorTree = new Tree.Erroneous();

    /**
     * Skip forward until a suitable stop token is found.
     */
    private void skip() {
        int nbraces = 0;
        int nparens = 0;
        while (true) {
            switch (S.token) {
            case EOF:

            case CLASS:

            case INTERFACE:
                return;

            case SEMI:
                if (nbraces == 0 && nparens == 0)
                    return;
                break;

            case RBRACE:
                if (nbraces == 0)
                    return;
                nbraces--;
                break;

            case RPAREN:
                if (nparens > 0)
                    nparens--;
                break;

            case LBRACE:
                nbraces++;
                break;

            case LPAREN:
                nparens++;
                break;

            default:

            }
            S.nextToken();
        }
    }

    /**
      * Generate a syntax error at given position using the given argument
      *  unless one was already reported at the same position, then skip.
      */
    private Tree syntaxError(int pos, String key, String arg) {
        if (pos != S.errPos)
            log.error(pos, key, arg);
        skip();
        S.errPos = pos;
        return errorTree;
    }

    /**
      * Generate a syntax error at given position unless one was already
      *  reported at the same position, then skip.
      */
    private Tree syntaxError(int pos, String key) {
        return syntaxError(pos, key, null);
    }

    /**
      * Generate a syntax error at current position unless one was already reported
      *  at the same position, then skip.
      */
    private Tree syntaxError(String key) {
        return syntaxError(S.pos, key, null);
    }

    /**
      * Generate a syntax error at current position unless one was already reported
      *  at the same position, then skip.
      */
    private Tree syntaxError(String key, String arg) {
        return syntaxError(S.pos, key, arg);
    }

    /**
      * 如果下一個(gè)輸入的字符和前一個(gè)匹配則繼續(xù),否則拋出錯(cuò)誤。
      */
    private void accept(int token) {
        if (S.token == token) {
            S.nextToken();
        } else {
            int pos = Position.line(S.pos) > Position.line(S.prevEndPos + 1) ?
                    S.prevEndPos + 1 : S.pos;
            syntaxError(pos, "expected", keywords.token2string(token));
            if (S.token == token)
                S.nextToken();
        }
    }

    /**
      * 報(bào)告表達(dá)式或類型起始錯(cuò)誤
      */
    Tree illegal(int pos) {
        if ((mode & EXPR) != 0)
            return syntaxError(pos, "illegal.start.of.expr");
        else
            return syntaxError(pos, "illegal.start.of.type");
    }

    /**
      * 報(bào)告當(dāng)前位置表達(dá)式或類型起始錯(cuò)誤
      */
    Tree illegal() {
        return illegal(S.pos);
    }

    /**
      *用來存放文件注釋的hashtable
      */
    Hashtable docComments;

    /**
     * Make an entry into docComments hashtable,
     *  provided flag keepDocComments is set and given doc comment is non-null.
     *  @param tree   The tree to be used as index in the hashtable
     *  @param dc     The doc comment to associate with the tree, or null.
     */
    void attach(Tree tree, String dc) {
        if (keepDocComments && dc != null) {
            docComments.put(tree, dc);
        }
    }

    /**
      * A hashtable to store ending positions
      *  of source ranges indexed by the tree nodes.
      *  Defined only if option flag genEndPos is set.
      */
    Hashtable endPositions;

    /**
     * Make an entry into endPositions hashtable, provided flag
     *  genEndPos is set. Note that this method is usually hand-inlined.
     *  @param tree   The tree to be used as index in the hashtable
     *  @param endPos The ending position to associate with the tree.
     */
    void storeEnd(Tree tree, int endpos) {
        if (genEndPos)
            endPositions.put(tree, new Integer(endpos));
    }

    /**
      * Ident = IDENTIFIER
      */
    Name ident() {
        if (S.token == IDENTIFIER) {
            Name name = S.name;
            S.nextToken();
            return name;
        }
        if (S.token == ASSERT) {//判斷是否識(shí)別assert語法,是報(bào)錯(cuò)還是僅僅警告
            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 {
            accept(IDENTIFIER);
            return names.error;
        }
    }

    /**
      * Qualident = Ident { DOT Ident }
      */
    Tree qualident() {
        Tree t = F.at(S.pos).Ident(ident());
        while (S.token == DOT) {
            int pos = S.pos;
            S.nextToken();
            t = F.at(pos).Select(t, ident());
        }
        return t;
    }

    /**
      * Literal =
      *	   INTLITERAL
      *	 | LONGLITERAL
      *	 | FLOATLITERAL
      *	 | DOUBLELITERAL
      *	 | CHARLITERAL
      *	 | STRINGLITERAL
      *       | TRUE
      *       | FALSE
      *       | NULL
      */
    Tree literal(Name prefix) {
        int pos = S.pos;
        Tree t = errorTree;
        switch (S.token) {
        case INTLITERAL:
            try {
                t = F.at(pos).Literal(Type.INT,
                        new Integer(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(Type.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:
            {
                Float n = Float.valueOf(S.stringVal());
                if (n.floatValue() == 0.0F && !isZero(S.stringVal()))
                    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(Type.FLOAT, n);
                break;
            }

        case DOUBLELITERAL:
            {
                Double n = Double.valueOf(S.stringVal());
                if (n.doubleValue() == 0.0 && !isZero(S.stringVal()))
                    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(Type.DOUBLE, n);
                break;
            }

        case CHARLITERAL:
            t = F.at(pos).Literal(Type.CHAR, new Integer(S.stringVal().charAt(0)));
            break;

        case STRINGLITERAL:
            t = F.at(pos).Literal(Type.CLASS, S.stringVal());
            break;

        case TRUE:

        case FALSE:

        case NULL:
            t = F.at(pos).Ident(S.name);
            break;

        default:
            assert false;

        }
        S.nextToken();
        return t;
    }

    boolean isZero(String s) {
        char[] cs = s.toCharArray();
        int i = 0;
        while (i < cs.length && (cs[i] == '0' || cs[i] == '.'))
            i++;
        return !(i < cs.length && ('1' <= cs[i] && cs[i] <= '9'));
    }

    String strval(Name prefix) {
        String s = S.stringVal();
        return (prefix.len == 0) ? s : prefix + s;
    }

    /**
      * terms can be either expressions or types.
      */
    Tree expression() {
        return term(EXPR);
    }

    Tree type() {
        return term(TYPE);
    }

    Tree term(int newmode) {
        int prevmode = mode;
        mode = newmode;
        Tree t = term();
        lastmode = mode;
        mode = prevmode;
        return t;
    }

    /**
      *  Expression = Expression1 [ExpressionRest]
      *  ExpressionRest = [AssignmentOperator Expression1]
      *  AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" |  "&=" | "|=" | "^=" |
      *                       "%=" | "<<=" | ">>=" | ">>>="
      *  Type = Type1
      *  TypeNoParams = TypeNoParams1
      *  StatementExpression = Expression
      *  ConstantExpression = Expression
      */
    Tree term() {
        Tree t = term1();
        if ((mode & EXPR) != 0 && S.token == EQ || PLUSEQ <= S.token &&
                S.token <= GTGTGTEQ)
            return termRest(t);
        else
            return t;
    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产传媒欧美日韩成人| 国产精品正在播放| 久久久99精品免费观看| 高清成人免费视频| 日本vs亚洲vs韩国一区三区| 国产精品成人免费在线| 3atv一区二区三区| 色老汉一区二区三区| 国内精品伊人久久久久av影院 | 精品福利av导航| 欧洲中文字幕精品| 成人高清在线视频| 狠狠网亚洲精品| 日韩制服丝袜av| 亚洲精品免费看| 国产精品久久久爽爽爽麻豆色哟哟 | 日日噜噜夜夜狠狠视频欧美人| 国产婷婷色一区二区三区在线| 538prom精品视频线放| 色综合久久中文字幕| 风流少妇一区二区| 精品一区二区三区的国产在线播放 | 久久国产精品免费| 天堂av在线一区| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品久久三| 中文字幕欧美日韩一区| 久久久精品国产免费观看同学| 欧美一区二区网站| 91精品国产综合久久婷婷香蕉| 在线亚洲一区二区| 国产亚洲成av人在线观看导航| 欧美一区二区在线不卡| 8x8x8国产精品| 欧美日韩精品一区二区在线播放| 不卡电影一区二区三区| jiyouzz国产精品久久| 国产成人免费高清| 国产夫妻精品视频| 国产成人av电影免费在线观看| 国产一区视频导航| 日本成人在线不卡视频| 日韩电影在线免费看| 日精品一区二区三区| 丝袜诱惑制服诱惑色一区在线观看 | 99re这里只有精品首页| 成人高清av在线| 91年精品国产| 在线免费av一区| 欧美日韩视频不卡| 日韩一区国产二区欧美三区| 日韩一卡二卡三卡四卡| 精品99999| 国产亚洲精品精华液| 国产精品美女久久久久久久| 亚洲欧美综合另类在线卡通| 亚洲丝袜精品丝袜在线| 亚洲图片一区二区| 蜜臀久久99精品久久久画质超高清 | 亚洲高清免费在线| 日韩成人精品视频| 国产自产2019最新不卡| 国产91精品久久久久久久网曝门| 国产成人综合在线| 色妹子一区二区| 91精品国产欧美一区二区成人| 日韩精品中文字幕在线不卡尤物| 精品黑人一区二区三区久久| 欧美激情艳妇裸体舞| 国产精品美女久久久久久2018 | 一区二区三区在线看| 天天色天天爱天天射综合| 黄色资源网久久资源365| 丰满少妇久久久久久久| 欧美性生交片4| 精品理论电影在线观看| 亚洲人成伊人成综合网小说| 视频一区二区欧美| 成人美女视频在线观看18| 在线看国产日韩| 久久综合九色综合久久久精品综合| 国产午夜精品福利| 午夜免费欧美电影| 国产aⅴ综合色| 777奇米成人网| 国产精品国产三级国产普通话99 | 亚洲伦理在线精品| 免费的成人av| 91偷拍与自偷拍精品| 日韩精品一区在线观看| 亚洲另类在线视频| 国产成人精品综合在线观看 | 日韩美女天天操| 亚洲欧洲精品天堂一级 | 136国产福利精品导航| 天堂va蜜桃一区二区三区漫画版| 粉嫩av一区二区三区| 欧美人狂配大交3d怪物一区| 国产精品视频一二三| 日本中文字幕一区二区有限公司| 成人免费视频一区| 精品日韩在线观看| 五月天亚洲精品| 99精品视频在线观看| 久久人人97超碰com| 天堂久久久久va久久久久| 91免费在线看| 国产精品免费av| 国产乱码精品一区二区三区av| 欧美色成人综合| 亚洲女性喷水在线观看一区| 国产在线精品免费| 欧美va在线播放| 午夜av一区二区三区| 91视频www| 1000精品久久久久久久久| 国产九色精品成人porny| 日韩视频在线你懂得| 亚洲国产欧美另类丝袜| 色94色欧美sute亚洲线路一久| 欧美激情自拍偷拍| 国产成人精品免费一区二区| 欧美大片国产精品| 免费成人在线视频观看| 在线91免费看| 日韩精品国产欧美| 91麻豆精品国产| 午夜电影网亚洲视频| 欧美色综合网站| 亚洲午夜激情网页| 欧美日韩国产一级片| 亚洲五码中文字幕| 欧美日韩激情一区二区| 亚洲超碰97人人做人人爱| 日本韩国一区二区三区| 一区二区三区四区中文字幕| 91亚洲国产成人精品一区二区三 | 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 精品日产卡一卡二卡麻豆| 麻豆精品一区二区综合av| 日韩一区二区在线看| 久久se精品一区二区| 久久天天做天天爱综合色| 精品一区二区三区免费观看| 久久先锋影音av| 国产a级毛片一区| 亚洲精品视频一区二区| 在线看不卡av| 男人的j进女人的j一区| 精品久久久久久久久久久久包黑料 | 激情小说亚洲一区| 国产午夜一区二区三区| 懂色av一区二区在线播放| 亚洲视频你懂的| 欧美视频你懂的| 久久99热这里只有精品| 国产三级精品在线| 一本久久精品一区二区| 午夜国产不卡在线观看视频| 欧美r级电影在线观看| 国产成人激情av| 亚洲日本va午夜在线影院| 日韩欧美一区在线| 国产成人在线色| 亚洲综合在线电影| 日韩久久精品一区| 不卡在线观看av| 午夜亚洲国产au精品一区二区| 精品精品国产高清a毛片牛牛| 国产91精品一区二区麻豆网站| 一区二区三区四区乱视频| 制服.丝袜.亚洲.另类.中文| 国产精品影音先锋| 亚洲国产精品欧美一二99| 日韩视频123| 99热国产精品| 男人的天堂久久精品| 国产精品乱子久久久久| 欧美日韩亚洲综合在线| 国产精品亚洲一区二区三区在线 | 紧缚奴在线一区二区三区| 国产精品三级在线观看| 欧美日韩一本到| 成人一区二区三区| 天天综合日日夜夜精品| 中文字幕 久热精品 视频在线 | 中文一区一区三区高中清不卡| 欧美三级中文字| 成人性色生活片| 日韩精品成人一区二区三区| 中文字幕第一区第二区| 日韩精品中文字幕一区二区三区| 成人高清免费观看| 六月丁香婷婷久久| 亚洲欧美日韩在线| 久久久777精品电影网影网 | 成人av电影观看| 久久er精品视频| 五月婷婷久久丁香| 亚洲精品乱码久久久久久黑人|