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

📄 jsregexp.c

📁 java script test programing source code
💻 C
📖 第 1 页 / 共 5 页
字号:
 *              any of which can be optionally followed by '?' for ungreedy * *  atom:       '(' regexp ')'          A parenthesized regexp (what matched *                                      can be addressed using a backreference, *                                      see '\' n below). *              '.'                     Matches any char except '\n'. *              '[' classlist ']'       A character class. *              '[' '^' classlist ']'   A negated character class. *              '\f'                    Form Feed. *              '\n'                    Newline (Line Feed). *              '\r'                    Carriage Return. *              '\t'                    Horizontal Tab. *              '\v'                    Vertical Tab. *              '\d'                    A digit (same as [0-9]). *              '\D'                    A non-digit. *              '\w'                    A word character, [0-9a-z_A-Z]. *              '\W'                    A non-word character. *              '\s'                    A whitespace character, [ \b\f\n\r\t\v]. *              '\S'                    A non-whitespace character. *              '\' n                   A backreference to the nth (n decimal *                                      and positive) parenthesized expression. *              '\' octal               An octal escape sequence (octal must be *                                      two or three digits long, unless it is *                                      0 for the null character). *              '\x' hex                A hex escape (hex must be two digits). *              '\u' unicode            A unicode escape (must be four digits). *              '\c' ctrl               A control character, ctrl is a letter. *              '\' literalatomchar     Any character except one of the above *                                      that follow '\' in an atom. *              otheratomchar           Any character not first among the other *                                      atom right-hand sides. */static JSBoolParseTerm(CompilerState *state){    jschar c = *state->cp++;    uintN nDigits;    uintN num, tmp, n, i;    const jschar *termStart;    switch (c) {    /* assertions and atoms */    case '^':        state->result = NewRENode(state, REOP_BOL);        if (!state->result)            return JS_FALSE;        state->progLength++;        return JS_TRUE;    case '$':        state->result = NewRENode(state, REOP_EOL);        if (!state->result)            return JS_FALSE;        state->progLength++;        return JS_TRUE;    case '\\':        if (state->cp >= state->cpend) {            /* a trailing '\' is an error */            js_ReportCompileErrorNumber(state->context, state->tokenStream,                                        JSREPORT_TS | JSREPORT_ERROR,                                        JSMSG_TRAILING_SLASH);            return JS_FALSE;        }        c = *state->cp++;        switch (c) {        /* assertion escapes */        case 'b' :            state->result = NewRENode(state, REOP_WBDRY);            if (!state->result)                return JS_FALSE;            state->progLength++;            return JS_TRUE;        case 'B':            state->result = NewRENode(state, REOP_WNONBDRY);            if (!state->result)                return JS_FALSE;            state->progLength++;            return JS_TRUE;        /* Decimal escape */        case '0':            /* Give a strict warning. See also the note below. */            if (!js_ReportCompileErrorNumber(state->context,                                             state->tokenStream,                                             JSREPORT_TS |                                             JSREPORT_WARNING |                                             JSREPORT_STRICT,                                             JSMSG_INVALID_BACKREF)) {                return JS_FALSE;            }     doOctal:            num = 0;            while (state->cp < state->cpend) {                c = *state->cp;                if (c < '0' || '7' < c)                    break;                state->cp++;                tmp = 8 * num + (uintN)JS7_UNDEC(c);                if (tmp > 0377)                    break;                num = tmp;            }            c = (jschar)num;    doFlat:            state->result = NewRENode(state, REOP_FLAT);            if (!state->result)                return JS_FALSE;            state->result->u.flat.chr = c;            state->result->u.flat.length = 1;            state->progLength += 3;            break;        case '1':        case '2':        case '3':        case '4':        case '5':        case '6':        case '7':        case '8':        case '9':            termStart = state->cp - 1;            num = GetDecimalValue(c, state->parenCount, FindParenCount, state);            if (state->flags & JSREG_FIND_PAREN_ERROR)                return JS_FALSE;            if (num == OVERFLOW_VALUE) {                /* Give a strict mode warning. */                if (!js_ReportCompileErrorNumber(state->context,                                                 state->tokenStream,                                                 JSREPORT_TS |                                                 JSREPORT_WARNING |                                                 JSREPORT_STRICT,                                                 (c >= '8')                                                 ? JSMSG_INVALID_BACKREF                                                 : JSMSG_BAD_BACKREF)) {                    return JS_FALSE;                }                /*                 * Note: ECMA 262, 15.10.2.9 says that we should throw a syntax                 * error here. However, for compatibility with IE, we treat the                 * whole backref as flat if the first character in it is not a                 * valid octal character, and as an octal escape otherwise.                 */                state->cp = termStart;                if (c >= '8') {                    /* Treat this as flat. termStart - 1 is the \. */                    c = '\\';                    goto asFlat;                }                /* Treat this as an octal escape. */                goto doOctal;            }            JS_ASSERT(1 <= num && num <= 0x10000);            state->result = NewRENode(state, REOP_BACKREF);            if (!state->result)                return JS_FALSE;            state->result->u.parenIndex = num - 1;            state->progLength                += 1 + GetCompactIndexWidth(state->result->u.parenIndex);            break;        /* Control escape */        case 'f':            c = 0xC;            goto doFlat;        case 'n':            c = 0xA;            goto doFlat;        case 'r':            c = 0xD;            goto doFlat;        case 't':            c = 0x9;            goto doFlat;        case 'v':            c = 0xB;            goto doFlat;        /* Control letter */        case 'c':            if (state->cp < state->cpend && RE_IS_LETTER(*state->cp)) {                c = (jschar) (*state->cp++ & 0x1F);            } else {                /* back off to accepting the original '\' as a literal */                --state->cp;                c = '\\';            }            goto doFlat;        /* HexEscapeSequence */        case 'x':            nDigits = 2;            goto lexHex;        /* UnicodeEscapeSequence */        case 'u':            nDigits = 4;lexHex:            n = 0;            for (i = 0; i < nDigits && state->cp < state->cpend; i++) {                uintN digit;                c = *state->cp++;                if (!isASCIIHexDigit(c, &digit)) {                    /*                     * Back off to accepting the original 'u' or 'x' as a                     * literal.                     */                    state->cp -= i + 2;                    n = *state->cp++;                    break;                }                n = (n << 4) | digit;            }            c = (jschar) n;            goto doFlat;        /* Character class escapes */        case 'd':            state->result = NewRENode(state, REOP_DIGIT);doSimple:            if (!state->result)                return JS_FALSE;            state->progLength++;            break;        case 'D':            state->result = NewRENode(state, REOP_NONDIGIT);            goto doSimple;        case 's':            state->result = NewRENode(state, REOP_SPACE);            goto doSimple;        case 'S':            state->result = NewRENode(state, REOP_NONSPACE);            goto doSimple;        case 'w':            state->result = NewRENode(state, REOP_ALNUM);            goto doSimple;        case 'W':            state->result = NewRENode(state, REOP_NONALNUM);            goto doSimple;        /* IdentityEscape */        default:            state->result = NewRENode(state, REOP_FLAT);            if (!state->result)                return JS_FALSE;            state->result->u.flat.chr = c;            state->result->u.flat.length = 1;            state->result->kid = (void *) (state->cp - 1);            state->progLength += 3;            break;        }        break;    case '[':        state->result = NewRENode(state, REOP_CLASS);        if (!state->result)            return JS_FALSE;        termStart = state->cp;        state->result->u.ucclass.startIndex = termStart - state->cpbegin;        for (;;) {            if (state->cp == state->cpend) {                js_ReportCompileErrorNumberUC(state->context, state->tokenStream,                                              JSREPORT_TS | JSREPORT_ERROR,                                              JSMSG_UNTERM_CLASS, termStart);                return JS_FALSE;            }            if (*state->cp == '\\') {                state->cp++;                if (state->cp != state->cpend)                    state->cp++;                continue;            }            if (*state->cp == ']') {                state->result->u.ucclass.kidlen = state->cp - termStart;                break;            }            state->cp++;        }        for (i = 0; i < CLASS_CACHE_SIZE; i++) {            if (!state->classCache[i].start) {                state->classCache[i].start = termStart;                state->classCache[i].length = state->result->u.ucclass.kidlen;                state->classCache[i].index = state->classCount;                break;            }            if (state->classCache[i].length ==                state->result->u.ucclass.kidlen) {                for (n = 0; ; n++) {                    if (n == state->classCache[i].length) {                        state->result->u.ucclass.index                            = state->classCache[i].index;                        goto claim;                    }                    if (state->classCache[i].start[n] != termStart[n])                        break;                }            }        }        state->result->u.ucclass.index = state->classCount++;    claim:        /*         * Call CalculateBitmapSize now as we want any errors it finds         * to be reported during the parse phase, not at execution.         */        if (!CalculateBitmapSize(state, state->result, termStart, state->cp++))            return JS_FALSE;        /*         * Update classBitmapsMem with number of bytes to hold bmsize bits,         * which is (bitsCount + 7) / 8 or (highest_bit + 1 + 7) / 8         * or highest_bit / 8 + 1 where highest_bit is u.ucclass.bmsize.         */        n = (state->result->u.ucclass.bmsize >> 3) + 1;        if (n > CLASS_BITMAPS_MEM_LIMIT - state->classBitmapsMem) {            js_ReportCompileErrorNumber(state->context, state->tokenStream,                                        JSREPORT_TS | JSREPORT_ERROR,                                        JSMSG_REGEXP_TOO_COMPLEX);            return JS_FALSE;        }        state->classBitmapsMem += n;        /* CLASS, <index> */        state->progLength            += 1 + GetCompactIndexWidth(state->result->u.ucclass.index);        break;    case '.':        state->result = NewRENode(state, REOP_DOT);        goto doSimple;    case '{':    {        const jschar *errp = state->cp--;        intN err;        err = ParseMinMaxQuantifier(state, JS_TRUE);        state->cp = errp;        if (err < 0)            goto asFlat;        /* FALL THROUGH */    }    case '*':    case '+':    case '?':        js_ReportCompileErrorNumberUC(state->context, state->tokenStream,                                      JSREPORT_TS | JSREPORT_ERROR,                                      JSMSG_BAD_QUANTIFIER, state->cp - 1);        return JS_FALSE;    default:asFlat:        state->result = NewRENode(state, REOP_FLAT);        if (!state->result)            return JS_FALSE;        state->result->u.flat.chr = c;        state->result->u.flat.length = 1;        state->result->kid = (void *) (state->cp - 1);        state->progLength += 3;        break;    }    return ParseQuantifier(state);}static JSBoolParseQuantifier(CompilerState *state){

⌨️ 快捷键说明

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