📄 cpplexer.cpp
字号:
/******************************************************************************** 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 + -