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

📄 tokenstream.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): *   Roger Lawrence *   Mike McCabe *   Igor Bukanov *   Ethan Hugg *   Terry Lucas *   Milen Nankov * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */package org.mozilla.javascript;import java.io.*;/** * This class implements the JavaScript scanner. * * It is based on the C source files jsscan.c and jsscan.h * in the jsref package. * * @see org.mozilla.javascript.Parser * * @author Mike McCabe * @author Brendan Eich */class TokenStream{    /*     * For chars - because we need something out-of-range     * to check.  (And checking EOF by exception is annoying.)     * Note distinction from EOF token type!     */    private final static int        EOF_CHAR = -1;    TokenStream(Parser parser, Reader sourceReader, String sourceString,                int lineno)    {        this.parser = parser;        this.lineno = lineno;        if (sourceReader != null) {            if (sourceString != null) Kit.codeBug();            this.sourceReader = sourceReader;            this.sourceBuffer = new char[512];            this.sourceEnd = 0;        } else {            if (sourceString == null) Kit.codeBug();            this.sourceString = sourceString;            this.sourceEnd = sourceString.length();        }        this.sourceCursor = 0;    }    /* This function uses the cached op, string and number fields in     * TokenStream; if getToken has been called since the passed token     * was scanned, the op or string printed may be incorrect.     */    String tokenToString(int token)    {        if (Token.printTrees) {            String name = Token.name(token);            switch (token) {            case Token.STRING:            case Token.REGEXP:            case Token.NAME:                return name + " `" + this.string + "'";            case Token.NUMBER:                return "NUMBER " + this.number;            }            return name;        }        return "";    }    static boolean isKeyword(String s)    {        return Token.EOF != stringToKeyword(s);    }    private static int stringToKeyword(String name)    {// #string_id_map#// The following assumes that Token.EOF == 0        final int            Id_break         = Token.BREAK,            Id_case          = Token.CASE,            Id_continue      = Token.CONTINUE,            Id_default       = Token.DEFAULT,            Id_delete        = Token.DELPROP,            Id_do            = Token.DO,            Id_else          = Token.ELSE,            Id_export        = Token.EXPORT,            Id_false         = Token.FALSE,            Id_for           = Token.FOR,            Id_function      = Token.FUNCTION,            Id_if            = Token.IF,            Id_in            = Token.IN,            Id_new           = Token.NEW,            Id_null          = Token.NULL,            Id_return        = Token.RETURN,            Id_switch        = Token.SWITCH,            Id_this          = Token.THIS,            Id_true          = Token.TRUE,            Id_typeof        = Token.TYPEOF,            Id_var           = Token.VAR,            Id_void          = Token.VOID,            Id_while         = Token.WHILE,            Id_with          = Token.WITH,            // the following are #ifdef RESERVE_JAVA_KEYWORDS in jsscan.c            Id_abstract      = Token.RESERVED,            Id_boolean       = Token.RESERVED,            Id_byte          = Token.RESERVED,            Id_catch         = Token.CATCH,            Id_char          = Token.RESERVED,            Id_class         = Token.RESERVED,            Id_const         = Token.RESERVED,            Id_debugger      = Token.RESERVED,            Id_double        = Token.RESERVED,            Id_enum          = Token.RESERVED,            Id_extends       = Token.RESERVED,            Id_final         = Token.RESERVED,            Id_finally       = Token.FINALLY,            Id_float         = Token.RESERVED,            Id_goto          = Token.RESERVED,            Id_implements    = Token.RESERVED,            Id_import        = Token.IMPORT,            Id_instanceof    = Token.INSTANCEOF,            Id_int           = Token.RESERVED,            Id_interface     = Token.RESERVED,            Id_long          = Token.RESERVED,            Id_native        = Token.RESERVED,            Id_package       = Token.RESERVED,            Id_private       = Token.RESERVED,            Id_protected     = Token.RESERVED,            Id_public        = Token.RESERVED,            Id_short         = Token.RESERVED,            Id_static        = Token.RESERVED,            Id_super         = Token.RESERVED,            Id_synchronized  = Token.RESERVED,            Id_throw         = Token.THROW,            Id_throws        = Token.RESERVED,            Id_transient     = Token.RESERVED,            Id_try           = Token.TRY,            Id_volatile      = Token.RESERVED;        int id;        String s = name;// #generated# Last update: 2001-06-01 17:45:01 CEST        L0: { id = 0; String X = null; int c;            L: switch (s.length()) {            case 2: c=s.charAt(1);                if (c=='f') { if (s.charAt(0)=='i') {id=Id_if; break L0;} }                else if (c=='n') { if (s.charAt(0)=='i') {id=Id_in; break L0;} }                else if (c=='o') { if (s.charAt(0)=='d') {id=Id_do; break L0;} }                break L;            case 3: switch (s.charAt(0)) {                case 'f': if (s.charAt(2)=='r' && s.charAt(1)=='o') {id=Id_for; break L0;} break L;                case 'i': if (s.charAt(2)=='t' && s.charAt(1)=='n') {id=Id_int; break L0;} break L;                case 'n': if (s.charAt(2)=='w' && s.charAt(1)=='e') {id=Id_new; break L0;} break L;                case 't': if (s.charAt(2)=='y' && s.charAt(1)=='r') {id=Id_try; break L0;} break L;                case 'v': if (s.charAt(2)=='r' && s.charAt(1)=='a') {id=Id_var; break L0;} break L;                } break L;            case 4: switch (s.charAt(0)) {                case 'b': X="byte";id=Id_byte; break L;                case 'c': c=s.charAt(3);                    if (c=='e') { if (s.charAt(2)=='s' && s.charAt(1)=='a') {id=Id_case; break L0;} }                    else if (c=='r') { if (s.charAt(2)=='a' && s.charAt(1)=='h') {id=Id_char; break L0;} }                    break L;                case 'e': c=s.charAt(3);                    if (c=='e') { if (s.charAt(2)=='s' && s.charAt(1)=='l') {id=Id_else; break L0;} }                    else if (c=='m') { if (s.charAt(2)=='u' && s.charAt(1)=='n') {id=Id_enum; break L0;} }                    break L;                case 'g': X="goto";id=Id_goto; break L;                case 'l': X="long";id=Id_long; break L;                case 'n': X="null";id=Id_null; break L;                case 't': c=s.charAt(3);                    if (c=='e') { if (s.charAt(2)=='u' && s.charAt(1)=='r') {id=Id_true; break L0;} }                    else if (c=='s') { if (s.charAt(2)=='i' && s.charAt(1)=='h') {id=Id_this; break L0;} }                    break L;                case 'v': X="void";id=Id_void; break L;                case 'w': X="with";id=Id_with; break L;                } break L;            case 5: switch (s.charAt(2)) {                case 'a': X="class";id=Id_class; break L;                case 'e': X="break";id=Id_break; break L;                case 'i': X="while";id=Id_while; break L;                case 'l': X="false";id=Id_false; break L;                case 'n': c=s.charAt(0);                    if (c=='c') { X="const";id=Id_const; }                    else if (c=='f') { X="final";id=Id_final; }                    break L;                case 'o': c=s.charAt(0);                    if (c=='f') { X="float";id=Id_float; }                    else if (c=='s') { X="short";id=Id_short; }                    break L;                case 'p': X="super";id=Id_super; break L;                case 'r': X="throw";id=Id_throw; break L;                case 't': X="catch";id=Id_catch; break L;                } break L;            case 6: switch (s.charAt(1)) {                case 'a': X="native";id=Id_native; break L;                case 'e': c=s.charAt(0);                    if (c=='d') { X="delete";id=Id_delete; }                    else if (c=='r') { X="return";id=Id_return; }                    break L;                case 'h': X="throws";id=Id_throws; break L;                case 'm': X="import";id=Id_import; break L;                case 'o': X="double";id=Id_double; break L;                case 't': X="static";id=Id_static; break L;                case 'u': X="public";id=Id_public; break L;                case 'w': X="switch";id=Id_switch; break L;                case 'x': X="export";id=Id_export; break L;                case 'y': X="typeof";id=Id_typeof; break L;                } break L;            case 7: switch (s.charAt(1)) {                case 'a': X="package";id=Id_package; break L;                case 'e': X="default";id=Id_default; break L;                case 'i': X="finally";id=Id_finally; break L;                case 'o': X="boolean";id=Id_boolean; break L;                case 'r': X="private";id=Id_private; break L;                case 'x': X="extends";id=Id_extends; break L;                } break L;            case 8: switch (s.charAt(0)) {                case 'a': X="abstract";id=Id_abstract; break L;                case 'c': X="continue";id=Id_continue; break L;                case 'd': X="debugger";id=Id_debugger; break L;                case 'f': X="function";id=Id_function; break L;                case 'v': X="volatile";id=Id_volatile; break L;                } break L;            case 9: c=s.charAt(0);                if (c=='i') { X="interface";id=Id_interface; }                else if (c=='p') { X="protected";id=Id_protected; }                else if (c=='t') { X="transient";id=Id_transient; }                break L;            case 10: c=s.charAt(1);                if (c=='m') { X="implements";id=Id_implements; }                else if (c=='n') { X="instanceof";id=Id_instanceof; }                break L;            case 12: X="synchronized";id=Id_synchronized; break L;            }            if (X!=null && X!=s && !X.equals(s)) id = 0;        }// #/generated#// #/string_id_map#        if (id == 0) { return Token.EOF; }        return id & 0xff;    }    final int getLineno() { return lineno; }    final String getString() { return string; }    final double getNumber() { return number; }    final boolean eof() { return hitEOF; }    final int getToken() throws IOException    {        int c;    retry:        for (;;) {            // Eat whitespace, possibly sensitive to newlines.            for (;;) {                c = getChar();                if (c == EOF_CHAR) {                    return Token.EOF;                } else if (c == '\n') {                    dirtyLine = false;                    return Token.EOL;                } else if (!isJSSpace(c)) {                    if (c != '-') {                        dirtyLine = true;                    }                    break;                }            }            if (c == '@') return Token.XMLATTR;            // identifier/keyword/instanceof?            // watch out for starting with a <backslash>            boolean identifierStart;            boolean isUnicodeEscapeStart = false;            if (c == '\\') {                c = getChar();                if (c == 'u') {                    identifierStart = true;                    isUnicodeEscapeStart = true;                    stringBufferTop = 0;                } else {                    identifierStart = false;                    ungetChar(c);                    c = '\\';                }            } else {                identifierStart = Character.isJavaIdentifierStart((char)c);                if (identifierStart) {                    stringBufferTop = 0;                    addToString(c);                }            }            if (identifierStart) {                boolean containsEscape = isUnicodeEscapeStart;                for (;;) {                    if (isUnicodeEscapeStart) {                        // strictly speaking we should probably push-back                        // all the bad characters if the <backslash>uXXXX                        // sequence is malformed. But since there isn't a                        // correct context(is there?) for a bad Unicode                        // escape sequence in an identifier, we can report                        // an error here.

⌨️ 快捷键说明

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