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

📄 scanner.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the tools applications 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 "scanner.h"#include "moc.h"#include "utils.h"#include "keywords.cpp"Symbols Scanner::scan(const QByteArray &input){    Symbols symbols;    const char *begin = input;    const char *data = begin;    int lineNum = 1;    while (*data) {        const char *lexem = data;        int state = 0;        Token token = NOTOKEN;        for (;;) {            if (static_cast<signed char>(*data) < 0) {                ++data;                continue;            }            int nextindex = keywords[state].next;            int next = 0;            if (*data == keywords[state].defchar)                next = keywords[state].defnext;            else if (!state || nextindex)                    next = keyword_trans[nextindex][(int)*data];            if (!next)                break;            state = next;            token = keywords[state].token;            ++data;        }        // suboptimal, is_ident_char  should use a table        if (keywords[state].ident && is_ident_char(*data))            token = keywords[state].ident;        if (token == NOTOKEN) {            // an error really            ++data;            continue;        }        if (token > SPECIAL_TREATMENT_MARK) {            switch (token) {            case QUOTE:                data = skipQuote(data);                token = STRING_LITERAL;                break;            case SINGLEQUOTE:                while (*data && (*data != '\''                                 || (*(data-1)=='\\'                                     && *(data-2)!='\\')))                    ++data;                if (*data)                    ++data;                token = CHARACTER_LITERAL;                break;            case DIGIT:                while (is_digit_char(*data))                    ++data;                if (!*data || *data != '.') {                    token = INTEGER_LITERAL;                    if (data - lexem == 1 &&                         (*data == 'x' || *data == 'X')                         && *lexem == '0') {                        ++data;                        while (is_hex_char(*data))                            ++data;                    }                    break;                }                token = FLOATING_LITERAL;                ++data;                // fall through            case FLOATING_LITERAL:                while (is_digit_char(*data))                    ++data;                if (*data == '+' || *data == '-')                    ++data;                if (*data == 'e' || *data == 'E') {                    ++data;                    while (is_digit_char(*data))                        ++data;                }                if (*data == 'f' || *data == 'F'                    || *data == 'l' || *data == 'L')                    ++data;                break;            case HASH:                // not sure about this one, can only happen through                // macro substitution. Ignore until next line?                break;            case MOC_INCLUDE_BEGIN:                lineNum = 0;                break;            case MOC_INCLUDE_END:                symbols += Symbol(lineNum, token, input, lexem-begin, data-lexem);                ++data;                lineNum = 0;                while (is_digit_char(*data)) {                    lineNum = lineNum * 10 + *data - '0';                    ++data;                }                continue;            case NEWLINE:                ++lineNum;                continue;            case MOC_NEXT_IS_IDENTIFIER:                while (is_whitespace(*data))                    ++data;                lexem = data;                // fall through            case CHARACTER:                while (is_ident_char(*data))                    ++data;                token = IDENTIFIER;                break;            case WHITESPACE:            default:                continue; //ignore            }        }        symbols += Symbol(lineNum, token, input, lexem-begin, data-lexem);        //qDebug("%d (%d): %s", lineNum, token, QByteArray(lexem, data-lexem).constData());    }    symbols += Symbol(); // eof symbol    return symbols;}

⌨️ 快捷键说明

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