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

📄 scanner.java

📁 GJC编译器的源代码。是一个开放源代码的工业级编译器。
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                    scanChar();
                    break;

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

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

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

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

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

                default:
                    lexError(Position.make(line, col), "illegal.esc.char");

                }
            }
        } else if (bp != buflen) {
            putChar(ch);
            scanChar();
        }
    }

    /**
      * 读取浮点数的小数部分
      */
    private void scanFraction() {
        while (digit(10) >= 0) {
            putChar(ch);
            scanChar();
        }
        int sp1 = sp;
        if (ch == 'e' || ch == 'E') {
            putChar(ch);
            scanChar();
            if (ch == '+' || ch == '-') {
                putChar(ch);
                scanChar();
            }
            if ('0' <= ch && ch <= '9') {
                do {
                    putChar(ch);
                    scanChar();
                } while ('0' <= ch && ch <= '9')
                    ;
                return;
            }
            lexError("malformed.fp.lit");
            sp = sp1;
        }
    }

    /**
      *读取浮点数的小数部分和f,d后缀。
      */
    private void scanFractionAndSuffix() {
        scanFraction();
        if (ch == 'f' || ch == 'F') {
            putChar(ch);
            scanChar();
            token = FLOATLITERAL;
        } else {
            if (ch == 'd' || ch == 'D') {
                putChar(ch);
                scanChar();
            }
            token = DOUBLELITERAL;
        }
    }

    /**
      * 处理数字及其各种后缀。
      */
    private void scanNumber(int radix) {
        this.radix = radix;
        int digitRadix = (radix <= 10) ? 10 : 16;
        while (digit(digitRadix) >= 0) {
            putChar(ch);
            scanChar();
        }
        if (radix <= 10 && ch == '.') {
            putChar(ch);
            scanChar();
            scanFractionAndSuffix();
        } else if (radix <= 10 &&
                (ch == 'e' || ch == 'E' || ch == 'f' || ch == 'F' || ch == 'd' ||
                ch == 'D')) {
            scanFractionAndSuffix();
        } else {
            if (ch == 'l' || ch == 'L') {
                scanChar();
                token = LONGLITERAL;
            } else {
                token = INTLITERAL;
            }
        }
    }

    /**
      *读取标示符:实现方法:循环读取下一个字符,直到不能识别为止,然后将
      *得到字符串转化为一个name对象,并将其在字母表中进行对比,判断是否为标示符,
      *或者其他。
      */
    private void scanIdent() {
        do {
            if (sp == sbuf.length)
                putChar(ch);
            else
                sbuf[sp++] = ch;
            scanChar();
            switch (ch) {
            case 'A':

            case 'B':

            case 'C':

            case 'D':

            case 'E':

            case 'F':

            case 'G':

            case 'H':

            case 'I':

            case 'J':

            case 'K':

            case 'L':

            case 'M':

            case 'N':

            case 'O':

            case 'P':

            case 'Q':

            case 'R':

            case 'S':

            case 'T':

            case 'U':

            case 'V':

            case 'W':

            case 'X':

            case 'Y':

            case 'Z':

            case 'a':

            case 'b':

            case 'c':

            case 'd':

            case 'e':

            case 'f':

            case 'g':

            case 'h':

            case 'i':

            case 'j':

            case 'k':

            case 'l':

            case 'm':

            case 'n':

            case 'o':

            case 'p':

            case 'q':

            case 'r':

            case 's':

            case 't':

            case 'u':

            case 'v':

            case 'w':

            case 'x':

            case 'y':

            case 'z':

            case '$':

            case '_':

            case '0':

            case '1':

            case '2':

            case '3':

            case '4':

            case '5':

            case '6':

            case '7':

            case '8':

            case '9':
                break;

            default:
                if (!Character.isJavaIdentifierPart(ch) || bp >= buflen) {
                    name = names.fromChars(sbuf, 0, sp);
                    token = keywords.key(name);
                    return;
                }

            }
        } while (true)
            ;
    }

    /**
      * 如果是操作符得一部分,则返回true,用于判断操作符。      
      * 
      * */
    private boolean isSpecial(char ch) {
        switch (ch) {
        case '!':

        case '%':

        case '&':

        case '*':

        case '?':

        case '+':

        case '-':

        case ':':

        case '<':

        case '=':

        case '>':

        case '^':

        case '|':

        case '~':
            return true;

        default:
            return false;

        }
    }

    /**
      * Read longest possible sequence of special characters and convert
      *  to token.
      */
    private void scanOperator() {
        while (true) {
            putChar(ch);
            Name newname = names.fromChars(sbuf, 0, sp);
            if (keywords.key(newname) == IDENTIFIER) {
                sp--;
                break;
            }
            name = newname;
            token = keywords.key(newname);
            scanChar();
            if (!isSpecial(ch))
                break;
        }
    }

    /**
      * Scan a doccomment line after the inital '*''s for
      *  a @deprecated tag. This should be extended to support all javadoc tags.
      */
    private void scanDocCommentTag() {
        int start = bp + 1;
        do {
            scanDocCommentChar();
        } while ('a' <= ch && ch <= 'z')
            ;
        if (names.fromChars(buf, start, bp - start) == names.deprecated) {
            deprecatedFlag = true;
        }
    }

    /**
      *跳过不是javadoc工具要处理的注释。
      */
    private void skipComment() {
        while (bp < buflen) {
            switch (ch) {
            case '*':
                scanChar();
                if (ch == '/')
                    return;
                break;

            default:
                scanCommentChar();
                break;

            }
        }
    }

    /**
      *
      * 读入javadoc工具要处理的注释,并将其转为一个字符串,
      */
    private String scanDocComment() {
        if (buffer == null)
            buffer = new char[1024];
        count = 0;
        boolean linestart = false;
        boolean firstLine = true;
        while (bp < buflen && ch == '*') {
            scanDocCommentChar();
        }
        if (bp < buflen && ch == '/') {
            return "";
        }
        if (bp < buflen) {
            if (ch == LF) {
                scanDocCommentChar();
                firstLine = false;
            } else if (ch == CR) {
                scanDocCommentChar();
                if (ch == LF) {
                    scanDocCommentChar();
                    firstLine = false;
                }
            }
        }
        outerLoop:
        while (bp < buflen) {
            wsLoop:
            while (bp < buflen) {
                switch (ch) {
                case ' ':
                    scanDocCommentChar();
                    break;

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

                case FF:
                    col = 0;
                    scanDocCommentChar();
                    break;

                default:
                    break wsLoop;

                }
            }
            if (ch == '*') {
                do {
                    scanDocCommentChar();
                } while (ch == '*')
                    ;
                if (ch == '/') {
                    break outerLoop;
                }

⌨️ 快捷键说明

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