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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? scanner.java

?? java編譯器gjc源碼 java編譯環境
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
/**
 * @(#)Scanner.java	1.36 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 java.io.*;

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


/**
 * 這個類就是gjc的詞法分析實現類。
 */
public class Scanner implements Tokens, LayoutCharacters {

    /**
     * The token, set by nextToken().
     */
    int token;

    /**
     * The token's position. pos = line << Position.LINESHIFT + col.
     *  Line and column numbers start at 1.
     */
    int pos;

    /**
     * The last character position of the token.
     */
    int endPos;

    /**
     * The last character position of the previous token.
     */
    int prevEndPos;

    /**
     * The position where a lexical error occurred;
     */
    int errPos = Position.NOPOS;

    /**
     * The name of an identifier or token:
     */
    Name name;

    /**
     * The radix of a numeric literal token.
     */
    int radix;

    /**
     * Has a @deprecated been encountered in last doc comment?
     *  this needs to be reset by client.
     */
    boolean deprecatedFlag = false;

    /**
     * A character buffer for literals.
     */
    private char[] sbuf = new char[128];
    private int sp;

    /**
     * The input buffer, index of next chacter to be read,
     *  index of one past last character in buffer.
     */
    private char[] buf;
    private int bp;
    private int buflen;

    /**
     * The current character.
     */
    private char ch;//當前要處理的字符,下面的line參數和col參數還定義了字符的位置,可以為報錯時顯示信息提供方便

    /**
     * The line number position of the current character.
     */
    private int line;

    /**
     * The column number position of the current character.
     */
    private int col;

    /**
     * The buffer index of the last converted unicode character
     */
    private int unicodeConversionBp = 0;

    /**
     * The log to be used for error reporting.
     */
    private final Log log;

    /**
     * The name table.
     */
    private final Name.Table names;//存放標示符名字的字母表

    /**
     * The keyword table.
     */
    private final Keywords keywords;

    /**
     * Documentation string of the current token.
     */
    String docComment = null;

    /**
     * Buffer for doc comment.
     */
    private char[] buffer;

    /**
     * Number of characters in doc comment buffer.
     */
    private int count;

    /**
     *gjc詞法分析程序的入口和初始化都是在其構造函數Scanner中實現的,
     *它實現了將文件流讀入內存緩沖區,預置當前字符的位置,并采用nextToken()
     *方法讀入下一個標示符。
     *文件讀入實現方法:為了保證讀入并編譯任意大的文件,其采用了動態分配空間
     *的方法首先分配一個空間,在監測到空間不足后,分配的空間翻倍,以此類推,
     *一直到分配空間滿足需求為止,這樣確實可以滿足任意大的文件,但是有可能會
     *造成嚴重的空間浪費,而且文件越大,浪費越明顯。至于改進辦法,目前我還沒有
     *想清楚,如何在空間節約和提高運行速率之間達到一個完美的平衡。
     */
    public Scanner(Context context, InputStream in, String encoding) {
        super();
        this.log = Log.instance(context);
        this.names = Name.Table.instance(context);
        this.keywords = Keywords.instance(context);
        try {
            int bufsize = in.available() + 1;
            if (buf == null || buf.length < bufsize)
                buf = new char[bufsize];
            buflen = 0;
            InputStreamReader reader =//獲取數據流
                    (encoding == null) ? new InputStreamReader(in) :
                    new InputStreamReader(in, encoding);
            while (true) {
                int nread = reader.read(buf, buflen, buf.length - buflen);
                if (nread < 0)
                    nread = 0;
                buflen = buflen + nread;
                if (buflen < buf.length)
                    break;
                char[] newbuf = new char[buflen * 2];//空間擴容
                System.arraycopy(buf, 0, newbuf, 0, buflen);//讀入部分內容整體coppy,不清楚在文件很大的時候運行是否很慢
                buf = newbuf;
            }
        } catch (UnsupportedEncodingException e) {
            lexError("unsupported.encoding", encoding);
            buf = new char[1];
            buflen = 0;
        }
        catch (IOException e) {
            lexError("io.exception", e.toString());
            buf = new char[1];
            buflen = 0;
        }
        buf[buflen] = EOI;
        line = 1;
        col = 0;
        bp = -1;
        scanChar();//檢查字符,并讀入。
        nextToken();//讀入下一個標示符。
    }

    /**
      * Report an error at the given position using the provided argument.
      */
    private void lexError(int pos, String msg, String arg) {
        log.error(pos, msg, arg);
        token = ERROR;
        errPos = pos;
    }

    /**
      * Report an error at the given position.
      */
    private void lexError(int pos, String key) {
        lexError(pos, key, null);
    }

    /**
      * Report an error at the current token position.
      */
    private void lexError(String key) {
        lexError(pos, key, null);
    }

    /**
      * Report an error at the current token position using the provided
      *  argument.
      */
    private void lexError(String key, String arg) {
        lexError(pos, key, arg);
    }

    /**
      * Report a warning at the given position.
      */
    private void lexWarning(int pos, String key) {
        log.warning(pos, key);
    }

    /**
      * 將ascII碼表示的數字轉為其真實的數值
      */
    private int digit(int base) {
        char c = ch;
        int result = Character.digit(c, base);
        if (result >= 0 && c > 127) {
            lexWarning(pos + 1, "illegal.nonascii.digit");
            ch = "0123456789abcdef".charAt(result);
        }
        return result;
    }

    /**
      * 實現unicode輸入轉換,由于是編譯原理實習,重點在于分析詞法分析算法實現,
      * 所以對于這些邊緣化的點沒有特別的關注,大概了解其用途即可,具體實現不必細究
      */
    private void convertUnicode() {
        int startcol = col;
        if (ch == '\\') {
            bp++;
            ch = buf[bp];
            col++;
            if (ch == 'u') {
                do {
                    bp++;
                    ch = buf[bp];
                    col++;
                } while (ch == 'u')
                    ;
                int limit = bp + 3;
                if (limit < buflen) {
                    int d = digit(16);
                    int code = d;
                    while (bp < limit && d >= 0) {
                        bp++;
                        ch = buf[bp];
                        col++;
                        d = digit(16);
                        code = (code << 4) + d;
                    }
                    if (d >= 0) {
                        ch = (char) code;
                        unicodeConversionBp = bp;
                        return;
                    }
                }
                lexError(Position.make(line, startcol), "illegal.unicode.esc");
            } else {
                bp--;
                ch = '\\';
                col--;
            }
        }
    }

    /**
      * scanChar:實現的是字符讀入的功能,因為數據已經在Scanner中讀入了
      * 內存緩沖區,所以讀取字符就簡單多了,但注意要維護當前字符所在的位置,
      * 讀取時移動指針,將下一個字符賦值給ch就可以了。
      */
    private void scanChar() {
        bp++;
        ch = buf[bp];
        switch (ch) {
        case '\r':
            col = 0;
            line++;
            break;

        case '\n':
            if (bp == 0 || buf[bp - 1] != '\r') {
                col = 0;
                line++;
            }
            break;

        case '\t':
            col = (col / TabInc * TabInc) + TabInc;
            break;

        case '\\':
            col++;
            convertUnicode();
            break;

        default:
            col++;
            break;

        }
    }

    /**
      * 讀取注釋的下一個字符,跳過//標志
      */
    private void scanCommentChar() {
        scanChar();
        if (ch == '\\') {
            if (buf[bp + 1] == '\\' && unicodeConversionBp != bp) {
                bp++;
                col++;
            } else {
                convertUnicode();
            }
        }
    }

    /**
      * 強制給緩沖區擴容
      */
    private void expandCommentBuffer() {
        char[] newBuffer = new char[buffer.length * 2];
        System.arraycopy(buffer, 0, newBuffer, 0, buffer.length);
        buffer = newBuffer;
    }

    /**
      *
      * 讀取注釋中的下一個字符,跳過//符號。
      */
    private void scanDocCommentChar() {
        scanChar();
        if (ch == '\\') {
            if (buf[bp + 1] == '\\' && unicodeConversionBp != bp) {
                if (count == buffer.length)
                    expandCommentBuffer();
                buffer[count++] = ch;
                bp++;
                col++;
            } else {
                convertUnicode();
            }
        }
    }

    /**
      * 像緩沖區中讀入一個字符,并在空間不足的時候給緩沖區擴容,gjc在每次讀入數據時都采用了
      * 緩沖區容積翻倍的辦法,真的是最好的解決方法么?
      */
    private void putChar(char ch) {
        if (sp == sbuf.length) {
            char[] newsbuf = new char[sbuf.length * 2];
            System.arraycopy(sbuf, 0, newsbuf, 0, sbuf.length);
            sbuf = newsbuf;
        }
        sbuf[sp++] = ch;
    }

    /**
      * 調試目的而輸出字符
      */
    private void dch() {
        System.err.print((char) ch);
        System.out.flush();
    }

    /**
      * 讀取字符和字符串中的下一個各種命令標志
      */
    private void scanLitChar() {
        if (ch == '\\') {
            if (buf[bp + 1] == '\\' && unicodeConversionBp != bp) {
                bp++;
                col++;
                putChar('\\');
                scanChar();
            } else {
                scanChar();
                switch (ch) {
                case '0':

                case '1':

                case '2':

                case '3':

                case '4':

                case '5':

                case '6':

                case '7':
                    char leadch = ch;
                    int oct = digit(8);
                    scanChar();
                    if ('0' <= ch && ch <= '7') {
                        oct = oct * 8 + digit(8);
                        scanChar();
                        if (leadch <= '3' && '0' <= ch && ch <= '7') {
                            oct = oct * 8 + digit(8);
                            scanChar();
                        }
                    }
                    putChar((char) oct);
                    break;

                case 'b':
                    putChar('\b');//各種字符串中的表示符號的處理方法
                    scanChar();
                    break;

                case 't':
                    putChar('\t');
                    scanChar();
                    break;

                case 'n':
                    putChar('\n');

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
舔着乳尖日韩一区| 国产精品网站在线| 色综合久久88色综合天天| 国产成人超碰人人澡人人澡| 久久99久久久久| 久久精品国内一区二区三区| 青草国产精品久久久久久| 青娱乐精品视频在线| 日本最新不卡在线| 日韩av电影免费观看高清完整版在线观看| 一区二区久久久久久| 一区二区三区产品免费精品久久75| 最新日韩在线视频| 一区二区欧美国产| 日本伊人午夜精品| 国产精品自拍在线| 99r国产精品| 欧美精品欧美精品系列| 日韩限制级电影在线观看| 久久亚洲精品小早川怜子| 国产精品视频观看| 亚洲综合色视频| 奇米888四色在线精品| 国产乱一区二区| 色综合中文综合网| 久久亚洲影视婷婷| 亚洲色图视频网| 三级久久三级久久| 国产91精品入口| 欧美色倩网站大全免费| 欧美一区二区三区免费视频| 精品第一国产综合精品aⅴ| 国产精品久线在线观看| 三级久久三级久久| 国产成人av电影在线| 欧美综合色免费| 国产亚洲va综合人人澡精品| 一区二区三区在线不卡| 麻豆国产一区二区| 91国偷自产一区二区三区观看 | 欧美一区二区三区视频在线观看| 久久品道一品道久久精品| 一区二区三区资源| 国产精品99久久久久久宅男| 精品视频999| 国产人成亚洲第一网站在线播放| 亚洲自拍都市欧美小说| 国产91在线观看| 91精品国产麻豆国产自产在线 | 欧美精品九九99久久| 国产精品网站在线播放| 久久精品国产网站| 欧美日韩一区二区在线观看视频 | eeuss鲁一区二区三区| 欧美一区二区免费| 亚洲成人一二三| 9人人澡人人爽人人精品| 日韩精品一区二区三区三区免费| 有坂深雪av一区二区精品| 国产精品一二三四五| 51精品久久久久久久蜜臀| 亚洲一区二区三区四区的| hitomi一区二区三区精品| 国产欧美va欧美不卡在线| 狠狠色丁香婷婷综合| 日韩一区二区不卡| 国产精品一区二区在线观看网站| 欧美日韩一区二区三区四区| 亚洲图片你懂的| 91在线一区二区| 亚洲色欲色欲www| 色呦呦一区二区三区| 亚洲欧美日本韩国| 91久久国产综合久久| 1024成人网色www| 色94色欧美sute亚洲13| 亚洲精品免费看| 欧美私人免费视频| 图片区小说区区亚洲影院| 欧美视频在线不卡| 日本中文一区二区三区| 日韩一区二区麻豆国产| 久久狠狠亚洲综合| 久久精品亚洲精品国产欧美kt∨| 国产一区中文字幕| 亚洲欧洲日韩一区二区三区| 91蝌蚪porny| 午夜精品成人在线| 精品国产乱码久久| av毛片久久久久**hd| 亚洲综合另类小说| 欧美一区二区三区白人| 国产又粗又猛又爽又黄91精品| 国产三级三级三级精品8ⅰ区| 国产成人精品aa毛片| 亚洲蜜臀av乱码久久精品| 欧美日韩一区在线观看| 美腿丝袜一区二区三区| 国产三级精品视频| 在线免费观看日本欧美| 国产福利91精品一区二区三区| 国产精品三级av| 欧美日韩国产美女| 国产剧情一区在线| 一区二区三区中文在线| 欧美电影精品一区二区| 国产成人午夜片在线观看高清观看| 国产精品麻豆欧美日韩ww| 欧美日韩亚洲综合| 国产精品一区一区| 同产精品九九九| 国产日韩欧美高清| 欧洲视频一区二区| 国产精品一区二区久激情瑜伽| 亚洲最大色网站| 国产亚洲欧美日韩在线一区| 欧美亚洲丝袜传媒另类| 国产精品资源网站| 香蕉加勒比综合久久| 国产欧美精品区一区二区三区| 欧美精品在线视频| 91亚洲精华国产精华精华液| 久久精品国产99| 亚洲成人av福利| 亚洲精品第1页| 国产日韩欧美一区二区三区综合| 91精品国产综合久久久久久漫画| 99久久综合国产精品| 国内精品伊人久久久久av影院 | 国产一区不卡精品| 日韩精品乱码av一区二区| 亚洲婷婷综合久久一本伊一区| 欧美大片一区二区| 欧美精品xxxxbbbb| 欧美在线视频你懂得| eeuss鲁一区二区三区| 国产成人在线观看免费网站| 日韩一区精品字幕| 亚洲成人高清在线| 伊人婷婷欧美激情| 亚洲手机成人高清视频| 中文字幕+乱码+中文字幕一区| 欧美精品一区二区在线观看| 欧美一区二区三区在线视频| 欧美日韩中文另类| 欧美色男人天堂| 欧美日韩激情一区| 欧美理论在线播放| 欧美福利视频一区| 日韩区在线观看| 日韩一区二区三区观看| 欧美www视频| 精品国产伦理网| 久久毛片高清国产| 欧美国产日韩一二三区| 国产午夜精品久久久久久免费视 | 欧美高清在线视频| 欧美激情综合五月色丁香小说| 久久久精品综合| 国产精品每日更新| 亚洲男人电影天堂| 亚洲国产三级在线| 日本中文一区二区三区| 美女一区二区三区| 国产酒店精品激情| 91免费视频网址| 欧美日韩三级在线| 欧美电视剧免费观看| 久久久久亚洲综合| 亚洲日本韩国一区| 亚洲成在人线免费| 加勒比av一区二区| 9人人澡人人爽人人精品| 欧美综合天天夜夜久久| 日韩欧美国产系列| 中文字幕一区免费在线观看| 一区二区欧美视频| 极品尤物av久久免费看| eeuss鲁一区二区三区| 欧美精选午夜久久久乱码6080| 精品免费一区二区三区| 综合久久久久综合| 美国毛片一区二区| 一本色道综合亚洲| 精品国产电影一区二区| 日韩伦理免费电影| 久久草av在线| 91麻豆国产自产在线观看| 日韩一区二区免费在线电影| 国产精品色噜噜| 免费观看成人鲁鲁鲁鲁鲁视频| 成人午夜看片网址| 91精品国产色综合久久不卡蜜臀| 久久精品人人做人人爽97| 亚洲国产日韩综合久久精品| 国产馆精品极品| 911精品国产一区二区在线| 国产精品美女www爽爽爽| 天天操天天干天天综合网| av在线不卡观看免费观看|