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

📄 tokenstream.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                        int escapeVal = 0;                        for (int i = 0; i != 4; ++i) {                            c = getChar();                            escapeVal = Kit.xDigitToInt(c, escapeVal);                            // Next check takes care about c < 0 and bad escape                            if (escapeVal < 0) { break; }                        }                        if (escapeVal < 0) {                            parser.addError("msg.invalid.escape");                            return Token.ERROR;                        }                        addToString(escapeVal);                        isUnicodeEscapeStart = false;                    } else {                        c = getChar();                        if (c == '\\') {                            c = getChar();                            if (c == 'u') {                                isUnicodeEscapeStart = true;                                containsEscape = true;                            } else {                                parser.addError("msg.illegal.character");                                return Token.ERROR;                            }                        } else {                            if (c == EOF_CHAR                                || !Character.isJavaIdentifierPart((char)c))                            {                                break;                            }                            addToString(c);                        }                    }                }                ungetChar(c);                String str = getStringFromBuffer();                if (!containsEscape) {                    // OPT we shouldn't have to make a string (object!) to                    // check if it's a keyword.                    // Return the corresponding token if it's a keyword                    int result = stringToKeyword(str);                    if (result != Token.EOF) {                        if (result != Token.RESERVED) {                            return result;                        } else if (!parser.compilerEnv.                                        isReservedKeywordAsIdentifier())                        {                            return result;                        } else {                            // If implementation permits to use future reserved                            // keywords in violation with the EcmaScript,                            // treat it as name but issue warning                            parser.addWarning("msg.reserved.keyword", str);                        }                    }                }                this.string = (String)allStrings.intern(str);                return Token.NAME;            }            // is it a number?            if (isDigit(c) || (c == '.' && isDigit(peekChar()))) {                stringBufferTop = 0;                int base = 10;                if (c == '0') {                    c = getChar();                    if (c == 'x' || c == 'X') {                        base = 16;                        c = getChar();                    } else if (isDigit(c)) {                        base = 8;                    } else {                        addToString('0');                    }                }                if (base == 16) {                    while (0 <= Kit.xDigitToInt(c, 0)) {                        addToString(c);                        c = getChar();                    }                } else {                    while ('0' <= c && c <= '9') {                        /*                         * We permit 08 and 09 as decimal numbers, which                         * makes our behavior a superset of the ECMA                         * numeric grammar.  We might not always be so                         * permissive, so we warn about it.                         */                        if (base == 8 && c >= '8') {                            parser.addWarning("msg.bad.octal.literal",                                              c == '8' ? "8" : "9");                            base = 10;                        }                        addToString(c);                        c = getChar();                    }                }                boolean isInteger = true;                if (base == 10 && (c == '.' || c == 'e' || c == 'E')) {                    isInteger = false;                    if (c == '.') {                        do {                            addToString(c);                            c = getChar();                        } while (isDigit(c));                    }                    if (c == 'e' || c == 'E') {                        addToString(c);                        c = getChar();                        if (c == '+' || c == '-') {                            addToString(c);                            c = getChar();                        }                        if (!isDigit(c)) {                            parser.addError("msg.missing.exponent");                            return Token.ERROR;                        }                        do {                            addToString(c);                            c = getChar();                        } while (isDigit(c));                    }                }                ungetChar(c);                String numString = getStringFromBuffer();                double dval;                if (base == 10 && !isInteger) {                    try {                        // Use Java conversion to number from string...                        dval = Double.valueOf(numString).doubleValue();                    }                    catch (NumberFormatException ex) {                        parser.addError("msg.caught.nfe");                        return Token.ERROR;                    }                } else {                    dval = ScriptRuntime.stringToNumber(numString, 0, base);                }                this.number = dval;                return Token.NUMBER;            }            // is it a string?            if (c == '"' || c == '\'') {                // We attempt to accumulate a string the fast way, by                // building it directly out of the reader.  But if there                // are any escaped characters in the string, we revert to                // building it out of a StringBuffer.                int quoteChar = c;                stringBufferTop = 0;                c = getChar();            strLoop: while (c != quoteChar) {                    if (c == '\n' || c == EOF_CHAR) {                        ungetChar(c);                        parser.addError("msg.unterminated.string.lit");                        return Token.ERROR;                    }                    if (c == '\\') {                        // We've hit an escaped character                        int escapeVal;                        c = getChar();                        switch (c) {                        case 'b': c = '\b'; break;                        case 'f': c = '\f'; break;                        case 'n': c = '\n'; break;                        case 'r': c = '\r'; break;                        case 't': c = '\t'; break;                        // \v a late addition to the ECMA spec,                        // it is not in Java, so use 0xb                        case 'v': c = 0xb; break;                        case 'u':                            // Get 4 hex digits; if the u escape is not                            // followed by 4 hex digits, use 'u' + the                            // literal character sequence that follows.                            int escapeStart = stringBufferTop;                            addToString('u');                            escapeVal = 0;                            for (int i = 0; i != 4; ++i) {                                c = getChar();                                escapeVal = Kit.xDigitToInt(c, escapeVal);                                if (escapeVal < 0) {                                    continue strLoop;                                }                                addToString(c);                            }                            // prepare for replace of stored 'u' sequence                            // by escape value                            stringBufferTop = escapeStart;                            c = escapeVal;                            break;                        case 'x':                            // Get 2 hex digits, defaulting to 'x'+literal                            // sequence, as above.                            c = getChar();                            escapeVal = Kit.xDigitToInt(c, 0);                            if (escapeVal < 0) {                                addToString('x');                                continue strLoop;                            } else {                                int c1 = c;                                c = getChar();                                escapeVal = Kit.xDigitToInt(c, escapeVal);                                if (escapeVal < 0) {                                    addToString('x');                                    addToString(c1);                                    continue strLoop;                                } else {                                    // got 2 hex digits                                    c = escapeVal;                                }                            }                            break;                        case '\n':                            // Remove line terminator after escape to follow                            // SpiderMonkey and C/C++                            c = getChar();                            continue strLoop;                        default:                            if ('0' <= c && c < '8') {                                int val = c - '0';                                c = getChar();                                if ('0' <= c && c < '8') {                                    val = 8 * val + c - '0';                                    c = getChar();                                    if ('0' <= c && c < '8' && val <= 037) {                                        // c is 3rd char of octal sequence only                                        // if the resulting val <= 0377                                        val = 8 * val + c - '0';                                        c = getChar();                                    }                                }                                ungetChar(c);                                c = val;                            }                        }                    }                    addToString(c);                    c = getChar();                }                String str = getStringFromBuffer();                this.string = (String)allStrings.intern(str);                return Token.STRING;            }            switch (c) {            case ';': return Token.SEMI;            case '[': return Token.LB;            case ']': return Token.RB;            case '{': return Token.LC;            case '}': return Token.RC;            case '(': return Token.LP;            case ')': return Token.RP;            case ',': return Token.COMMA;            case '?': return Token.HOOK;            case ':':                if (matchChar(':')) {                    return Token.COLONCOLON;                } else {                    return Token.COLON;                }            case '.':                if (matchChar('.')) {                    return Token.DOTDOT;                } else if (matchChar('(')) {                    return Token.DOTQUERY;                } else {                    return Token.DOT;                }            case '|':                if (matchChar('|')) {                    return Token.OR;                } else if (matchChar('=')) {                    return Token.ASSIGN_BITOR;                } else {                    return Token.BITOR;                }            case '^':                if (matchChar('=')) {                    return Token.ASSIGN_BITXOR;                } else {                    return Token.BITXOR;                }            case '&':                if (matchChar('&')) {                    return Token.AND;                } else if (matchChar('=')) {                    return Token.ASSIGN_BITAND;                } else {                    return Token.BITAND;                }            case '=':                if (matchChar('=')) {                    if (matchChar('='))                        return Token.SHEQ;                    else                        return Token.EQ;                } else {                    return Token.ASSIGN;                }            case '!':                if (matchChar('=')) {                    if (matchChar('='))                        return Token.SHNE;                    else                        return Token.NE;                } else {                    return Token.NOT;                }            case '<':                /* NB:treat HTML begin-comment as comment-till-eol */                if (matchChar('!')) {                    if (matchChar('-')) {                        if (matchChar('-')) {                            skipLine();                            continue retry;                        }                        ungetChar('-');                    }                    ungetChar('!');                }                if (matchChar('<')) {                    if (matchChar('=')) {                        return Token.ASSIGN_LSH;                    } else {                        return Token.LSH;                    }                } else {

⌨️ 快捷键说明

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