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

📄 nativeregexp.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
    {        int i;        int byteIndex1 = (int)(c1 / 8);        int byteIndex2 = (int)(c2 / 8);        if ((c2 > cs.length) || (c1 > c2))            throw new RuntimeException();        c1 &= 0x7;        c2 &= 0x7;        if (byteIndex1 == byteIndex2) {            cs.bits[byteIndex1] |= ((int)(0xFF) >> (7 - (c2 - c1))) << c1;        }        else {            cs.bits[byteIndex1] |= 0xFF << c1;            for (i = byteIndex1 + 1; i < byteIndex2; i++)                cs.bits[i] = (byte)0xFF;            cs.bits[byteIndex2] |= (int)(0xFF) >> (7 - c2);        }    }    /* Compile the source of the class into a RECharSet */    private static void    processCharSet(REGlobalData gData, RECharSet charSet)    {        synchronized (charSet) {            if (!charSet.converted) {                processCharSetImpl(gData, charSet);                charSet.converted = true;            }        }    }    private static void    processCharSetImpl(REGlobalData gData, RECharSet charSet)    {        int src = charSet.startIndex;        int end = src + charSet.strlength;        char rangeStart = 0, thisCh;        int byteLength;        char c;        int n;        int nDigits;        int i;        boolean inRange = false;        charSet.sense = true;        byteLength = (charSet.length / 8) + 1;        charSet.bits = new byte[byteLength];        if (src == end)            return;        if (gData.regexp.source[src] == '^') {            charSet.sense = false;            ++src;        }        while (src != end) {            nDigits = 2;            switch (gData.regexp.source[src]) {            case '\\':                ++src;                c = gData.regexp.source[src++];                switch (c) {                case 'b':                    thisCh = 0x8;                    break;                case 'f':                    thisCh = 0xC;                    break;                case 'n':                    thisCh = 0xA;                    break;                case 'r':                    thisCh = 0xD;                    break;                case 't':                    thisCh = 0x9;                    break;                case 'v':                    thisCh = 0xB;                    break;                case 'c':                    if (((src + 1) < end) && isWord(gData.regexp.source[src + 1]))                        thisCh = (char)(gData.regexp.source[src++] & 0x1F);                    else {                        --src;                        thisCh = '\\';                    }                    break;                case 'u':                    nDigits += 2;                    // fall thru                case 'x':                    n = 0;                    for (i = 0; (i < nDigits) && (src < end); i++) {                        c = gData.regexp.source[src++];                        int digit = toASCIIHexDigit(c);                        if (digit < 0) {                            /* back off to accepting the original '\'                             * as a literal                             */                            src -= (i + 1);                            n = '\\';                            break;                        }                        n = (n << 4) | digit;                    }                    thisCh = (char)(n);                    break;                case '0':                case '1':                case '2':                case '3':                case '4':                case '5':                case '6':                case '7':                    /*                     *  This is a non-ECMA extension - decimal escapes (in this                     *  case, octal!) are supposed to be an error inside class                     *  ranges, but supported here for backwards compatibility.                     *                     */                    n = (c - '0');                    c = gData.regexp.source[src];                    if ('0' <= c && c <= '7') {                        src++;                        n = 8 * n + (c - '0');                        c = gData.regexp.source[src];                        if ('0' <= c && c <= '7') {                            src++;                            i = 8 * n + (c - '0');                            if (i <= 0377)                                n = i;                            else                                src--;                        }                    }                    thisCh = (char)(n);                    break;                case 'd':                    addCharacterRangeToCharSet(charSet, '0', '9');                    continue;   /* don't need range processing */                case 'D':                    addCharacterRangeToCharSet(charSet, (char)0, (char)('0' - 1));                    addCharacterRangeToCharSet(charSet, (char)('9' + 1),                                                (char)(charSet.length));                    continue;                case 's':                    for (i = (int)(charSet.length); i >= 0; i--)                        if (isREWhiteSpace(i))                            addCharacterToCharSet(charSet, (char)(i));                    continue;                case 'S':                    for (i = (int)(charSet.length); i >= 0; i--)                        if (!isREWhiteSpace(i))                            addCharacterToCharSet(charSet, (char)(i));                    continue;                case 'w':                    for (i = (int)(charSet.length); i >= 0; i--)                        if (isWord((char)i))                            addCharacterToCharSet(charSet, (char)(i));                    continue;                case 'W':                    for (i = (int)(charSet.length); i >= 0; i--)                        if (!isWord((char)i))                            addCharacterToCharSet(charSet, (char)(i));                    continue;                default:                    thisCh = c;                    break;                }                break;            default:                thisCh = gData.regexp.source[src++];                break;            }            if (inRange) {                if ((gData.regexp.flags & JSREG_FOLD) != 0) {                    addCharacterRangeToCharSet(charSet,                                               upcase(rangeStart),                                               upcase(thisCh));                    addCharacterRangeToCharSet(charSet,                                               downcase(rangeStart),                                               downcase(thisCh));                } else {                    addCharacterRangeToCharSet(charSet, rangeStart, thisCh);                }                inRange = false;            }            else {                if ((gData.regexp.flags & JSREG_FOLD) != 0) {                    addCharacterToCharSet(charSet, upcase(thisCh));                    addCharacterToCharSet(charSet, downcase(thisCh));                } else {                    addCharacterToCharSet(charSet, thisCh);                }                if (src < (end - 1)) {                    if (gData.regexp.source[src] == '-') {                        ++src;                        inRange = true;                        rangeStart = thisCh;                    }                }            }        }    }    /*     *   Initialize the character set if it this is the first call.     *   Test the bit - if the ^ flag was specified, non-inclusion is a success     */    private static boolean    classMatcher(REGlobalData gData, RECharSet charSet, char ch)    {        if (!charSet.converted) {            processCharSet(gData, charSet);        }        int byteIndex = ch / 8;        if (charSet.sense) {            if ((charSet.length == 0) ||                 ( (ch > charSet.length)                    || ((charSet.bits[byteIndex] & (1 << (ch & 0x7))) == 0) ))                return false;        } else {            if (! ((charSet.length == 0) ||                     ( (ch > charSet.length)                        || ((charSet.bits[byteIndex] & (1 << (ch & 0x7))) == 0) )))                return false;        }        return true;    }    private static boolean    executeREBytecode(REGlobalData gData, char[] chars, int end)    {        int pc = 0;        byte program[] = gData.regexp.program;        int currentContinuation_op;        int currentContinuation_pc;        boolean result = false;        currentContinuation_pc = 0;        currentContinuation_op = REOP_END;if (debug) {System.out.println("Input = \"" + new String(chars) + "\", start at " + gData.cp);}        int op = program[pc++];        for (;;) {if (debug) {System.out.println("Testing at " + gData.cp + ", op = " + op);}            switch (op) {            case REOP_EMPTY:                result = true;                break;            case REOP_BOL:                if (gData.cp != 0) {                    if (gData.multiline ||                            ((gData.regexp.flags & JSREG_MULTILINE) != 0)) {                        if (!isLineTerm(chars[gData.cp - 1])) {                            result = false;                            break;                        }                    }                    else {                        result = false;                        break;                    }                }                result = true;                break;            case REOP_EOL:                if (gData.cp != end) {                    if (gData.multiline ||                            ((gData.regexp.flags & JSREG_MULTILINE) != 0)) {                        if (!isLineTerm(chars[gData.cp])) {                            result = false;                            break;                        }                    }                    else {                        result = false;                        break;                    }                }                result = true;                break;            case REOP_WBDRY:                result = ((gData.cp == 0 || !isWord(chars[gData.cp - 1]))                          ^ !((gData.cp < end) && isWord(chars[gData.cp])));                break;            case REOP_WNONBDRY:                result = ((gData.cp == 0 || !isWord(chars[gData.cp - 1]))                          ^ ((gData.cp < end) && isWord(chars[gData.cp])));                break;            case REOP_DOT:                result = (gData.cp != end && !isLineTerm(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_DIGIT:                result = (gData.cp != end && isDigit(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_NONDIGIT:                result = (gData.cp != end && !isDigit(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_SPACE:                result = (gData.cp != end && isREWhiteSpace(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_NONSPACE:                result = (gData.cp != end && !isREWhiteSpace(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_ALNUM:                result = (gData.cp != end && isWord(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_NONALNUM:                result = (gData.cp != end && !isWord(chars[gData.cp]));                if (result) {                    gData.cp++;                }                break;            case REOP_FLAT:                {                    int offset = getIndex(program, pc);                    pc += INDEX_LE

⌨️ 快捷键说明

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