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

📄 cpplexer.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.** Copyright (C) 2001-2004 Roberto Raggi**** This file is part of the qt3to4 porting application of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "cpplexer.h"#include <QChar>#include <ctype.h>using namespace TokenEngine;CppLexer::CppLexer(){    setupScanTable();}void CppLexer::setupScanTable(){    s_scan_keyword_table[0] = &CppLexer::scanKeyword0;    s_scan_keyword_table[1] = &CppLexer::scanKeyword0;    s_scan_keyword_table[2] = &CppLexer::scanKeyword2;    s_scan_keyword_table[3] = &CppLexer::scanKeyword3;    s_scan_keyword_table[4] = &CppLexer::scanKeyword4;    s_scan_keyword_table[5] = &CppLexer::scanKeyword5;    s_scan_keyword_table[6] = &CppLexer::scanKeyword6;    s_scan_keyword_table[7] = &CppLexer::scanKeyword7;    s_scan_keyword_table[8] = &CppLexer::scanKeyword8;    s_scan_keyword_table[9] = &CppLexer::scanKeyword9;    s_scan_keyword_table[10] = &CppLexer::scanKeyword10;    s_scan_keyword_table[11] = &CppLexer::scanKeyword11;    s_scan_keyword_table[12] = &CppLexer::scanKeyword12;    s_scan_keyword_table[13] = &CppLexer::scanKeyword0;    s_scan_keyword_table[14] = &CppLexer::scanKeyword14;    s_scan_keyword_table[15] = &CppLexer::scanKeyword0;    s_scan_keyword_table[16] = &CppLexer::scanKeyword16;    memset(s_attr_table, 0, 256);    for (int i=0; i<128; ++i) {        switch (i) {        case ':':        case '*':        case '/':        case '%':        case '^':        case '=':        case '!':        case '&':        case '|':        case '+':        case '<':        case '>':        case '-':        case '.':            s_scan_table[i] = &CppLexer::scanOperator;            break;        case '\r':        case '\n':            s_scan_table[i] = &CppLexer::scanNewline;            break;        case '\'':            s_scan_table[i] = &CppLexer::scanCharLiteral;            break;        case '"':            s_scan_table[i] = &CppLexer::scanStringLiteral;            break;        default:            if (isspace(i)) {                s_scan_table[i] = &CppLexer::scanWhiteSpaces;                s_attr_table[i] |= A_Whitespace;            } else if (isalpha(i) || i == '_') {                s_scan_table[i] = &CppLexer::scanIdentifier;                s_attr_table[i] |= A_Alpha;            } else if (isdigit(i)) {                s_scan_table[i] = &CppLexer::scanNumberLiteral;                s_attr_table[i] |= A_Digit;            } else                s_scan_table[i] = &CppLexer::scanChar;        }    }    s_scan_table[128] = &CppLexer::scanUnicodeChar;}QVector<Type> CppLexer::lex(TokenSectionSequence tokenSectionSequence){    QVector<Type> tokenTypes;    tokenTypes.reserve(tokenSectionSequence.count());    TokenSectionSequenceIterator it(tokenSectionSequence);    while(it.nextToken()) {        tokenTypes.append(identify(it.tokenTempRef()));    }    return tokenTypes;}Type CppLexer::identify(const TokenTempRef &tokenTempRef){    Q_ASSERT(tokenTempRef.length() >= 0 );    m_buffer = tokenTempRef.constData();    m_len = tokenTempRef.length();    m_ptr = 0;    const unsigned char ch = m_buffer[0];    int kind = 0;    (this->*s_scan_table[ch < 128 ? ch : 128])(&kind);    return (Type)kind;}void CppLexer::scanKeyword0(int *kind){    *kind = Token_identifier;}void CppLexer::scanKeyword2(int *kind){    switch (m_buffer[m_ptr]) {        case 'i':        if (m_buffer[m_ptr+1] == 'f')        {            *kind = Token_if;            return;        }        break;        case 'd':        if (m_buffer[m_ptr+1] == 'o')        {            *kind = Token_do;            return;        }        break;        case 'o':        if (m_buffer[m_ptr+1] == 'r')        {            *kind = Token_or;            return;        }        break;    }    *kind = Token_identifier;}void CppLexer::scanKeyword3(int *kind){    switch (m_buffer[m_ptr]) {        case 'a':        if (m_buffer[m_ptr+1] == 'n' &&            m_buffer[m_ptr+2] == 'd')        {            *kind = Token_and;            return;        }        if (m_buffer[m_ptr+1] == 's' &&            m_buffer[m_ptr+2] == 'm')        {            *kind = Token_asm;            return;        }        break;        case 'f':        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'r')        {            *kind = Token_for;            return;        }        break;        case 'i':        if (m_buffer[m_ptr+1] == 'n' &&            m_buffer[m_ptr+2] == 't')        {            *kind = Token_int;            return;        }        break;        case 'n':        if (m_buffer[m_ptr+1] == 'e' &&            m_buffer[m_ptr+2] == 'w')        {            *kind = Token_new;            return;        }        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 't')        {            *kind = Token_not;            return;        }        break;        case 't':        if (m_buffer[m_ptr+1] == 'r' &&            m_buffer[m_ptr+2] == 'y')        {            *kind = Token_try;            return;        }        break;         case 'x':        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'r')        {            *kind = Token_xor;            return;        }        break;    }    *kind = Token_identifier;}void CppLexer::scanKeyword4(int *kind){    switch (m_buffer[m_ptr]) {        case 'a':        if (m_buffer[m_ptr+1] == 'u' &&            m_buffer[m_ptr+2] == 't' &&            m_buffer[m_ptr+3] == 'o')        {            *kind = Token_auto;            return;        }        break;        case 'c':        if (m_buffer[m_ptr+1] == 'a' &&            m_buffer[m_ptr+2] == 's' &&            m_buffer[m_ptr+3] == 'e')        {            *kind = Token_case;            return;        }        if (m_buffer[m_ptr+1] == 'h' &&            m_buffer[m_ptr+2] == 'a' &&            m_buffer[m_ptr+3] == 'r')        {            *kind = Token_char;            return;        }        break;        case 'b':        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'o' &&            m_buffer[m_ptr+3] == 'l')        {            *kind = Token_bool;            return;        }        break;        case 'e':        if (m_buffer[m_ptr+1] == 'l' &&            m_buffer[m_ptr+2] == 's' &&            m_buffer[m_ptr+3] == 'e')        {            *kind = Token_else;            return;        }        if (m_buffer[m_ptr+1] == 'm' &&            m_buffer[m_ptr+2] == 'i' &&            m_buffer[m_ptr+3] == 't')        {            *kind = Token_emit;            return;        }        if (m_buffer[m_ptr+1] == 'n' &&            m_buffer[m_ptr+2] == 'u' &&            m_buffer[m_ptr+3] == 'm')        {            *kind = Token_enum;            return;        }        break;        case 'g':        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 't' &&            m_buffer[m_ptr+3] == 'o')        {            *kind = Token_goto;             return;        }        break;        case 'l':        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'n' &&            m_buffer[m_ptr+3] == 'g')        {            *kind = Token_long;            return;        }        break;        case 't':        if (m_buffer[m_ptr+1] == 'h' &&            m_buffer[m_ptr+2] == 'i' &&            m_buffer[m_ptr+3] == 's')        {            *kind = Token_this;            return;        }        break;        case 'v':        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'i' &&            m_buffer[m_ptr+3] == 'd')        {            *kind = Token_void;            return;        }        break;    }    *kind = Token_identifier;}void CppLexer::scanKeyword5(int *kind){    switch (m_buffer[m_ptr]) {        case 'c':        if (m_buffer[m_ptr+1] == 'a' &&            m_buffer[m_ptr+2] == 't' &&            m_buffer[m_ptr+3] == 'c' &&            m_buffer[m_ptr+4] == 'h')        {            *kind = Token_catch;            return;        }        if (m_buffer[m_ptr+1] == 'l' &&            m_buffer[m_ptr+2] == 'a' &&            m_buffer[m_ptr+3] == 's' &&            m_buffer[m_ptr+4] == 's')        {            *kind = Token_class;            return;        }        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'm' &&            m_buffer[m_ptr+3] == 'p' &&            m_buffer[m_ptr+4] == 'l')        {            *kind = Token_compl;            return;        }        if (m_buffer[m_ptr+1] == 'o' &&            m_buffer[m_ptr+2] == 'n' &&            m_buffer[m_ptr+3] == 's' &&            m_buffer[m_ptr+4] == 't')        {            *kind = Token_const;            return;        }        break;        case 'b':        if (m_buffer[m_ptr+1] == 'i' &&            m_buffer[m_ptr+2] == 't' &&            m_buffer[m_ptr+3] == 'o' &&            m_buffer[m_ptr+4] == 'r')        {            *kind = Token_bitor;            return;        }        if (m_buffer[m_ptr+1] == 'r' &&            m_buffer[m_ptr+2] == 'e' &&            m_buffer[m_ptr+3] == 'a' &&            m_buffer[m_ptr+4] == 'k')        {            *kind = Token_break;            return;        }        break;        case 'f':        if (m_buffer[m_ptr+1] == 'l' &&            m_buffer[m_ptr+2] == 'o' &&            m_buffer[m_ptr+3] == 'a' &&            m_buffer[m_ptr+4] == 't')        {            *kind = Token_float;            return;        }        break;        case 'o':        if (m_buffer[m_ptr+1] == 'r' &&            m_buffer[m_ptr+2] == '_' &&            m_buffer[m_ptr+3] == 'e' &&            m_buffer[m_ptr+4] == 'q')        {            *kind = Token_or_eq;            return;        }        break;

⌨️ 快捷键说明

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