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

📄 qscriptlexer.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        dval = strtod(buffer8, 0L);#else        dval = strtold(buffer8, 0L);#endif    } else if (state == Hex) { // scan hex numbers        quint64 i;#if defined(_MSC_VER) && _MSC_VER >= 1400        sscanf_s(buffer8, "%llx", &i);#elif defined(Q_WS_WIN)        sscanf(buffer8, "%I64x", &i);#else        sscanf(buffer8, "%llx", &i);#endif#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET        dval = qint64(i);#else        dval = i;#endif        state = Number;    } else if (state == Octal) {   // scan octal number        quint64 ui;#if defined(_MSC_VER) && _MSC_VER >= 1400        sscanf_s(buffer8, "%llo", &ui);#elif defined(Q_WS_WIN)        sscanf(buffer8, "%I64o", &ui);#else        sscanf(buffer8, "%llo", &ui);#endif#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET        dval = qint64(ui);#else        dval = ui;#endif        state = Number;    }    restrKeyword = false;    delimited = false;    switch (state) {    case Eof:        return 0;    case Other:        if(token == QScriptGrammar::T_RBRACE || token == QScriptGrammar::T_SEMICOLON)            delimited = true;        return token;    case Identifier:        if ((token = findReservedWord(buffer16, pos16)) < 0) {            /* TODO: close leak on parse error. same holds true for String */            if (driver)                qsyylval.ustr = driver->intern(buffer16, pos16);            else                qsyylval.ustr = 0;            return QScriptGrammar::T_IDENTIFIER;        }        if (token == QScriptGrammar::T_CONTINUE || token == QScriptGrammar::T_BREAK ||             token == QScriptGrammar::T_RETURN || token == QScriptGrammar::T_THROW)            restrKeyword = true;        return token;    case String:        if (driver)            qsyylval.ustr = driver->intern(buffer16, pos16);        else            qsyylval.ustr = 0;        return QScriptGrammar::T_STRING_LITERAL;    case Number:        qsyylval.dval = dval;        return QScriptGrammar::T_NUMERIC_LITERAL;    case Bad:        return -1;    default:        Q_ASSERT(!"unhandled numeration value in switch");        return -1;    }}bool QScript::Lexer::isWhiteSpace() const{    return (current == ' ' || current == '\t' ||             current == 0x0b || current == 0x0c);}bool QScript::Lexer::isLineTerminator() const{    return (current == '\n' || current == '\r');}bool QScript::Lexer::isIdentLetter(ushort c){    /* TODO: allow other legitimate unicode chars */    return (c >= 'a' && c <= 'z' ||             c >= 'A' && c <= 'Z' ||             c == '$' || c == '_');}bool QScript::Lexer::isDecimalDigit(ushort c){    return (c >= '0' && c <= '9');}bool QScript::Lexer::isHexDigit(ushort c) const{    return (c >= '0' && c <= '9' ||             c >= 'a' && c <= 'f' ||             c >= 'A' && c <= 'F');}bool QScript::Lexer::isOctalDigit(ushort c) const{    return (c >= '0' && c <= '7');}int QScript::Lexer::matchPunctuator(ushort c1, ushort c2,                            ushort c3, ushort c4){    if (c1 == '>' && c2 == '>' && c3 == '>' && c4 == '=') {        shift(4);        return QScriptGrammar::T_GT_GT_GT_EQ;    } else if (c1 == '=' && c2 == '=' && c3 == '=') {        shift(3);        return QScriptGrammar::T_EQ_EQ_EQ;    } else if (c1 == '!' && c2 == '=' && c3 == '=') {        shift(3);        return QScriptGrammar::T_NOT_EQ_EQ;    } else if (c1 == '>' && c2 == '>' && c3 == '>') {        shift(3);        return QScriptGrammar::T_GT_GT_GT;    } else if (c1 == '<' && c2 == '<' && c3 == '=') {        shift(3);        return QScriptGrammar::T_LT_LT_EQ;    } else if (c1 == '>' && c2 == '>' && c3 == '=') {        shift(3);        return QScriptGrammar::T_GT_GT_EQ;    } else if (c1 == '<' && c2 == '=') {        shift(2);        return QScriptGrammar::T_LE;    } else if (c1 == '>' && c2 == '=') {        shift(2);        return QScriptGrammar::T_GE;    } else if (c1 == '!' && c2 == '=') {        shift(2);        return QScriptGrammar::T_NOT_EQ;    } else if (c1 == '+' && c2 == '+') {        shift(2);        return QScriptGrammar::T_PLUS_PLUS;    } else if (c1 == '-' && c2 == '-') {        shift(2);        return QScriptGrammar::T_MINUS_MINUS;    } else if (c1 == '=' && c2 == '=') {        shift(2);        return QScriptGrammar::T_EQ_EQ;    } else if (c1 == '+' && c2 == '=') {        shift(2);        return QScriptGrammar::T_PLUS_EQ;    } else if (c1 == '-' && c2 == '=') {        shift(2);        return QScriptGrammar::T_MINUS_EQ;    } else if (c1 == '*' && c2 == '=') {        shift(2);        return QScriptGrammar::T_STAR_EQ;    } else if (c1 == '/' && c2 == '=') {        shift(2);        return QScriptGrammar::T_DIVIDE_EQ;    } else if (c1 == '&' && c2 == '=') {        shift(2);        return QScriptGrammar::T_AND_EQ;    } else if (c1 == '^' && c2 == '=') {        shift(2);        return QScriptGrammar::T_XOR_EQ;    } else if (c1 == '%' && c2 == '=') {        shift(2);        return QScriptGrammar::T_REMAINDER_EQ;    } else if (c1 == '|' && c2 == '=') {        shift(2);        return QScriptGrammar::T_OR_EQ;    } else if (c1 == '<' && c2 == '<') {        shift(2);        return QScriptGrammar::T_LT_LT;    } else if (c1 == '>' && c2 == '>') {        shift(2);        return QScriptGrammar::T_GT_GT;    } else if (c1 == '&' && c2 == '&') {        shift(2);        return QScriptGrammar::T_AND_AND;    } else if (c1 == '|' && c2 == '|') {        shift(2);        return QScriptGrammar::T_OR_OR;    }    switch(c1) {        case '=': shift(1); return QScriptGrammar::T_EQ;        case '>': shift(1); return QScriptGrammar::T_GT;        case '<': shift(1); return QScriptGrammar::T_LT;        case ',': shift(1); return QScriptGrammar::T_COMMA;        case '!': shift(1); return QScriptGrammar::T_NOT;        case '~': shift(1); return QScriptGrammar::T_TILDE;        case '?': shift(1); return QScriptGrammar::T_QUESTION;        case ':': shift(1); return QScriptGrammar::T_COLON;        case '.': shift(1); return QScriptGrammar::T_DOT;        case '+': shift(1); return QScriptGrammar::T_PLUS;        case '-': shift(1); return QScriptGrammar::T_MINUS;        case '*': shift(1); return QScriptGrammar::T_STAR;        case '/': shift(1); return QScriptGrammar::T_DIVIDE_;        case '&': shift(1); return QScriptGrammar::T_AND;        case '|': shift(1); return QScriptGrammar::T_OR;        case '^': shift(1); return QScriptGrammar::T_XOR;        case '%': shift(1); return QScriptGrammar::T_REMAINDER;        case '(': shift(1); return QScriptGrammar::T_LPAREN;        case ')': shift(1); return QScriptGrammar::T_RPAREN;        case '{': shift(1); return QScriptGrammar::T_LBRACE;        case '}': shift(1); return QScriptGrammar::T_RBRACE;        case '[': shift(1); return QScriptGrammar::T_LBRACKET;        case ']': shift(1); return QScriptGrammar::T_RBRACKET;        case ';': shift(1); return QScriptGrammar::T_SEMICOLON;        default: return -1;    }}ushort QScript::Lexer::singleEscape(ushort c) const{    switch(c) {    case 'b':        return 0x08;    case 't':        return 0x09;    case 'n':        return 0x0A;    case 'v':        return 0x0B;    case 'f':        return 0x0C;    case 'r':        return 0x0D;    case '"':        return 0x22;    case '\'':        return 0x27;    case '\\':        return 0x5C;    default:        return c;    }}ushort QScript::Lexer::convertOctal(ushort c1, ushort c2,                            ushort c3) const{    return ((c1 - '0') * 64 + (c2 - '0') * 8 + c3 - '0');}unsigned char QScript::Lexer::convertHex(ushort c){    if (c >= '0' && c <= '9')        return (c - '0');    else if (c >= 'a' && c <= 'f')        return (c - 'a' + 10);    else        return (c - 'A' + 10);}unsigned char QScript::Lexer::convertHex(ushort c1, ushort c2){    return ((convertHex(c1) << 4) + convertHex(c2));}QChar QScript::Lexer::convertUnicode(ushort c1, ushort c2,                             ushort c3, ushort c4){    return QChar((convertHex(c3) << 4) + convertHex(c4),                  (convertHex(c1) << 4) + convertHex(c2));}void QScript::Lexer::record8(ushort c){    Q_ASSERT(c <= 0xff);    // enlarge buffer if full    if (pos8 >= size8 - 1) {        char *tmp = new char[2 * size8];        memcpy(tmp, buffer8, size8 * sizeof(char));        delete [] buffer8;        buffer8 = tmp;        size8 *= 2;    }    buffer8[pos8++] = (char) c;}void QScript::Lexer::record16(QChar c){    // enlarge buffer if full    if (pos16 >= size16 - 1) {        QChar *tmp = new QChar[2 * size16];        memcpy(tmp, buffer16, size16 * sizeof(QChar));        delete [] buffer16;        buffer16 = tmp;        size16 *= 2;    }    buffer16[pos16++] = c;}void QScript::Lexer::recordStartPos(){    startlineno = yylineno;    startcolumn = yycolumn;}bool QScript::Lexer::scanRegExp(){    pos16 = 0;    bool lastWasEscape = false;    while (1) {        if (isLineTerminator() || current == 0) {            errmsg = QLatin1String("Unterminated regular expression literal");            return false;        }        else if (current != '/' || lastWasEscape == true)            {                record16(current);                lastWasEscape = !lastWasEscape && (current == '\\');            }        else {            if (driver)                pattern = driver->intern(buffer16, pos16);            else                pattern = 0;            pos16 = 0;            shift(1);            break;        }        shift(1);    }    while (isIdentLetter(current)) {        record16(current);        shift(1);    }    if (driver)        flags = driver->intern(buffer16, pos16);    else        flags = 0;    return true;}#endif // QT_NO_SCRIPT

⌨️ 快捷键说明

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