📄 qscriptlexer.cpp
字号:
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 + -