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

📄 qscriptlexer.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    case 9: {        if (check_reserved) {            if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('n')                    && c[2] == QLatin1Char('t') && c[3] == QLatin1Char('e')                    && c[4] == QLatin1Char('r') && c[5] == QLatin1Char('f')                    && c[6] == QLatin1Char('a') && c[7] == QLatin1Char('c')                    && c[8] == QLatin1Char('e'))                return QScriptGrammar::T_RESERVED_WORD;            else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('r')                    && c[2] == QLatin1Char('a') && c[3] == QLatin1Char('n')                    && c[4] == QLatin1Char('s') && c[5] == QLatin1Char('i')                    && c[6] == QLatin1Char('e') && c[7] == QLatin1Char('n')                    && c[8] == QLatin1Char('t'))                return QScriptGrammar::T_RESERVED_WORD;            else if (c[0] == QLatin1Char('p') && c[1] == QLatin1Char('r')                    && c[2] == QLatin1Char('o') && c[3] == QLatin1Char('t')                    && c[4] == QLatin1Char('e') && c[5] == QLatin1Char('c')                    && c[6] == QLatin1Char('t') && c[7] == QLatin1Char('e')                    && c[8] == QLatin1Char('d'))                return QScriptGrammar::T_RESERVED_WORD;        }    }   break;    case 10: {        if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('n')                && c[2] == QLatin1Char('s') && c[3] == QLatin1Char('t')                && c[4] == QLatin1Char('a') && c[5] == QLatin1Char('n')                && c[6] == QLatin1Char('c') && c[7] == QLatin1Char('e')                && c[8] == QLatin1Char('o') && c[9] == QLatin1Char('f'))            return QScriptGrammar::T_INSTANCEOF;        else if (check_reserved) {            if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('m')                    && c[2] == QLatin1Char('p') && c[3] == QLatin1Char('l')                    && c[4] == QLatin1Char('e') && c[5] == QLatin1Char('m')                    && c[6] == QLatin1Char('e') && c[7] == QLatin1Char('n')                    && c[8] == QLatin1Char('t') && c[9] == QLatin1Char('s'))                return QScriptGrammar::T_RESERVED_WORD;        }    }   break;    case 12: {        if (check_reserved) {            if (c[0] == QLatin1Char('s') && c[1] == QLatin1Char('y')                    && c[2] == QLatin1Char('n') && c[3] == QLatin1Char('c')                    && c[4] == QLatin1Char('h') && c[5] == QLatin1Char('r')                    && c[6] == QLatin1Char('o') && c[7] == QLatin1Char('n')                    && c[8] == QLatin1Char('i') && c[9] == QLatin1Char('z')                    && c[10] == QLatin1Char('e') && c[11] == QLatin1Char('d'))                return QScriptGrammar::T_RESERVED_WORD;        }    }   break;    } // switch    return -1;}int QScript::Lexer::lex(){    int token = 0;    state = Start;    ushort stringType = 0; // either single or double quotes    pos8 = pos16 = 0;    done = false;    terminator = false;    // did we push a token on the stack previously ?    // (after an automatic semicolon insertion)    if (stackToken >= 0) {        setDone(Other);        token = stackToken;        stackToken = -1;    }    while (!done) {        switch (state) {        case Start:            if (isWhiteSpace()) {                // do nothing            } else if (current == '/' && next1 == '/') {                recordStartPos();                shift(1);                state = InSingleLineComment;            } else if (current == '/' && next1 == '*') {                recordStartPos();                shift(1);                state = InMultiLineComment;            } else if (current == 0) {                if (!terminator && !delimited) {                    // automatic semicolon insertion if program incomplete                    token = QScriptGrammar::T_SEMICOLON;                    stackToken = 0;                    setDone(Other);                } else {                    setDone(Eof);                }            } else if (isLineTerminator()) {                shiftWindowsLineBreak();                yylineno++;                yycolumn = -1;                bol = true;                terminator = true;                if (restrKeyword) {                    token = QScriptGrammar::T_SEMICOLON;                    setDone(Other);                }            } else if (current == '"' || current == '\'') {                recordStartPos();                state = InString;                stringType = current;            } else if (isIdentLetter(current)) {                recordStartPos();                record16(current);                state = InIdentifier;            } else if (current == '0') {                recordStartPos();                record8(current);                state = InNum0;            } else if (isDecimalDigit(current)) {                recordStartPos();                record8(current);                state = InNum;            } else if (current == '.' && isDecimalDigit(next1)) {                recordStartPos();                record8(current);                state = InDecimal;            } else {                recordStartPos();                token = matchPunctuator(current, next1, next2, next3);                if (token != -1) {                    if (terminator && !delimited                        && (token == QScriptGrammar::T_PLUS_PLUS                            || token == QScriptGrammar::T_MINUS_MINUS)) {                        // automatic semicolon insertion                        stackToken = token;                        token = QScriptGrammar::T_SEMICOLON;                    }                    setDone(Other);                }                else {                    setDone(Bad);                    errmsg = QLatin1String("Illegal character");                }            }            break;        case InString:            if (current == stringType) {                shift(1);                setDone(String);            } else if (current == 0 || isLineTerminator()) {                setDone(Bad);                errmsg = QLatin1String("Unclosed string at end of line");            } else if (current == '\\') {                state = InEscapeSequence;            } else {                record16(current);            }            break;            // Escape Sequences inside of strings        case InEscapeSequence:            if (isOctalDigit(current)) {                if (current >= '0' && current <= '3' &&                     isOctalDigit(next1) && isOctalDigit(next2)) {                    record16(convertOctal(current, next1, next2));                    shift(2);                    state = InString;                } else if (isOctalDigit(current) &&                            isOctalDigit(next1)) {                    record16(convertOctal('0', current, next1));                    shift(1);                    state = InString;                } else if (isOctalDigit(current)) {                    record16(convertOctal('0', '0', current));                    state = InString;                } else {                    setDone(Bad);                    errmsg = QLatin1String("Illegal escape squence");                }            } else if (current == 'x')                state = InHexEscape;            else if (current == 'u')                state = InUnicodeEscape;            else {                record16(singleEscape(current));                state = InString;            }            break;        case InHexEscape:            if (isHexDigit(current) && isHexDigit(next1)) {                state = InString;                record16(QLatin1Char(convertHex(current, next1)));                shift(1);            } else if (current == stringType) {                record16(QLatin1Char('x'));                shift(1);                setDone(String);            } else {                record16(QLatin1Char('x'));                record16(current);                state = InString;            }            break;        case InUnicodeEscape:            if (isHexDigit(current) && isHexDigit(next1) &&                 isHexDigit(next2) && isHexDigit(next3)) {                record16(convertUnicode(current, next1, next2, next3));                shift(3);                state = InString;            } else if (current == stringType) {                record16(QLatin1Char('u'));                shift(1);                setDone(String);            } else {                setDone(Bad);                errmsg = QLatin1String("Illegal unicode escape sequence");            }            break;        case InSingleLineComment:            if (isLineTerminator()) {                shiftWindowsLineBreak();                yylineno++;                yycolumn = -1;                terminator = true;                bol = true;                if (restrKeyword) {                    token = QScriptGrammar::T_SEMICOLON;                    setDone(Other);                } else                    state = Start;            } else if (current == 0) {                setDone(Eof);            }            break;        case InMultiLineComment:            if (current == 0) {                setDone(Bad);                errmsg = QLatin1String("Unclosed comment at end of file");            } else if (isLineTerminator()) {                shiftWindowsLineBreak();                yylineno++;            } else if (current == '*' && next1 == '/') {                state = Start;                shift(1);            }            break;        case InIdentifier:            if (isIdentLetter(current) || isDecimalDigit(current)) {                record16(current);                break;            }            setDone(Identifier);            break;        case InNum0:            if (current == 'x' || current == 'X') {                record8(current);                state = InHex;            } else if (current == '.') {                record8(current);                state = InDecimal;            } else if (current == 'e' || current == 'E') {                record8(current);                state = InExponentIndicator;            } else if (isOctalDigit(current)) {                record8(current);                state = InOctal;            } else if (isDecimalDigit(current)) {                record8(current);                state = InDecimal;            } else {                setDone(Number);            }            break;        case InHex:            if (isHexDigit(current))                record8(current);            else                setDone(Hex);            break;        case InOctal:            if (isOctalDigit(current)) {                record8(current);            } else if (isDecimalDigit(current)) {                record8(current);                state = InDecimal;            } else {                setDone(Octal);            }            break;        case InNum:            if (isDecimalDigit(current)) {                record8(current);            } else if (current == '.') {                record8(current);                state = InDecimal;            } else if (current == 'e' || current == 'E') {                record8(current);                state = InExponentIndicator;            } else {                setDone(Number);            }            break;        case InDecimal:            if (isDecimalDigit(current)) {                record8(current);            } else if (current == 'e' || current == 'E') {                record8(current);                state = InExponentIndicator;            } else {                setDone(Number);            }            break;        case InExponentIndicator:            if (current == '+' || current == '-') {                record8(current);            } else if (isDecimalDigit(current)) {                record8(current);                state = InExponent;            } else {                setDone(Bad);                errmsg = QLatin1String("Illegal syntax for exponential number");            }            break;        case InExponent:            if (isDecimalDigit(current)) {                record8(current);            } else {                setDone(Number);            }            break;        default:            Q_ASSERT_X(0, "Lexer::lex", "Unhandled state in switch statement");        }        // move on to the next character        if (!done)            shift(1);        if (state != Start && state != InSingleLineComment)            bol = false;    }    // no identifiers allowed directly after numeric literal, e.g. "3in" is bad    if ((state == Number || state == Octal || state == Hex)         && isIdentLetter(current)) {        state = Bad;        errmsg = QLatin1String("Identifier cannot start with numeric literal");    }    // terminate string    buffer8[pos8] = '\0';    double dval = 0;    if (state == Number) {#if defined(Q_WS_WIN) || defined(Q_OS_SOLARIS) || defined(Q_OS_IRIX) || defined(Q_CC_HPACC) || defined(Q_OS_AIX) || defined(Q_OS_OPENBSD)        // ### This may cause autotest failure, but that's just plain weird...

⌨️ 快捷键说明

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