annotate generator/parser/lexer.cpp @ 414:b2a803c73b89 default tip

Declare tabArray const.
author David Nadlinger <code@klickverbot.at>
date Fri, 06 May 2011 13:39:49 +0200
parents 09a0f1d048f2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
52
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
3 ** Copyright (C) 1992-2009 Nokia. All rights reserved.
1
e78566595089 initial import
mandel
parents:
diff changeset
4 ** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
e78566595089 initial import
mandel
parents:
diff changeset
5 **
e78566595089 initial import
mandel
parents:
diff changeset
6 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
7 **
52
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
8 ** Commercial Usage
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
9 Licensees holding valid Qt Commercial licenses may use this file in
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
10 accordance with the Qt Commercial License Agreement provided with the
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
11 Software or, alternatively, in accordance with the terms contained in
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
12 a written agreement between you and Nokia.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
13
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
14 GNU Lesser General Public License Usage
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
15 Alternatively, this file may be used under the terms of the GNU Lesser
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
16 General Public License version 2.1 as published by the Free Software
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
17 Foundation and appearing in the file LICENSE.LGPL included in the
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
18 packaging of this file. Please review the following information to
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
19 ensure the GNU Lesser General Public License version 2.1 requirements
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
20 will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
21
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
22 In addition, as a special exception, Nokia gives you certain
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
23 additional rights. These rights are described in the Nokia Qt LGPL
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
24 Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
25 package.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
26
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
27 GNU General Public License Usage
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
28 Alternatively, this file may be used under the terms of the GNU
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
29 General Public License version 3.0 as published by the Free Software
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
30 Foundation and appearing in the file LICENSE.GPL included in the
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
31 packaging of this file. Please review the following information to
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
32 ensure the GNU General Public License version 3.0 requirements will be
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
33 met: http://www.gnu.org/copyleft/gpl.html.
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
34
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
35 If you are unsure which license is appropriate for your use, please
09a0f1d048f2 update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
eldar
parents: 1
diff changeset
36 contact the sales department at qt-sales@nokia.com.
1
e78566595089 initial import
mandel
parents:
diff changeset
37
e78566595089 initial import
mandel
parents:
diff changeset
38 **
e78566595089 initial import
mandel
parents:
diff changeset
39 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
40 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
41 **
e78566595089 initial import
mandel
parents:
diff changeset
42 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
43
e78566595089 initial import
mandel
parents:
diff changeset
44
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "lexer.h"
e78566595089 initial import
mandel
parents:
diff changeset
46 #include "tokens.h"
e78566595089 initial import
mandel
parents:
diff changeset
47 #include "control.h"
e78566595089 initial import
mandel
parents:
diff changeset
48
e78566595089 initial import
mandel
parents:
diff changeset
49 #include <cctype>
e78566595089 initial import
mandel
parents:
diff changeset
50 #include <iostream>
e78566595089 initial import
mandel
parents:
diff changeset
51
e78566595089 initial import
mandel
parents:
diff changeset
52 scan_fun_ptr Lexer::s_scan_keyword_table[] = {
e78566595089 initial import
mandel
parents:
diff changeset
53 &Lexer::scanKeyword0, &Lexer::scanKeyword0,
e78566595089 initial import
mandel
parents:
diff changeset
54 &Lexer::scanKeyword2, &Lexer::scanKeyword3,
e78566595089 initial import
mandel
parents:
diff changeset
55 &Lexer::scanKeyword4, &Lexer::scanKeyword5,
e78566595089 initial import
mandel
parents:
diff changeset
56 &Lexer::scanKeyword6, &Lexer::scanKeyword7,
e78566595089 initial import
mandel
parents:
diff changeset
57 &Lexer::scanKeyword8, &Lexer::scanKeyword9,
e78566595089 initial import
mandel
parents:
diff changeset
58 &Lexer::scanKeyword10, &Lexer::scanKeyword11,
e78566595089 initial import
mandel
parents:
diff changeset
59 &Lexer::scanKeyword12, &Lexer::scanKeyword13,
e78566595089 initial import
mandel
parents:
diff changeset
60 &Lexer::scanKeyword14, &Lexer::scanKeyword0,
e78566595089 initial import
mandel
parents:
diff changeset
61 &Lexer::scanKeyword16
e78566595089 initial import
mandel
parents:
diff changeset
62 };
e78566595089 initial import
mandel
parents:
diff changeset
63
e78566595089 initial import
mandel
parents:
diff changeset
64 void LocationManager::extract_line(int offset, int *line, QString *filename) const
e78566595089 initial import
mandel
parents:
diff changeset
65 {
e78566595089 initial import
mandel
parents:
diff changeset
66 *line = 0;
e78566595089 initial import
mandel
parents:
diff changeset
67 if (token_stream.size () < 1)
e78566595089 initial import
mandel
parents:
diff changeset
68 return;
e78566595089 initial import
mandel
parents:
diff changeset
69
e78566595089 initial import
mandel
parents:
diff changeset
70 const unsigned char *begin_buffer = reinterpret_cast<const unsigned char *>(token_stream[0].text);
e78566595089 initial import
mandel
parents:
diff changeset
71 const unsigned char *cursor = begin_buffer + offset;
e78566595089 initial import
mandel
parents:
diff changeset
72
e78566595089 initial import
mandel
parents:
diff changeset
73 ++cursor; // skip '#'
e78566595089 initial import
mandel
parents:
diff changeset
74 if (std::isspace(*cursor) && std::isdigit(*(cursor + 1)))
e78566595089 initial import
mandel
parents:
diff changeset
75 {
e78566595089 initial import
mandel
parents:
diff changeset
76 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
77 char buffer[1024], *cp = buffer;
e78566595089 initial import
mandel
parents:
diff changeset
78 do {
e78566595089 initial import
mandel
parents:
diff changeset
79 *cp++ = *cursor++;
e78566595089 initial import
mandel
parents:
diff changeset
80 } while (std::isdigit(*cursor));
e78566595089 initial import
mandel
parents:
diff changeset
81 *cp = '\0';
e78566595089 initial import
mandel
parents:
diff changeset
82 int l = strtol(buffer, 0, 0);
e78566595089 initial import
mandel
parents:
diff changeset
83
e78566595089 initial import
mandel
parents:
diff changeset
84 Q_ASSERT(std::isspace(*cursor));
e78566595089 initial import
mandel
parents:
diff changeset
85 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
86
e78566595089 initial import
mandel
parents:
diff changeset
87 Q_ASSERT(*cursor == '"');
e78566595089 initial import
mandel
parents:
diff changeset
88 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
89
e78566595089 initial import
mandel
parents:
diff changeset
90 cp = buffer;
e78566595089 initial import
mandel
parents:
diff changeset
91 while (*cursor && *cursor != '"') {
e78566595089 initial import
mandel
parents:
diff changeset
92 *cp++ = *cursor++;
e78566595089 initial import
mandel
parents:
diff changeset
93 }
e78566595089 initial import
mandel
parents:
diff changeset
94 *cp = '\0';
e78566595089 initial import
mandel
parents:
diff changeset
95 Q_ASSERT(*cursor == '"');
e78566595089 initial import
mandel
parents:
diff changeset
96 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
97
e78566595089 initial import
mandel
parents:
diff changeset
98 *filename = buffer;
e78566595089 initial import
mandel
parents:
diff changeset
99 *line = l;
e78566595089 initial import
mandel
parents:
diff changeset
100 // printf("filename: %s line: %d\n", buffer, line);
e78566595089 initial import
mandel
parents:
diff changeset
101 }
e78566595089 initial import
mandel
parents:
diff changeset
102 }
e78566595089 initial import
mandel
parents:
diff changeset
103
e78566595089 initial import
mandel
parents:
diff changeset
104 void LocationManager::positionAt(std::size_t offset, int *line, int *column,
e78566595089 initial import
mandel
parents:
diff changeset
105 QString *filename) const
e78566595089 initial import
mandel
parents:
diff changeset
106 {
e78566595089 initial import
mandel
parents:
diff changeset
107 int ppline, ppcolumn;
e78566595089 initial import
mandel
parents:
diff changeset
108 line_table.positionAt(offset, &ppline, &ppcolumn);
e78566595089 initial import
mandel
parents:
diff changeset
109
e78566595089 initial import
mandel
parents:
diff changeset
110 int base_line;
e78566595089 initial import
mandel
parents:
diff changeset
111 extract_line((int) line_table[ppline-1], &base_line, filename);
e78566595089 initial import
mandel
parents:
diff changeset
112
e78566595089 initial import
mandel
parents:
diff changeset
113 int line2, column2;
e78566595089 initial import
mandel
parents:
diff changeset
114 location_table.positionAt((int) line_table[ppline-1], &line2, &column2);
e78566595089 initial import
mandel
parents:
diff changeset
115
e78566595089 initial import
mandel
parents:
diff changeset
116 location_table.positionAt(offset, line, column);
e78566595089 initial import
mandel
parents:
diff changeset
117 *line = base_line + *line - line2 - 1;
e78566595089 initial import
mandel
parents:
diff changeset
118 }
e78566595089 initial import
mandel
parents:
diff changeset
119
e78566595089 initial import
mandel
parents:
diff changeset
120 scan_fun_ptr Lexer::s_scan_table[256];
e78566595089 initial import
mandel
parents:
diff changeset
121 bool Lexer::s_initialized = false;
e78566595089 initial import
mandel
parents:
diff changeset
122
e78566595089 initial import
mandel
parents:
diff changeset
123 void Lexer::tokenize(const char *contents, std::size_t size)
e78566595089 initial import
mandel
parents:
diff changeset
124 {
e78566595089 initial import
mandel
parents:
diff changeset
125 if (!s_initialized)
e78566595089 initial import
mandel
parents:
diff changeset
126 initialize_scan_table();
e78566595089 initial import
mandel
parents:
diff changeset
127
e78566595089 initial import
mandel
parents:
diff changeset
128 token_stream.resize(1024);
e78566595089 initial import
mandel
parents:
diff changeset
129 token_stream[0].kind = Token_EOF;
e78566595089 initial import
mandel
parents:
diff changeset
130 token_stream[0].text = contents;
e78566595089 initial import
mandel
parents:
diff changeset
131
e78566595089 initial import
mandel
parents:
diff changeset
132 index = 1;
e78566595089 initial import
mandel
parents:
diff changeset
133
e78566595089 initial import
mandel
parents:
diff changeset
134 cursor = (const unsigned char *) contents;
e78566595089 initial import
mandel
parents:
diff changeset
135 begin_buffer = (const unsigned char *) contents;
e78566595089 initial import
mandel
parents:
diff changeset
136 end_buffer = cursor + size;
e78566595089 initial import
mandel
parents:
diff changeset
137
e78566595089 initial import
mandel
parents:
diff changeset
138 location_table.resize(1024);
e78566595089 initial import
mandel
parents:
diff changeset
139 location_table[0] = 0;
e78566595089 initial import
mandel
parents:
diff changeset
140 location_table.current_line = 1;
e78566595089 initial import
mandel
parents:
diff changeset
141
e78566595089 initial import
mandel
parents:
diff changeset
142 line_table.resize(1024);
e78566595089 initial import
mandel
parents:
diff changeset
143 line_table[0] = 0;
e78566595089 initial import
mandel
parents:
diff changeset
144 line_table.current_line = 1;
e78566595089 initial import
mandel
parents:
diff changeset
145
e78566595089 initial import
mandel
parents:
diff changeset
146 do {
e78566595089 initial import
mandel
parents:
diff changeset
147 if (index == token_stream.size())
e78566595089 initial import
mandel
parents:
diff changeset
148 token_stream.resize(token_stream.size() * 2);
e78566595089 initial import
mandel
parents:
diff changeset
149
e78566595089 initial import
mandel
parents:
diff changeset
150 Token *current_token = &token_stream[(int) index];
e78566595089 initial import
mandel
parents:
diff changeset
151 current_token->text = reinterpret_cast<const char*>(begin_buffer);
e78566595089 initial import
mandel
parents:
diff changeset
152 current_token->position = cursor - begin_buffer;
e78566595089 initial import
mandel
parents:
diff changeset
153 (this->*s_scan_table[*cursor])();
e78566595089 initial import
mandel
parents:
diff changeset
154 current_token->size = cursor - begin_buffer - current_token->position;
e78566595089 initial import
mandel
parents:
diff changeset
155 } while (cursor < end_buffer);
e78566595089 initial import
mandel
parents:
diff changeset
156
e78566595089 initial import
mandel
parents:
diff changeset
157 if (index == token_stream.size())
e78566595089 initial import
mandel
parents:
diff changeset
158 token_stream.resize(token_stream.size() * 2);
e78566595089 initial import
mandel
parents:
diff changeset
159
e78566595089 initial import
mandel
parents:
diff changeset
160 Q_ASSERT(index < token_stream.size());
e78566595089 initial import
mandel
parents:
diff changeset
161 token_stream[(int) index].position = cursor - begin_buffer;
e78566595089 initial import
mandel
parents:
diff changeset
162 token_stream[(int) index].kind = Token_EOF;
e78566595089 initial import
mandel
parents:
diff changeset
163 }
e78566595089 initial import
mandel
parents:
diff changeset
164
e78566595089 initial import
mandel
parents:
diff changeset
165 void Lexer::reportError(const QString& msg)
e78566595089 initial import
mandel
parents:
diff changeset
166 {
e78566595089 initial import
mandel
parents:
diff changeset
167 int line, column;
e78566595089 initial import
mandel
parents:
diff changeset
168 QString fileName;
e78566595089 initial import
mandel
parents:
diff changeset
169
e78566595089 initial import
mandel
parents:
diff changeset
170 std::size_t tok = token_stream.cursor();
e78566595089 initial import
mandel
parents:
diff changeset
171 _M_location.positionAt(token_stream.position(tok),
e78566595089 initial import
mandel
parents:
diff changeset
172 &line, &column, &fileName);
e78566595089 initial import
mandel
parents:
diff changeset
173
e78566595089 initial import
mandel
parents:
diff changeset
174 Control::ErrorMessage errmsg;
e78566595089 initial import
mandel
parents:
diff changeset
175 errmsg.setLine(line + 1);
e78566595089 initial import
mandel
parents:
diff changeset
176 errmsg.setColumn(column);
e78566595089 initial import
mandel
parents:
diff changeset
177 errmsg.setFileName(fileName);
e78566595089 initial import
mandel
parents:
diff changeset
178 errmsg.setMessage(QLatin1String("** LEXER ERROR ") + msg);
e78566595089 initial import
mandel
parents:
diff changeset
179 control->reportError(errmsg);
e78566595089 initial import
mandel
parents:
diff changeset
180 }
e78566595089 initial import
mandel
parents:
diff changeset
181
e78566595089 initial import
mandel
parents:
diff changeset
182 void Lexer::initialize_scan_table()
e78566595089 initial import
mandel
parents:
diff changeset
183 {
e78566595089 initial import
mandel
parents:
diff changeset
184 s_initialized = true;
e78566595089 initial import
mandel
parents:
diff changeset
185
e78566595089 initial import
mandel
parents:
diff changeset
186 for (int i=0; i<256; ++i)
e78566595089 initial import
mandel
parents:
diff changeset
187 {
e78566595089 initial import
mandel
parents:
diff changeset
188 if (isspace(i))
e78566595089 initial import
mandel
parents:
diff changeset
189 s_scan_table[i] = &Lexer::scan_white_spaces;
e78566595089 initial import
mandel
parents:
diff changeset
190 else if (isalpha(i) || i == '_')
e78566595089 initial import
mandel
parents:
diff changeset
191 s_scan_table[i] = &Lexer::scan_identifier_or_keyword;
e78566595089 initial import
mandel
parents:
diff changeset
192 else if (isdigit(i))
e78566595089 initial import
mandel
parents:
diff changeset
193 s_scan_table[i] = &Lexer::scan_int_constant;
e78566595089 initial import
mandel
parents:
diff changeset
194 else
e78566595089 initial import
mandel
parents:
diff changeset
195 s_scan_table[i] = &Lexer::scan_invalid_input;
e78566595089 initial import
mandel
parents:
diff changeset
196 }
e78566595089 initial import
mandel
parents:
diff changeset
197
e78566595089 initial import
mandel
parents:
diff changeset
198 s_scan_table[int('L')] = &Lexer::scan_identifier_or_literal;
e78566595089 initial import
mandel
parents:
diff changeset
199 s_scan_table[int('\n')] = &Lexer::scan_newline;
e78566595089 initial import
mandel
parents:
diff changeset
200 s_scan_table[int('#')] = &Lexer::scan_preprocessor;
e78566595089 initial import
mandel
parents:
diff changeset
201
e78566595089 initial import
mandel
parents:
diff changeset
202 s_scan_table[int('\'')] = &Lexer::scan_char_constant;
e78566595089 initial import
mandel
parents:
diff changeset
203 s_scan_table[int('"')] = &Lexer::scan_string_constant;
e78566595089 initial import
mandel
parents:
diff changeset
204
e78566595089 initial import
mandel
parents:
diff changeset
205 s_scan_table[int('.')] = &Lexer::scan_int_constant;
e78566595089 initial import
mandel
parents:
diff changeset
206
e78566595089 initial import
mandel
parents:
diff changeset
207 s_scan_table[int('!')] = &Lexer::scan_not;
e78566595089 initial import
mandel
parents:
diff changeset
208 s_scan_table[int('%')] = &Lexer::scan_remainder;
e78566595089 initial import
mandel
parents:
diff changeset
209 s_scan_table[int('&')] = &Lexer::scan_and;
e78566595089 initial import
mandel
parents:
diff changeset
210 s_scan_table[int('(')] = &Lexer::scan_left_paren;
e78566595089 initial import
mandel
parents:
diff changeset
211 s_scan_table[int(')')] = &Lexer::scan_right_paren;
e78566595089 initial import
mandel
parents:
diff changeset
212 s_scan_table[int('*')] = &Lexer::scan_star;
e78566595089 initial import
mandel
parents:
diff changeset
213 s_scan_table[int('+')] = &Lexer::scan_plus;
e78566595089 initial import
mandel
parents:
diff changeset
214 s_scan_table[int(',')] = &Lexer::scan_comma;
e78566595089 initial import
mandel
parents:
diff changeset
215 s_scan_table[int('-')] = &Lexer::scan_minus;
e78566595089 initial import
mandel
parents:
diff changeset
216 s_scan_table[int('/')] = &Lexer::scan_divide;
e78566595089 initial import
mandel
parents:
diff changeset
217 s_scan_table[int(':')] = &Lexer::scan_colon;
e78566595089 initial import
mandel
parents:
diff changeset
218 s_scan_table[int(';')] = &Lexer::scan_semicolon;
e78566595089 initial import
mandel
parents:
diff changeset
219 s_scan_table[int('<')] = &Lexer::scan_less;
e78566595089 initial import
mandel
parents:
diff changeset
220 s_scan_table[int('=')] = &Lexer::scan_equal;
e78566595089 initial import
mandel
parents:
diff changeset
221 s_scan_table[int('>')] = &Lexer::scan_greater;
e78566595089 initial import
mandel
parents:
diff changeset
222 s_scan_table[int('?')] = &Lexer::scan_question;
e78566595089 initial import
mandel
parents:
diff changeset
223 s_scan_table[int('[')] = &Lexer::scan_left_bracket;
e78566595089 initial import
mandel
parents:
diff changeset
224 s_scan_table[int(']')] = &Lexer::scan_right_bracket;
e78566595089 initial import
mandel
parents:
diff changeset
225 s_scan_table[int('^')] = &Lexer::scan_xor;
e78566595089 initial import
mandel
parents:
diff changeset
226 s_scan_table[int('{')] = &Lexer::scan_left_brace;
e78566595089 initial import
mandel
parents:
diff changeset
227 s_scan_table[int('|')] = &Lexer::scan_or;
e78566595089 initial import
mandel
parents:
diff changeset
228 s_scan_table[int('}')] = &Lexer::scan_right_brace;
e78566595089 initial import
mandel
parents:
diff changeset
229 s_scan_table[int('~')] = &Lexer::scan_tilde;
e78566595089 initial import
mandel
parents:
diff changeset
230
e78566595089 initial import
mandel
parents:
diff changeset
231 s_scan_table[0] = &Lexer::scan_EOF;
e78566595089 initial import
mandel
parents:
diff changeset
232 }
e78566595089 initial import
mandel
parents:
diff changeset
233
e78566595089 initial import
mandel
parents:
diff changeset
234 void Lexer::scan_preprocessor()
e78566595089 initial import
mandel
parents:
diff changeset
235 {
e78566595089 initial import
mandel
parents:
diff changeset
236 if (line_table.current_line == line_table.size())
e78566595089 initial import
mandel
parents:
diff changeset
237 line_table.resize(line_table.current_line * 2);
e78566595089 initial import
mandel
parents:
diff changeset
238
e78566595089 initial import
mandel
parents:
diff changeset
239 line_table[(int) line_table.current_line++] = (cursor - begin_buffer);
e78566595089 initial import
mandel
parents:
diff changeset
240
e78566595089 initial import
mandel
parents:
diff changeset
241 while (*cursor && *cursor != '\n')
e78566595089 initial import
mandel
parents:
diff changeset
242 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
243
e78566595089 initial import
mandel
parents:
diff changeset
244 if (*cursor != '\n')
e78566595089 initial import
mandel
parents:
diff changeset
245 reportError("expected newline");
e78566595089 initial import
mandel
parents:
diff changeset
246 }
e78566595089 initial import
mandel
parents:
diff changeset
247
e78566595089 initial import
mandel
parents:
diff changeset
248 void Lexer::scan_char_constant()
e78566595089 initial import
mandel
parents:
diff changeset
249 {
e78566595089 initial import
mandel
parents:
diff changeset
250 const unsigned char *begin = cursor;
e78566595089 initial import
mandel
parents:
diff changeset
251
e78566595089 initial import
mandel
parents:
diff changeset
252 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
253 while (*cursor && *cursor != '\'')
e78566595089 initial import
mandel
parents:
diff changeset
254 {
e78566595089 initial import
mandel
parents:
diff changeset
255 if (*cursor == '\n')
e78566595089 initial import
mandel
parents:
diff changeset
256 reportError("did not expect newline");
e78566595089 initial import
mandel
parents:
diff changeset
257
e78566595089 initial import
mandel
parents:
diff changeset
258 if (*cursor == '\\')
e78566595089 initial import
mandel
parents:
diff changeset
259 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
260 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
261 }
e78566595089 initial import
mandel
parents:
diff changeset
262
e78566595089 initial import
mandel
parents:
diff changeset
263 if (*cursor != '\'')
e78566595089 initial import
mandel
parents:
diff changeset
264 reportError("expected \'");
e78566595089 initial import
mandel
parents:
diff changeset
265
e78566595089 initial import
mandel
parents:
diff changeset
266 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
267
e78566595089 initial import
mandel
parents:
diff changeset
268 token_stream[(int) index].extra.symbol =
e78566595089 initial import
mandel
parents:
diff changeset
269 control->findOrInsertName((const char*) begin, cursor - begin);
e78566595089 initial import
mandel
parents:
diff changeset
270
e78566595089 initial import
mandel
parents:
diff changeset
271 token_stream[(int) index++].kind = Token_char_literal;
e78566595089 initial import
mandel
parents:
diff changeset
272 }
e78566595089 initial import
mandel
parents:
diff changeset
273
e78566595089 initial import
mandel
parents:
diff changeset
274 void Lexer::scan_string_constant()
e78566595089 initial import
mandel
parents:
diff changeset
275 {
e78566595089 initial import
mandel
parents:
diff changeset
276 const unsigned char *begin = cursor;
e78566595089 initial import
mandel
parents:
diff changeset
277
e78566595089 initial import
mandel
parents:
diff changeset
278 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
279 while (*cursor && *cursor != '"')
e78566595089 initial import
mandel
parents:
diff changeset
280 {
e78566595089 initial import
mandel
parents:
diff changeset
281 if (*cursor == '\n')
e78566595089 initial import
mandel
parents:
diff changeset
282 reportError("did not expect newline");
e78566595089 initial import
mandel
parents:
diff changeset
283
e78566595089 initial import
mandel
parents:
diff changeset
284 if (*cursor == '\\')
e78566595089 initial import
mandel
parents:
diff changeset
285 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
286 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
287 }
e78566595089 initial import
mandel
parents:
diff changeset
288
e78566595089 initial import
mandel
parents:
diff changeset
289 if (*cursor != '"')
e78566595089 initial import
mandel
parents:
diff changeset
290 reportError("expected \"");
e78566595089 initial import
mandel
parents:
diff changeset
291
e78566595089 initial import
mandel
parents:
diff changeset
292 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
293
e78566595089 initial import
mandel
parents:
diff changeset
294 token_stream[(int) index].extra.symbol =
e78566595089 initial import
mandel
parents:
diff changeset
295 control->findOrInsertName((const char*) begin, cursor - begin);
e78566595089 initial import
mandel
parents:
diff changeset
296
e78566595089 initial import
mandel
parents:
diff changeset
297 token_stream[(int) index++].kind = Token_string_literal;
e78566595089 initial import
mandel
parents:
diff changeset
298 }
e78566595089 initial import
mandel
parents:
diff changeset
299
e78566595089 initial import
mandel
parents:
diff changeset
300 void Lexer::scan_newline()
e78566595089 initial import
mandel
parents:
diff changeset
301 {
e78566595089 initial import
mandel
parents:
diff changeset
302 if (location_table.current_line == location_table.size())
e78566595089 initial import
mandel
parents:
diff changeset
303 location_table.resize(location_table.current_line * 2);
e78566595089 initial import
mandel
parents:
diff changeset
304
e78566595089 initial import
mandel
parents:
diff changeset
305 location_table[(int) location_table.current_line++] = (cursor - begin_buffer);
e78566595089 initial import
mandel
parents:
diff changeset
306 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
307 }
e78566595089 initial import
mandel
parents:
diff changeset
308
e78566595089 initial import
mandel
parents:
diff changeset
309 void Lexer::scan_white_spaces()
e78566595089 initial import
mandel
parents:
diff changeset
310 {
e78566595089 initial import
mandel
parents:
diff changeset
311 while (isspace(*cursor))
e78566595089 initial import
mandel
parents:
diff changeset
312 {
e78566595089 initial import
mandel
parents:
diff changeset
313 if (*cursor == '\n')
e78566595089 initial import
mandel
parents:
diff changeset
314 scan_newline();
e78566595089 initial import
mandel
parents:
diff changeset
315 else
e78566595089 initial import
mandel
parents:
diff changeset
316 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
317 }
e78566595089 initial import
mandel
parents:
diff changeset
318 }
e78566595089 initial import
mandel
parents:
diff changeset
319
e78566595089 initial import
mandel
parents:
diff changeset
320 void Lexer::scan_identifier_or_literal()
e78566595089 initial import
mandel
parents:
diff changeset
321 {
e78566595089 initial import
mandel
parents:
diff changeset
322 switch (*(cursor + 1))
e78566595089 initial import
mandel
parents:
diff changeset
323 {
e78566595089 initial import
mandel
parents:
diff changeset
324 case '\'':
e78566595089 initial import
mandel
parents:
diff changeset
325 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
326 scan_char_constant();
e78566595089 initial import
mandel
parents:
diff changeset
327 break;
e78566595089 initial import
mandel
parents:
diff changeset
328
e78566595089 initial import
mandel
parents:
diff changeset
329 case '\"':
e78566595089 initial import
mandel
parents:
diff changeset
330 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
331 scan_string_constant();
e78566595089 initial import
mandel
parents:
diff changeset
332 break;
e78566595089 initial import
mandel
parents:
diff changeset
333
e78566595089 initial import
mandel
parents:
diff changeset
334 default:
e78566595089 initial import
mandel
parents:
diff changeset
335 scan_identifier_or_keyword();
e78566595089 initial import
mandel
parents:
diff changeset
336 break;
e78566595089 initial import
mandel
parents:
diff changeset
337 }
e78566595089 initial import
mandel
parents:
diff changeset
338 }
e78566595089 initial import
mandel
parents:
diff changeset
339
e78566595089 initial import
mandel
parents:
diff changeset
340 void Lexer::scan_identifier_or_keyword()
e78566595089 initial import
mandel
parents:
diff changeset
341 {
e78566595089 initial import
mandel
parents:
diff changeset
342 const unsigned char *skip = cursor;
e78566595089 initial import
mandel
parents:
diff changeset
343 while (isalnum(*skip) || *skip== '_')
e78566595089 initial import
mandel
parents:
diff changeset
344 ++skip;
e78566595089 initial import
mandel
parents:
diff changeset
345
e78566595089 initial import
mandel
parents:
diff changeset
346 int n = skip - cursor;
e78566595089 initial import
mandel
parents:
diff changeset
347 Token *current_token = &token_stream[(int) index];
e78566595089 initial import
mandel
parents:
diff changeset
348 (this->*s_scan_keyword_table[n < 17 ? n : 0])();
e78566595089 initial import
mandel
parents:
diff changeset
349
e78566595089 initial import
mandel
parents:
diff changeset
350 if (current_token->kind == Token_identifier)
e78566595089 initial import
mandel
parents:
diff changeset
351 {
e78566595089 initial import
mandel
parents:
diff changeset
352 current_token->extra.symbol =
e78566595089 initial import
mandel
parents:
diff changeset
353 control->findOrInsertName((const char*) cursor, n);
e78566595089 initial import
mandel
parents:
diff changeset
354 }
e78566595089 initial import
mandel
parents:
diff changeset
355
e78566595089 initial import
mandel
parents:
diff changeset
356 cursor = skip;
e78566595089 initial import
mandel
parents:
diff changeset
357 }
e78566595089 initial import
mandel
parents:
diff changeset
358
e78566595089 initial import
mandel
parents:
diff changeset
359 void Lexer::scan_int_constant()
e78566595089 initial import
mandel
parents:
diff changeset
360 {
e78566595089 initial import
mandel
parents:
diff changeset
361 if (*cursor == '.' && !std::isdigit(*(cursor + 1)))
e78566595089 initial import
mandel
parents:
diff changeset
362 {
e78566595089 initial import
mandel
parents:
diff changeset
363 scan_dot();
e78566595089 initial import
mandel
parents:
diff changeset
364 return;
e78566595089 initial import
mandel
parents:
diff changeset
365 }
e78566595089 initial import
mandel
parents:
diff changeset
366
e78566595089 initial import
mandel
parents:
diff changeset
367 const unsigned char *begin = cursor;
e78566595089 initial import
mandel
parents:
diff changeset
368
e78566595089 initial import
mandel
parents:
diff changeset
369 while (isalnum(*cursor) || *cursor == '.')
e78566595089 initial import
mandel
parents:
diff changeset
370 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
371
e78566595089 initial import
mandel
parents:
diff changeset
372 token_stream[(int) index].extra.symbol =
e78566595089 initial import
mandel
parents:
diff changeset
373 control->findOrInsertName((const char*) begin, cursor - begin);
e78566595089 initial import
mandel
parents:
diff changeset
374
e78566595089 initial import
mandel
parents:
diff changeset
375 token_stream[(int) index++].kind = Token_number_literal;
e78566595089 initial import
mandel
parents:
diff changeset
376 }
e78566595089 initial import
mandel
parents:
diff changeset
377
e78566595089 initial import
mandel
parents:
diff changeset
378 void Lexer::scan_not()
e78566595089 initial import
mandel
parents:
diff changeset
379 {
e78566595089 initial import
mandel
parents:
diff changeset
380 /*
e78566595089 initial import
mandel
parents:
diff changeset
381 '!' ::= not
e78566595089 initial import
mandel
parents:
diff changeset
382 '!=' ::= not_equal
e78566595089 initial import
mandel
parents:
diff changeset
383 */
e78566595089 initial import
mandel
parents:
diff changeset
384
e78566595089 initial import
mandel
parents:
diff changeset
385 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
386
e78566595089 initial import
mandel
parents:
diff changeset
387 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
388 {
e78566595089 initial import
mandel
parents:
diff changeset
389 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
390 token_stream[(int) index++].kind = Token_not_eq;
e78566595089 initial import
mandel
parents:
diff changeset
391 }
e78566595089 initial import
mandel
parents:
diff changeset
392 else
e78566595089 initial import
mandel
parents:
diff changeset
393 {
e78566595089 initial import
mandel
parents:
diff changeset
394 token_stream[(int) index++].kind = '!';
e78566595089 initial import
mandel
parents:
diff changeset
395 }
e78566595089 initial import
mandel
parents:
diff changeset
396 }
e78566595089 initial import
mandel
parents:
diff changeset
397
e78566595089 initial import
mandel
parents:
diff changeset
398 void Lexer::scan_remainder()
e78566595089 initial import
mandel
parents:
diff changeset
399 {
e78566595089 initial import
mandel
parents:
diff changeset
400 /*
e78566595089 initial import
mandel
parents:
diff changeset
401 '%' ::= remainder
e78566595089 initial import
mandel
parents:
diff changeset
402 '%=' ::= remainder_equal
e78566595089 initial import
mandel
parents:
diff changeset
403 */
e78566595089 initial import
mandel
parents:
diff changeset
404
e78566595089 initial import
mandel
parents:
diff changeset
405 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
406
e78566595089 initial import
mandel
parents:
diff changeset
407 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
408 {
e78566595089 initial import
mandel
parents:
diff changeset
409 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
410 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
411 }
e78566595089 initial import
mandel
parents:
diff changeset
412 else
e78566595089 initial import
mandel
parents:
diff changeset
413 {
e78566595089 initial import
mandel
parents:
diff changeset
414 token_stream[(int) index++].kind = '%';
e78566595089 initial import
mandel
parents:
diff changeset
415 }
e78566595089 initial import
mandel
parents:
diff changeset
416 }
e78566595089 initial import
mandel
parents:
diff changeset
417
e78566595089 initial import
mandel
parents:
diff changeset
418 void Lexer::scan_and()
e78566595089 initial import
mandel
parents:
diff changeset
419 {
e78566595089 initial import
mandel
parents:
diff changeset
420 /*
e78566595089 initial import
mandel
parents:
diff changeset
421 '&&' ::= and_and
e78566595089 initial import
mandel
parents:
diff changeset
422 '&' ::= and
e78566595089 initial import
mandel
parents:
diff changeset
423 '&=' ::= and_equal
e78566595089 initial import
mandel
parents:
diff changeset
424 */
e78566595089 initial import
mandel
parents:
diff changeset
425
e78566595089 initial import
mandel
parents:
diff changeset
426 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
427 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
428 {
e78566595089 initial import
mandel
parents:
diff changeset
429 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
430 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
431 }
e78566595089 initial import
mandel
parents:
diff changeset
432 else if (*cursor == '&')
e78566595089 initial import
mandel
parents:
diff changeset
433 {
e78566595089 initial import
mandel
parents:
diff changeset
434 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
435 token_stream[(int) index++].kind = Token_and;
e78566595089 initial import
mandel
parents:
diff changeset
436 }
e78566595089 initial import
mandel
parents:
diff changeset
437 else
e78566595089 initial import
mandel
parents:
diff changeset
438 {
e78566595089 initial import
mandel
parents:
diff changeset
439 token_stream[(int) index++].kind = '&';
e78566595089 initial import
mandel
parents:
diff changeset
440 }
e78566595089 initial import
mandel
parents:
diff changeset
441 }
e78566595089 initial import
mandel
parents:
diff changeset
442
e78566595089 initial import
mandel
parents:
diff changeset
443 void Lexer::scan_left_paren()
e78566595089 initial import
mandel
parents:
diff changeset
444 {
e78566595089 initial import
mandel
parents:
diff changeset
445 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
446 token_stream[(int) index++].kind = '(';
e78566595089 initial import
mandel
parents:
diff changeset
447 }
e78566595089 initial import
mandel
parents:
diff changeset
448
e78566595089 initial import
mandel
parents:
diff changeset
449 void Lexer::scan_right_paren()
e78566595089 initial import
mandel
parents:
diff changeset
450 {
e78566595089 initial import
mandel
parents:
diff changeset
451 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
452 token_stream[(int) index++].kind = ')';
e78566595089 initial import
mandel
parents:
diff changeset
453 }
e78566595089 initial import
mandel
parents:
diff changeset
454
e78566595089 initial import
mandel
parents:
diff changeset
455 void Lexer::scan_star()
e78566595089 initial import
mandel
parents:
diff changeset
456 {
e78566595089 initial import
mandel
parents:
diff changeset
457 /*
e78566595089 initial import
mandel
parents:
diff changeset
458 '*' ::= star
e78566595089 initial import
mandel
parents:
diff changeset
459 '*=' ::= star_equal
e78566595089 initial import
mandel
parents:
diff changeset
460 */
e78566595089 initial import
mandel
parents:
diff changeset
461
e78566595089 initial import
mandel
parents:
diff changeset
462 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
463
e78566595089 initial import
mandel
parents:
diff changeset
464 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
465 {
e78566595089 initial import
mandel
parents:
diff changeset
466 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
467 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
468 }
e78566595089 initial import
mandel
parents:
diff changeset
469 else
e78566595089 initial import
mandel
parents:
diff changeset
470 {
e78566595089 initial import
mandel
parents:
diff changeset
471 token_stream[(int) index++].kind = '*';
e78566595089 initial import
mandel
parents:
diff changeset
472 }
e78566595089 initial import
mandel
parents:
diff changeset
473 }
e78566595089 initial import
mandel
parents:
diff changeset
474
e78566595089 initial import
mandel
parents:
diff changeset
475 void Lexer::scan_plus()
e78566595089 initial import
mandel
parents:
diff changeset
476 {
e78566595089 initial import
mandel
parents:
diff changeset
477 /*
e78566595089 initial import
mandel
parents:
diff changeset
478 '+' ::= plus
e78566595089 initial import
mandel
parents:
diff changeset
479 '++' ::= incr
e78566595089 initial import
mandel
parents:
diff changeset
480 '+=' ::= plus_equal
e78566595089 initial import
mandel
parents:
diff changeset
481 */
e78566595089 initial import
mandel
parents:
diff changeset
482
e78566595089 initial import
mandel
parents:
diff changeset
483 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
484 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
485 {
e78566595089 initial import
mandel
parents:
diff changeset
486 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
487 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
488 }
e78566595089 initial import
mandel
parents:
diff changeset
489 else if (*cursor == '+')
e78566595089 initial import
mandel
parents:
diff changeset
490 {
e78566595089 initial import
mandel
parents:
diff changeset
491 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
492 token_stream[(int) index++].kind = Token_incr;
e78566595089 initial import
mandel
parents:
diff changeset
493 }
e78566595089 initial import
mandel
parents:
diff changeset
494 else
e78566595089 initial import
mandel
parents:
diff changeset
495 {
e78566595089 initial import
mandel
parents:
diff changeset
496 token_stream[(int) index++].kind = '+';
e78566595089 initial import
mandel
parents:
diff changeset
497 }
e78566595089 initial import
mandel
parents:
diff changeset
498 }
e78566595089 initial import
mandel
parents:
diff changeset
499
e78566595089 initial import
mandel
parents:
diff changeset
500 void Lexer::scan_comma()
e78566595089 initial import
mandel
parents:
diff changeset
501 {
e78566595089 initial import
mandel
parents:
diff changeset
502 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
503 token_stream[(int) index++].kind = ',';
e78566595089 initial import
mandel
parents:
diff changeset
504 }
e78566595089 initial import
mandel
parents:
diff changeset
505
e78566595089 initial import
mandel
parents:
diff changeset
506 void Lexer::scan_minus()
e78566595089 initial import
mandel
parents:
diff changeset
507 {
e78566595089 initial import
mandel
parents:
diff changeset
508 /*
e78566595089 initial import
mandel
parents:
diff changeset
509 '-' ::= minus
e78566595089 initial import
mandel
parents:
diff changeset
510 '--' ::= decr
e78566595089 initial import
mandel
parents:
diff changeset
511 '-=' ::= minus_equal
e78566595089 initial import
mandel
parents:
diff changeset
512 '->' ::= left_arrow
e78566595089 initial import
mandel
parents:
diff changeset
513 */
e78566595089 initial import
mandel
parents:
diff changeset
514
e78566595089 initial import
mandel
parents:
diff changeset
515 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
516 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
517 {
e78566595089 initial import
mandel
parents:
diff changeset
518 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
519 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
520 }
e78566595089 initial import
mandel
parents:
diff changeset
521 else if (*cursor == '-')
e78566595089 initial import
mandel
parents:
diff changeset
522 {
e78566595089 initial import
mandel
parents:
diff changeset
523 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
524 token_stream[(int) index++].kind = Token_decr;
e78566595089 initial import
mandel
parents:
diff changeset
525 }
e78566595089 initial import
mandel
parents:
diff changeset
526 else if (*cursor == '>')
e78566595089 initial import
mandel
parents:
diff changeset
527 {
e78566595089 initial import
mandel
parents:
diff changeset
528 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
529 token_stream[(int) index++].kind = Token_arrow;
e78566595089 initial import
mandel
parents:
diff changeset
530 if (*cursor == '*')
e78566595089 initial import
mandel
parents:
diff changeset
531 {
e78566595089 initial import
mandel
parents:
diff changeset
532 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
533 token_stream[(int) index++].kind = Token_ptrmem;
e78566595089 initial import
mandel
parents:
diff changeset
534 }
e78566595089 initial import
mandel
parents:
diff changeset
535 }
e78566595089 initial import
mandel
parents:
diff changeset
536 else
e78566595089 initial import
mandel
parents:
diff changeset
537 {
e78566595089 initial import
mandel
parents:
diff changeset
538 token_stream[(int) index++].kind = '-';
e78566595089 initial import
mandel
parents:
diff changeset
539 }
e78566595089 initial import
mandel
parents:
diff changeset
540 }
e78566595089 initial import
mandel
parents:
diff changeset
541
e78566595089 initial import
mandel
parents:
diff changeset
542 void Lexer::scan_dot()
e78566595089 initial import
mandel
parents:
diff changeset
543 {
e78566595089 initial import
mandel
parents:
diff changeset
544 /*
e78566595089 initial import
mandel
parents:
diff changeset
545 '.' ::= dot
e78566595089 initial import
mandel
parents:
diff changeset
546 '...' ::= ellipsis
e78566595089 initial import
mandel
parents:
diff changeset
547 */
e78566595089 initial import
mandel
parents:
diff changeset
548
e78566595089 initial import
mandel
parents:
diff changeset
549 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
550 if (*cursor == '.' && *(cursor + 1) == '.')
e78566595089 initial import
mandel
parents:
diff changeset
551 {
e78566595089 initial import
mandel
parents:
diff changeset
552 cursor += 2;
e78566595089 initial import
mandel
parents:
diff changeset
553 token_stream[(int) index++].kind = Token_ellipsis;
e78566595089 initial import
mandel
parents:
diff changeset
554 }
e78566595089 initial import
mandel
parents:
diff changeset
555 else if (*cursor == '.' && *(cursor + 1) == '*')
e78566595089 initial import
mandel
parents:
diff changeset
556 {
e78566595089 initial import
mandel
parents:
diff changeset
557 cursor += 2;
e78566595089 initial import
mandel
parents:
diff changeset
558 token_stream[(int) index++].kind = Token_ptrmem;
e78566595089 initial import
mandel
parents:
diff changeset
559 }
e78566595089 initial import
mandel
parents:
diff changeset
560 else
e78566595089 initial import
mandel
parents:
diff changeset
561 token_stream[(int) index++].kind = '.';
e78566595089 initial import
mandel
parents:
diff changeset
562 }
e78566595089 initial import
mandel
parents:
diff changeset
563
e78566595089 initial import
mandel
parents:
diff changeset
564 void Lexer::scan_divide()
e78566595089 initial import
mandel
parents:
diff changeset
565 {
e78566595089 initial import
mandel
parents:
diff changeset
566 /*
e78566595089 initial import
mandel
parents:
diff changeset
567 '/' ::= divide
e78566595089 initial import
mandel
parents:
diff changeset
568 '/=' ::= divide_equal
e78566595089 initial import
mandel
parents:
diff changeset
569 */
e78566595089 initial import
mandel
parents:
diff changeset
570
e78566595089 initial import
mandel
parents:
diff changeset
571 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
572
e78566595089 initial import
mandel
parents:
diff changeset
573 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
574 {
e78566595089 initial import
mandel
parents:
diff changeset
575 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
576 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
577 }
e78566595089 initial import
mandel
parents:
diff changeset
578 else
e78566595089 initial import
mandel
parents:
diff changeset
579 {
e78566595089 initial import
mandel
parents:
diff changeset
580 token_stream[(int) index++].kind = '/';
e78566595089 initial import
mandel
parents:
diff changeset
581 }
e78566595089 initial import
mandel
parents:
diff changeset
582 }
e78566595089 initial import
mandel
parents:
diff changeset
583
e78566595089 initial import
mandel
parents:
diff changeset
584 void Lexer::scan_colon()
e78566595089 initial import
mandel
parents:
diff changeset
585 {
e78566595089 initial import
mandel
parents:
diff changeset
586 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
587 if (*cursor == ':')
e78566595089 initial import
mandel
parents:
diff changeset
588 {
e78566595089 initial import
mandel
parents:
diff changeset
589 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
590 token_stream[(int) index++].kind = Token_scope;
e78566595089 initial import
mandel
parents:
diff changeset
591 }
e78566595089 initial import
mandel
parents:
diff changeset
592 else
e78566595089 initial import
mandel
parents:
diff changeset
593 {
e78566595089 initial import
mandel
parents:
diff changeset
594 token_stream[(int) index++].kind = ':';
e78566595089 initial import
mandel
parents:
diff changeset
595 }
e78566595089 initial import
mandel
parents:
diff changeset
596 }
e78566595089 initial import
mandel
parents:
diff changeset
597
e78566595089 initial import
mandel
parents:
diff changeset
598 void Lexer::scan_semicolon()
e78566595089 initial import
mandel
parents:
diff changeset
599 {
e78566595089 initial import
mandel
parents:
diff changeset
600 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
601 token_stream[(int) index++].kind = ';';
e78566595089 initial import
mandel
parents:
diff changeset
602 }
e78566595089 initial import
mandel
parents:
diff changeset
603
e78566595089 initial import
mandel
parents:
diff changeset
604 void Lexer::scan_less()
e78566595089 initial import
mandel
parents:
diff changeset
605 {
e78566595089 initial import
mandel
parents:
diff changeset
606 /*
e78566595089 initial import
mandel
parents:
diff changeset
607 '<' ::= less
e78566595089 initial import
mandel
parents:
diff changeset
608 '<<' ::= left_shift
e78566595089 initial import
mandel
parents:
diff changeset
609 '<<=' ::= left_shift_equal
e78566595089 initial import
mandel
parents:
diff changeset
610 '<=' ::= less_equal
e78566595089 initial import
mandel
parents:
diff changeset
611 */
e78566595089 initial import
mandel
parents:
diff changeset
612
e78566595089 initial import
mandel
parents:
diff changeset
613 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
614 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
615 {
e78566595089 initial import
mandel
parents:
diff changeset
616 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
617 token_stream[(int) index++].kind = Token_leq;
e78566595089 initial import
mandel
parents:
diff changeset
618 }
e78566595089 initial import
mandel
parents:
diff changeset
619 else if (*cursor == '<')
e78566595089 initial import
mandel
parents:
diff changeset
620 {
e78566595089 initial import
mandel
parents:
diff changeset
621 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
622 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
623 {
e78566595089 initial import
mandel
parents:
diff changeset
624 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
625 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
626 }
e78566595089 initial import
mandel
parents:
diff changeset
627 else
e78566595089 initial import
mandel
parents:
diff changeset
628 {
e78566595089 initial import
mandel
parents:
diff changeset
629 token_stream[(int) index++].kind = Token_shift;
e78566595089 initial import
mandel
parents:
diff changeset
630 }
e78566595089 initial import
mandel
parents:
diff changeset
631 }
e78566595089 initial import
mandel
parents:
diff changeset
632 else
e78566595089 initial import
mandel
parents:
diff changeset
633 {
e78566595089 initial import
mandel
parents:
diff changeset
634 token_stream[(int) index++].kind = '<';
e78566595089 initial import
mandel
parents:
diff changeset
635 }
e78566595089 initial import
mandel
parents:
diff changeset
636 }
e78566595089 initial import
mandel
parents:
diff changeset
637
e78566595089 initial import
mandel
parents:
diff changeset
638 void Lexer::scan_equal()
e78566595089 initial import
mandel
parents:
diff changeset
639 {
e78566595089 initial import
mandel
parents:
diff changeset
640 /*
e78566595089 initial import
mandel
parents:
diff changeset
641 '=' ::= equal
e78566595089 initial import
mandel
parents:
diff changeset
642 '==' ::= equal_equal
e78566595089 initial import
mandel
parents:
diff changeset
643 */
e78566595089 initial import
mandel
parents:
diff changeset
644 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
645
e78566595089 initial import
mandel
parents:
diff changeset
646 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
647 {
e78566595089 initial import
mandel
parents:
diff changeset
648 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
649 token_stream[(int) index++].kind = Token_eq;
e78566595089 initial import
mandel
parents:
diff changeset
650 }
e78566595089 initial import
mandel
parents:
diff changeset
651 else
e78566595089 initial import
mandel
parents:
diff changeset
652 {
e78566595089 initial import
mandel
parents:
diff changeset
653 token_stream[(int) index++].kind = '=';
e78566595089 initial import
mandel
parents:
diff changeset
654 }
e78566595089 initial import
mandel
parents:
diff changeset
655 }
e78566595089 initial import
mandel
parents:
diff changeset
656
e78566595089 initial import
mandel
parents:
diff changeset
657 void Lexer::scan_greater()
e78566595089 initial import
mandel
parents:
diff changeset
658 {
e78566595089 initial import
mandel
parents:
diff changeset
659 /*
e78566595089 initial import
mandel
parents:
diff changeset
660 '>' ::= greater
e78566595089 initial import
mandel
parents:
diff changeset
661 '>=' ::= greater_equal
e78566595089 initial import
mandel
parents:
diff changeset
662 '>>' ::= right_shift
e78566595089 initial import
mandel
parents:
diff changeset
663 '>>=' ::= right_shift_equal
e78566595089 initial import
mandel
parents:
diff changeset
664 */
e78566595089 initial import
mandel
parents:
diff changeset
665
e78566595089 initial import
mandel
parents:
diff changeset
666 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
667 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
668 {
e78566595089 initial import
mandel
parents:
diff changeset
669 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
670 token_stream[(int) index++].kind = Token_geq;
e78566595089 initial import
mandel
parents:
diff changeset
671 }
e78566595089 initial import
mandel
parents:
diff changeset
672 else if (*cursor == '>')
e78566595089 initial import
mandel
parents:
diff changeset
673 {
e78566595089 initial import
mandel
parents:
diff changeset
674 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
675 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
676 {
e78566595089 initial import
mandel
parents:
diff changeset
677 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
678 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
679 }
e78566595089 initial import
mandel
parents:
diff changeset
680 else
e78566595089 initial import
mandel
parents:
diff changeset
681 {
e78566595089 initial import
mandel
parents:
diff changeset
682 token_stream[(int) index++].kind = Token_shift;
e78566595089 initial import
mandel
parents:
diff changeset
683 }
e78566595089 initial import
mandel
parents:
diff changeset
684 }
e78566595089 initial import
mandel
parents:
diff changeset
685 else
e78566595089 initial import
mandel
parents:
diff changeset
686 {
e78566595089 initial import
mandel
parents:
diff changeset
687 token_stream[(int) index++].kind = '>';
e78566595089 initial import
mandel
parents:
diff changeset
688 }
e78566595089 initial import
mandel
parents:
diff changeset
689 }
e78566595089 initial import
mandel
parents:
diff changeset
690
e78566595089 initial import
mandel
parents:
diff changeset
691 void Lexer::scan_question()
e78566595089 initial import
mandel
parents:
diff changeset
692 {
e78566595089 initial import
mandel
parents:
diff changeset
693 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
694 token_stream[(int) index++].kind = '?';
e78566595089 initial import
mandel
parents:
diff changeset
695 }
e78566595089 initial import
mandel
parents:
diff changeset
696
e78566595089 initial import
mandel
parents:
diff changeset
697 void Lexer::scan_left_bracket()
e78566595089 initial import
mandel
parents:
diff changeset
698 {
e78566595089 initial import
mandel
parents:
diff changeset
699 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
700 token_stream[(int) index++].kind = '[';
e78566595089 initial import
mandel
parents:
diff changeset
701 }
e78566595089 initial import
mandel
parents:
diff changeset
702
e78566595089 initial import
mandel
parents:
diff changeset
703 void Lexer::scan_right_bracket()
e78566595089 initial import
mandel
parents:
diff changeset
704 {
e78566595089 initial import
mandel
parents:
diff changeset
705 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
706 token_stream[(int) index++].kind = ']';
e78566595089 initial import
mandel
parents:
diff changeset
707 }
e78566595089 initial import
mandel
parents:
diff changeset
708
e78566595089 initial import
mandel
parents:
diff changeset
709 void Lexer::scan_xor()
e78566595089 initial import
mandel
parents:
diff changeset
710 {
e78566595089 initial import
mandel
parents:
diff changeset
711 /*
e78566595089 initial import
mandel
parents:
diff changeset
712 '^' ::= xor
e78566595089 initial import
mandel
parents:
diff changeset
713 '^=' ::= xor_equal
e78566595089 initial import
mandel
parents:
diff changeset
714 */
e78566595089 initial import
mandel
parents:
diff changeset
715 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
716
e78566595089 initial import
mandel
parents:
diff changeset
717 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
718 {
e78566595089 initial import
mandel
parents:
diff changeset
719 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
720 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
721 }
e78566595089 initial import
mandel
parents:
diff changeset
722 else
e78566595089 initial import
mandel
parents:
diff changeset
723 {
e78566595089 initial import
mandel
parents:
diff changeset
724 token_stream[(int) index++].kind = '^';
e78566595089 initial import
mandel
parents:
diff changeset
725 }
e78566595089 initial import
mandel
parents:
diff changeset
726 }
e78566595089 initial import
mandel
parents:
diff changeset
727
e78566595089 initial import
mandel
parents:
diff changeset
728 void Lexer::scan_left_brace()
e78566595089 initial import
mandel
parents:
diff changeset
729 {
e78566595089 initial import
mandel
parents:
diff changeset
730 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
731 token_stream[(int) index++].kind = '{';
e78566595089 initial import
mandel
parents:
diff changeset
732 }
e78566595089 initial import
mandel
parents:
diff changeset
733
e78566595089 initial import
mandel
parents:
diff changeset
734 void Lexer::scan_or()
e78566595089 initial import
mandel
parents:
diff changeset
735 {
e78566595089 initial import
mandel
parents:
diff changeset
736 /*
e78566595089 initial import
mandel
parents:
diff changeset
737 '|' ::= or
e78566595089 initial import
mandel
parents:
diff changeset
738 '|=' ::= or_equal
e78566595089 initial import
mandel
parents:
diff changeset
739 '||' ::= or_or
e78566595089 initial import
mandel
parents:
diff changeset
740 */
e78566595089 initial import
mandel
parents:
diff changeset
741 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
742 if (*cursor == '=')
e78566595089 initial import
mandel
parents:
diff changeset
743 {
e78566595089 initial import
mandel
parents:
diff changeset
744 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
745 token_stream[(int) index++].kind = Token_assign;
e78566595089 initial import
mandel
parents:
diff changeset
746 }
e78566595089 initial import
mandel
parents:
diff changeset
747 else if (*cursor == '|')
e78566595089 initial import
mandel
parents:
diff changeset
748 {
e78566595089 initial import
mandel
parents:
diff changeset
749 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
750 token_stream[(int) index++].kind = Token_or;
e78566595089 initial import
mandel
parents:
diff changeset
751 }
e78566595089 initial import
mandel
parents:
diff changeset
752 else
e78566595089 initial import
mandel
parents:
diff changeset
753 {
e78566595089 initial import
mandel
parents:
diff changeset
754 token_stream[(int) index++].kind = '|';
e78566595089 initial import
mandel
parents:
diff changeset
755 }
e78566595089 initial import
mandel
parents:
diff changeset
756 }
e78566595089 initial import
mandel
parents:
diff changeset
757
e78566595089 initial import
mandel
parents:
diff changeset
758 void Lexer::scan_right_brace()
e78566595089 initial import
mandel
parents:
diff changeset
759 {
e78566595089 initial import
mandel
parents:
diff changeset
760 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
761 token_stream[(int) index++].kind = '}';
e78566595089 initial import
mandel
parents:
diff changeset
762 }
e78566595089 initial import
mandel
parents:
diff changeset
763
e78566595089 initial import
mandel
parents:
diff changeset
764 void Lexer::scan_tilde()
e78566595089 initial import
mandel
parents:
diff changeset
765 {
e78566595089 initial import
mandel
parents:
diff changeset
766 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
767 token_stream[(int) index++].kind = '~';
e78566595089 initial import
mandel
parents:
diff changeset
768 }
e78566595089 initial import
mandel
parents:
diff changeset
769
e78566595089 initial import
mandel
parents:
diff changeset
770 void Lexer::scan_EOF()
e78566595089 initial import
mandel
parents:
diff changeset
771 {
e78566595089 initial import
mandel
parents:
diff changeset
772 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
773 token_stream[(int) index++].kind = Token_EOF;
e78566595089 initial import
mandel
parents:
diff changeset
774 }
e78566595089 initial import
mandel
parents:
diff changeset
775
e78566595089 initial import
mandel
parents:
diff changeset
776 void Lexer::scan_invalid_input()
e78566595089 initial import
mandel
parents:
diff changeset
777 {
e78566595089 initial import
mandel
parents:
diff changeset
778 QString errmsg("invalid input: %1");
e78566595089 initial import
mandel
parents:
diff changeset
779 errmsg.arg(int(*cursor));
e78566595089 initial import
mandel
parents:
diff changeset
780 reportError(errmsg);
e78566595089 initial import
mandel
parents:
diff changeset
781 ++cursor;
e78566595089 initial import
mandel
parents:
diff changeset
782 }
e78566595089 initial import
mandel
parents:
diff changeset
783
e78566595089 initial import
mandel
parents:
diff changeset
784 void LocationTable::positionAt(std::size_t offset, int max_line,
e78566595089 initial import
mandel
parents:
diff changeset
785 int *line, int *column) const
e78566595089 initial import
mandel
parents:
diff changeset
786 {
e78566595089 initial import
mandel
parents:
diff changeset
787 if (!(line && column && max_line != 0))
e78566595089 initial import
mandel
parents:
diff changeset
788 return;
e78566595089 initial import
mandel
parents:
diff changeset
789
e78566595089 initial import
mandel
parents:
diff changeset
790 int first = 0;
e78566595089 initial import
mandel
parents:
diff changeset
791 int len = max_line;
e78566595089 initial import
mandel
parents:
diff changeset
792 int half;
e78566595089 initial import
mandel
parents:
diff changeset
793 int middle;
e78566595089 initial import
mandel
parents:
diff changeset
794
e78566595089 initial import
mandel
parents:
diff changeset
795 while (len > 0)
e78566595089 initial import
mandel
parents:
diff changeset
796 {
e78566595089 initial import
mandel
parents:
diff changeset
797 half = len >> 1;
e78566595089 initial import
mandel
parents:
diff changeset
798 middle = first;
e78566595089 initial import
mandel
parents:
diff changeset
799
e78566595089 initial import
mandel
parents:
diff changeset
800 middle += half;
e78566595089 initial import
mandel
parents:
diff changeset
801
e78566595089 initial import
mandel
parents:
diff changeset
802 if (lines[middle] < offset)
e78566595089 initial import
mandel
parents:
diff changeset
803 {
e78566595089 initial import
mandel
parents:
diff changeset
804 first = middle;
e78566595089 initial import
mandel
parents:
diff changeset
805 ++first;
e78566595089 initial import
mandel
parents:
diff changeset
806 len = len - half - 1;
e78566595089 initial import
mandel
parents:
diff changeset
807 }
e78566595089 initial import
mandel
parents:
diff changeset
808 else
e78566595089 initial import
mandel
parents:
diff changeset
809 len = half;
e78566595089 initial import
mandel
parents:
diff changeset
810 }
e78566595089 initial import
mandel
parents:
diff changeset
811
e78566595089 initial import
mandel
parents:
diff changeset
812 *line = std::max(first, 1);
e78566595089 initial import
mandel
parents:
diff changeset
813 *column = (int) (offset - lines[*line - 1] - 1);
e78566595089 initial import
mandel
parents:
diff changeset
814
e78566595089 initial import
mandel
parents:
diff changeset
815 if (*column < 0)
e78566595089 initial import
mandel
parents:
diff changeset
816 {
e78566595089 initial import
mandel
parents:
diff changeset
817 *column = 0;
e78566595089 initial import
mandel
parents:
diff changeset
818 }
e78566595089 initial import
mandel
parents:
diff changeset
819 }
e78566595089 initial import
mandel
parents:
diff changeset
820
e78566595089 initial import
mandel
parents:
diff changeset
821 void Lexer::scanKeyword0()
e78566595089 initial import
mandel
parents:
diff changeset
822 {
e78566595089 initial import
mandel
parents:
diff changeset
823 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
824 }
e78566595089 initial import
mandel
parents:
diff changeset
825
e78566595089 initial import
mandel
parents:
diff changeset
826 void Lexer::scanKeyword2()
e78566595089 initial import
mandel
parents:
diff changeset
827 {
e78566595089 initial import
mandel
parents:
diff changeset
828 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
829 {
e78566595089 initial import
mandel
parents:
diff changeset
830 case 'i':
e78566595089 initial import
mandel
parents:
diff changeset
831 if (*(cursor + 1) == 'f')
e78566595089 initial import
mandel
parents:
diff changeset
832 {
e78566595089 initial import
mandel
parents:
diff changeset
833 token_stream[(int) index++].kind = Token_if;
e78566595089 initial import
mandel
parents:
diff changeset
834 return;
e78566595089 initial import
mandel
parents:
diff changeset
835 }
e78566595089 initial import
mandel
parents:
diff changeset
836 break;
e78566595089 initial import
mandel
parents:
diff changeset
837
e78566595089 initial import
mandel
parents:
diff changeset
838 case 'd':
e78566595089 initial import
mandel
parents:
diff changeset
839 if (*(cursor + 1) == 'o')
e78566595089 initial import
mandel
parents:
diff changeset
840 {
e78566595089 initial import
mandel
parents:
diff changeset
841 token_stream[(int) index++].kind = Token_do;
e78566595089 initial import
mandel
parents:
diff changeset
842 return;
e78566595089 initial import
mandel
parents:
diff changeset
843 }
e78566595089 initial import
mandel
parents:
diff changeset
844 break;
e78566595089 initial import
mandel
parents:
diff changeset
845
e78566595089 initial import
mandel
parents:
diff changeset
846 case 'o':
e78566595089 initial import
mandel
parents:
diff changeset
847 if (*(cursor + 1) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
848 {
e78566595089 initial import
mandel
parents:
diff changeset
849 token_stream[(int) index++].kind = Token_or;
e78566595089 initial import
mandel
parents:
diff changeset
850 return;
e78566595089 initial import
mandel
parents:
diff changeset
851 }
e78566595089 initial import
mandel
parents:
diff changeset
852 break;
e78566595089 initial import
mandel
parents:
diff changeset
853
e78566595089 initial import
mandel
parents:
diff changeset
854 }
e78566595089 initial import
mandel
parents:
diff changeset
855 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
856 }
e78566595089 initial import
mandel
parents:
diff changeset
857
e78566595089 initial import
mandel
parents:
diff changeset
858 void Lexer::scanKeyword3()
e78566595089 initial import
mandel
parents:
diff changeset
859 {
e78566595089 initial import
mandel
parents:
diff changeset
860 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
861 {
e78566595089 initial import
mandel
parents:
diff changeset
862 case 'a':
e78566595089 initial import
mandel
parents:
diff changeset
863 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
864 *(cursor + 2) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
865 {
e78566595089 initial import
mandel
parents:
diff changeset
866 token_stream[(int) index++].kind = Token_and;
e78566595089 initial import
mandel
parents:
diff changeset
867 return;
e78566595089 initial import
mandel
parents:
diff changeset
868 }
e78566595089 initial import
mandel
parents:
diff changeset
869 if (*(cursor + 1) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
870 *(cursor + 2) == 'm')
e78566595089 initial import
mandel
parents:
diff changeset
871 {
e78566595089 initial import
mandel
parents:
diff changeset
872 token_stream[(int) index++].kind = Token_asm;
e78566595089 initial import
mandel
parents:
diff changeset
873 return;
e78566595089 initial import
mandel
parents:
diff changeset
874 }
e78566595089 initial import
mandel
parents:
diff changeset
875 break;
e78566595089 initial import
mandel
parents:
diff changeset
876
e78566595089 initial import
mandel
parents:
diff changeset
877 case 'f':
e78566595089 initial import
mandel
parents:
diff changeset
878 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
879 *(cursor + 2) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
880 {
e78566595089 initial import
mandel
parents:
diff changeset
881 token_stream[(int) index++].kind = Token_for;
e78566595089 initial import
mandel
parents:
diff changeset
882 return;
e78566595089 initial import
mandel
parents:
diff changeset
883 }
e78566595089 initial import
mandel
parents:
diff changeset
884 break;
e78566595089 initial import
mandel
parents:
diff changeset
885
e78566595089 initial import
mandel
parents:
diff changeset
886 case 'i':
e78566595089 initial import
mandel
parents:
diff changeset
887 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
888 *(cursor + 2) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
889 {
e78566595089 initial import
mandel
parents:
diff changeset
890 token_stream[(int) index++].kind = Token_int;
e78566595089 initial import
mandel
parents:
diff changeset
891 return;
e78566595089 initial import
mandel
parents:
diff changeset
892 }
e78566595089 initial import
mandel
parents:
diff changeset
893 break;
e78566595089 initial import
mandel
parents:
diff changeset
894
e78566595089 initial import
mandel
parents:
diff changeset
895 case 'n':
e78566595089 initial import
mandel
parents:
diff changeset
896 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
897 *(cursor + 2) == 'w')
e78566595089 initial import
mandel
parents:
diff changeset
898 {
e78566595089 initial import
mandel
parents:
diff changeset
899 token_stream[(int) index++].kind = Token_new;
e78566595089 initial import
mandel
parents:
diff changeset
900 return;
e78566595089 initial import
mandel
parents:
diff changeset
901 }
e78566595089 initial import
mandel
parents:
diff changeset
902 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
903 *(cursor + 2) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
904 {
e78566595089 initial import
mandel
parents:
diff changeset
905 token_stream[(int) index++].kind = Token_not;
e78566595089 initial import
mandel
parents:
diff changeset
906 return;
e78566595089 initial import
mandel
parents:
diff changeset
907 }
e78566595089 initial import
mandel
parents:
diff changeset
908 break;
e78566595089 initial import
mandel
parents:
diff changeset
909
e78566595089 initial import
mandel
parents:
diff changeset
910 case 't':
e78566595089 initial import
mandel
parents:
diff changeset
911 if (*(cursor + 1) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
912 *(cursor + 2) == 'y')
e78566595089 initial import
mandel
parents:
diff changeset
913 {
e78566595089 initial import
mandel
parents:
diff changeset
914 token_stream[(int) index++].kind = Token_try;
e78566595089 initial import
mandel
parents:
diff changeset
915 return;
e78566595089 initial import
mandel
parents:
diff changeset
916 }
e78566595089 initial import
mandel
parents:
diff changeset
917 break;
e78566595089 initial import
mandel
parents:
diff changeset
918
e78566595089 initial import
mandel
parents:
diff changeset
919 case 'x':
e78566595089 initial import
mandel
parents:
diff changeset
920 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
921 *(cursor + 2) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
922 {
e78566595089 initial import
mandel
parents:
diff changeset
923 token_stream[(int) index++].kind = Token_xor;
e78566595089 initial import
mandel
parents:
diff changeset
924 return;
e78566595089 initial import
mandel
parents:
diff changeset
925 }
e78566595089 initial import
mandel
parents:
diff changeset
926 break;
e78566595089 initial import
mandel
parents:
diff changeset
927
e78566595089 initial import
mandel
parents:
diff changeset
928 }
e78566595089 initial import
mandel
parents:
diff changeset
929 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
930 }
e78566595089 initial import
mandel
parents:
diff changeset
931
e78566595089 initial import
mandel
parents:
diff changeset
932 void Lexer::scanKeyword4()
e78566595089 initial import
mandel
parents:
diff changeset
933 {
e78566595089 initial import
mandel
parents:
diff changeset
934 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
935 {
e78566595089 initial import
mandel
parents:
diff changeset
936 case 'a':
e78566595089 initial import
mandel
parents:
diff changeset
937 if (*(cursor + 1) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
938 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
939 *(cursor + 3) == 'o')
e78566595089 initial import
mandel
parents:
diff changeset
940 {
e78566595089 initial import
mandel
parents:
diff changeset
941 token_stream[(int) index++].kind = Token_auto;
e78566595089 initial import
mandel
parents:
diff changeset
942 return;
e78566595089 initial import
mandel
parents:
diff changeset
943 }
e78566595089 initial import
mandel
parents:
diff changeset
944 break;
e78566595089 initial import
mandel
parents:
diff changeset
945
e78566595089 initial import
mandel
parents:
diff changeset
946 case 'c':
e78566595089 initial import
mandel
parents:
diff changeset
947 if (*(cursor + 1) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
948 *(cursor + 2) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
949 *(cursor + 3) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
950 {
e78566595089 initial import
mandel
parents:
diff changeset
951 token_stream[(int) index++].kind = Token_case;
e78566595089 initial import
mandel
parents:
diff changeset
952 return;
e78566595089 initial import
mandel
parents:
diff changeset
953 }
e78566595089 initial import
mandel
parents:
diff changeset
954 if (*(cursor + 1) == 'h' &&
e78566595089 initial import
mandel
parents:
diff changeset
955 *(cursor + 2) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
956 *(cursor + 3) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
957 {
e78566595089 initial import
mandel
parents:
diff changeset
958 token_stream[(int) index++].kind = Token_char;
e78566595089 initial import
mandel
parents:
diff changeset
959 return;
e78566595089 initial import
mandel
parents:
diff changeset
960 }
e78566595089 initial import
mandel
parents:
diff changeset
961 break;
e78566595089 initial import
mandel
parents:
diff changeset
962
e78566595089 initial import
mandel
parents:
diff changeset
963 case 'b':
e78566595089 initial import
mandel
parents:
diff changeset
964 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
965 *(cursor + 2) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
966 *(cursor + 3) == 'l')
e78566595089 initial import
mandel
parents:
diff changeset
967 {
e78566595089 initial import
mandel
parents:
diff changeset
968 token_stream[(int) index++].kind = Token_bool;
e78566595089 initial import
mandel
parents:
diff changeset
969 return;
e78566595089 initial import
mandel
parents:
diff changeset
970 }
e78566595089 initial import
mandel
parents:
diff changeset
971 break;
e78566595089 initial import
mandel
parents:
diff changeset
972
e78566595089 initial import
mandel
parents:
diff changeset
973 case 'e':
e78566595089 initial import
mandel
parents:
diff changeset
974 if (*(cursor + 1) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
975 *(cursor + 2) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
976 *(cursor + 3) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
977 {
e78566595089 initial import
mandel
parents:
diff changeset
978 token_stream[(int) index++].kind = Token_else;
e78566595089 initial import
mandel
parents:
diff changeset
979 return;
e78566595089 initial import
mandel
parents:
diff changeset
980 }
e78566595089 initial import
mandel
parents:
diff changeset
981 if (*(cursor + 1) == 'm' &&
e78566595089 initial import
mandel
parents:
diff changeset
982 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
983 *(cursor + 3) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
984 {
e78566595089 initial import
mandel
parents:
diff changeset
985 token_stream[(int) index++].kind = Token_emit;
e78566595089 initial import
mandel
parents:
diff changeset
986 return;
e78566595089 initial import
mandel
parents:
diff changeset
987 }
e78566595089 initial import
mandel
parents:
diff changeset
988 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
989 *(cursor + 2) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
990 *(cursor + 3) == 'm')
e78566595089 initial import
mandel
parents:
diff changeset
991 {
e78566595089 initial import
mandel
parents:
diff changeset
992 token_stream[(int) index++].kind = Token_enum;
e78566595089 initial import
mandel
parents:
diff changeset
993 return;
e78566595089 initial import
mandel
parents:
diff changeset
994 }
e78566595089 initial import
mandel
parents:
diff changeset
995 break;
e78566595089 initial import
mandel
parents:
diff changeset
996
e78566595089 initial import
mandel
parents:
diff changeset
997 case 'g':
e78566595089 initial import
mandel
parents:
diff changeset
998 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
999 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1000 *(cursor + 3) == 'o')
e78566595089 initial import
mandel
parents:
diff changeset
1001 {
e78566595089 initial import
mandel
parents:
diff changeset
1002 token_stream[(int) index++].kind = Token_goto;
e78566595089 initial import
mandel
parents:
diff changeset
1003 return;
e78566595089 initial import
mandel
parents:
diff changeset
1004 }
e78566595089 initial import
mandel
parents:
diff changeset
1005 break;
e78566595089 initial import
mandel
parents:
diff changeset
1006
e78566595089 initial import
mandel
parents:
diff changeset
1007 case 'l':
e78566595089 initial import
mandel
parents:
diff changeset
1008 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1009 *(cursor + 2) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1010 *(cursor + 3) == 'g')
e78566595089 initial import
mandel
parents:
diff changeset
1011 {
e78566595089 initial import
mandel
parents:
diff changeset
1012 token_stream[(int) index++].kind = Token_long;
e78566595089 initial import
mandel
parents:
diff changeset
1013 return;
e78566595089 initial import
mandel
parents:
diff changeset
1014 }
e78566595089 initial import
mandel
parents:
diff changeset
1015 break;
e78566595089 initial import
mandel
parents:
diff changeset
1016
e78566595089 initial import
mandel
parents:
diff changeset
1017 case 't':
e78566595089 initial import
mandel
parents:
diff changeset
1018 if (*(cursor + 1) == 'h' &&
e78566595089 initial import
mandel
parents:
diff changeset
1019 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1020 *(cursor + 3) == 's')
e78566595089 initial import
mandel
parents:
diff changeset
1021 {
e78566595089 initial import
mandel
parents:
diff changeset
1022 token_stream[(int) index++].kind = Token_this;
e78566595089 initial import
mandel
parents:
diff changeset
1023 return;
e78566595089 initial import
mandel
parents:
diff changeset
1024 }
e78566595089 initial import
mandel
parents:
diff changeset
1025 break;
e78566595089 initial import
mandel
parents:
diff changeset
1026
e78566595089 initial import
mandel
parents:
diff changeset
1027 case 'v':
e78566595089 initial import
mandel
parents:
diff changeset
1028 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1029 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1030 *(cursor + 3) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1031 {
e78566595089 initial import
mandel
parents:
diff changeset
1032 token_stream[(int) index++].kind = Token_void;
e78566595089 initial import
mandel
parents:
diff changeset
1033 return;
e78566595089 initial import
mandel
parents:
diff changeset
1034 }
e78566595089 initial import
mandel
parents:
diff changeset
1035 break;
e78566595089 initial import
mandel
parents:
diff changeset
1036
e78566595089 initial import
mandel
parents:
diff changeset
1037 }
e78566595089 initial import
mandel
parents:
diff changeset
1038 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1039 }
e78566595089 initial import
mandel
parents:
diff changeset
1040
e78566595089 initial import
mandel
parents:
diff changeset
1041 void Lexer::scanKeyword5()
e78566595089 initial import
mandel
parents:
diff changeset
1042 {
e78566595089 initial import
mandel
parents:
diff changeset
1043 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1044 {
e78566595089 initial import
mandel
parents:
diff changeset
1045 case 'c':
e78566595089 initial import
mandel
parents:
diff changeset
1046 if (*(cursor + 1) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1047 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1048 *(cursor + 3) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1049 *(cursor + 4) == 'h')
e78566595089 initial import
mandel
parents:
diff changeset
1050 {
e78566595089 initial import
mandel
parents:
diff changeset
1051 token_stream[(int) index++].kind = Token_catch;
e78566595089 initial import
mandel
parents:
diff changeset
1052 return;
e78566595089 initial import
mandel
parents:
diff changeset
1053 }
e78566595089 initial import
mandel
parents:
diff changeset
1054 if (*(cursor + 1) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1055 *(cursor + 2) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1056 *(cursor + 3) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1057 *(cursor + 4) == 's')
e78566595089 initial import
mandel
parents:
diff changeset
1058 {
e78566595089 initial import
mandel
parents:
diff changeset
1059 token_stream[(int) index++].kind = Token_class;
e78566595089 initial import
mandel
parents:
diff changeset
1060 return;
e78566595089 initial import
mandel
parents:
diff changeset
1061 }
e78566595089 initial import
mandel
parents:
diff changeset
1062 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1063 *(cursor + 2) == 'm' &&
e78566595089 initial import
mandel
parents:
diff changeset
1064 *(cursor + 3) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1065 *(cursor + 4) == 'l')
e78566595089 initial import
mandel
parents:
diff changeset
1066 {
e78566595089 initial import
mandel
parents:
diff changeset
1067 token_stream[(int) index++].kind = Token_compl;
e78566595089 initial import
mandel
parents:
diff changeset
1068 return;
e78566595089 initial import
mandel
parents:
diff changeset
1069 }
e78566595089 initial import
mandel
parents:
diff changeset
1070 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1071 *(cursor + 2) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1072 *(cursor + 3) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1073 *(cursor + 4) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1074 {
e78566595089 initial import
mandel
parents:
diff changeset
1075 token_stream[(int) index++].kind = Token_const;
e78566595089 initial import
mandel
parents:
diff changeset
1076 return;
e78566595089 initial import
mandel
parents:
diff changeset
1077 }
e78566595089 initial import
mandel
parents:
diff changeset
1078 break;
e78566595089 initial import
mandel
parents:
diff changeset
1079
e78566595089 initial import
mandel
parents:
diff changeset
1080 case 'b':
e78566595089 initial import
mandel
parents:
diff changeset
1081 if (*(cursor + 1) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1082 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1083 *(cursor + 3) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1084 *(cursor + 4) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
1085 {
e78566595089 initial import
mandel
parents:
diff changeset
1086 token_stream[(int) index++].kind = Token_bitor;
e78566595089 initial import
mandel
parents:
diff changeset
1087 return;
e78566595089 initial import
mandel
parents:
diff changeset
1088 }
e78566595089 initial import
mandel
parents:
diff changeset
1089 if (*(cursor + 1) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1090 *(cursor + 2) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1091 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1092 *(cursor + 4) == 'k')
e78566595089 initial import
mandel
parents:
diff changeset
1093 {
e78566595089 initial import
mandel
parents:
diff changeset
1094 token_stream[(int) index++].kind = Token_break;
e78566595089 initial import
mandel
parents:
diff changeset
1095 return;
e78566595089 initial import
mandel
parents:
diff changeset
1096 }
e78566595089 initial import
mandel
parents:
diff changeset
1097 break;
e78566595089 initial import
mandel
parents:
diff changeset
1098
e78566595089 initial import
mandel
parents:
diff changeset
1099 case 'f':
e78566595089 initial import
mandel
parents:
diff changeset
1100 if (*(cursor + 1) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1101 *(cursor + 2) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1102 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1103 *(cursor + 4) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1104 {
e78566595089 initial import
mandel
parents:
diff changeset
1105 token_stream[(int) index++].kind = Token_float;
e78566595089 initial import
mandel
parents:
diff changeset
1106 return;
e78566595089 initial import
mandel
parents:
diff changeset
1107 }
e78566595089 initial import
mandel
parents:
diff changeset
1108 break;
e78566595089 initial import
mandel
parents:
diff changeset
1109
e78566595089 initial import
mandel
parents:
diff changeset
1110 case 'o':
e78566595089 initial import
mandel
parents:
diff changeset
1111 if (*(cursor + 1) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1112 *(cursor + 2) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1113 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1114 *(cursor + 4) == 'q')
e78566595089 initial import
mandel
parents:
diff changeset
1115 {
e78566595089 initial import
mandel
parents:
diff changeset
1116 token_stream[(int) index++].kind = Token_or_eq;
e78566595089 initial import
mandel
parents:
diff changeset
1117 return;
e78566595089 initial import
mandel
parents:
diff changeset
1118 }
e78566595089 initial import
mandel
parents:
diff changeset
1119 break;
e78566595089 initial import
mandel
parents:
diff changeset
1120
e78566595089 initial import
mandel
parents:
diff changeset
1121 case 's':
e78566595089 initial import
mandel
parents:
diff changeset
1122 if (*(cursor + 1) == 'h' &&
e78566595089 initial import
mandel
parents:
diff changeset
1123 *(cursor + 2) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1124 *(cursor + 3) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1125 *(cursor + 4) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1126 {
e78566595089 initial import
mandel
parents:
diff changeset
1127 token_stream[(int) index++].kind = Token_short;
e78566595089 initial import
mandel
parents:
diff changeset
1128 return;
e78566595089 initial import
mandel
parents:
diff changeset
1129 }
e78566595089 initial import
mandel
parents:
diff changeset
1130 if (*(cursor + 1) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1131 *(cursor + 2) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1132 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1133 *(cursor + 4) == 's')
e78566595089 initial import
mandel
parents:
diff changeset
1134 {
e78566595089 initial import
mandel
parents:
diff changeset
1135 token_stream[(int) index++].kind = Token_slots;
e78566595089 initial import
mandel
parents:
diff changeset
1136 return;
e78566595089 initial import
mandel
parents:
diff changeset
1137 }
e78566595089 initial import
mandel
parents:
diff changeset
1138 break;
e78566595089 initial import
mandel
parents:
diff changeset
1139
e78566595089 initial import
mandel
parents:
diff changeset
1140 case 'u':
e78566595089 initial import
mandel
parents:
diff changeset
1141 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1142 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1143 *(cursor + 3) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1144 *(cursor + 4) == 'n')
e78566595089 initial import
mandel
parents:
diff changeset
1145 {
e78566595089 initial import
mandel
parents:
diff changeset
1146 token_stream[(int) index++].kind = Token_union;
e78566595089 initial import
mandel
parents:
diff changeset
1147 return;
e78566595089 initial import
mandel
parents:
diff changeset
1148 }
e78566595089 initial import
mandel
parents:
diff changeset
1149 if (*(cursor + 1) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1150 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1151 *(cursor + 3) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1152 *(cursor + 4) == 'g')
e78566595089 initial import
mandel
parents:
diff changeset
1153 {
e78566595089 initial import
mandel
parents:
diff changeset
1154 token_stream[(int) index++].kind = Token_using;
e78566595089 initial import
mandel
parents:
diff changeset
1155 return;
e78566595089 initial import
mandel
parents:
diff changeset
1156 }
e78566595089 initial import
mandel
parents:
diff changeset
1157 break;
e78566595089 initial import
mandel
parents:
diff changeset
1158
e78566595089 initial import
mandel
parents:
diff changeset
1159 case 't':
e78566595089 initial import
mandel
parents:
diff changeset
1160 if (*(cursor + 1) == 'h' &&
e78566595089 initial import
mandel
parents:
diff changeset
1161 *(cursor + 2) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1162 *(cursor + 3) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1163 *(cursor + 4) == 'w')
e78566595089 initial import
mandel
parents:
diff changeset
1164 {
e78566595089 initial import
mandel
parents:
diff changeset
1165 token_stream[(int) index++].kind = Token_throw;
e78566595089 initial import
mandel
parents:
diff changeset
1166 return;
e78566595089 initial import
mandel
parents:
diff changeset
1167 }
e78566595089 initial import
mandel
parents:
diff changeset
1168 break;
e78566595089 initial import
mandel
parents:
diff changeset
1169
e78566595089 initial import
mandel
parents:
diff changeset
1170 case 'w':
e78566595089 initial import
mandel
parents:
diff changeset
1171 if (*(cursor + 1) == 'h' &&
e78566595089 initial import
mandel
parents:
diff changeset
1172 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1173 *(cursor + 3) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1174 *(cursor + 4) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1175 {
e78566595089 initial import
mandel
parents:
diff changeset
1176 token_stream[(int) index++].kind = Token_while;
e78566595089 initial import
mandel
parents:
diff changeset
1177 return;
e78566595089 initial import
mandel
parents:
diff changeset
1178 }
e78566595089 initial import
mandel
parents:
diff changeset
1179 break;
e78566595089 initial import
mandel
parents:
diff changeset
1180
e78566595089 initial import
mandel
parents:
diff changeset
1181 }
e78566595089 initial import
mandel
parents:
diff changeset
1182 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1183 }
e78566595089 initial import
mandel
parents:
diff changeset
1184
e78566595089 initial import
mandel
parents:
diff changeset
1185 void Lexer::scanKeyword6()
e78566595089 initial import
mandel
parents:
diff changeset
1186 {
e78566595089 initial import
mandel
parents:
diff changeset
1187 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1188 {
e78566595089 initial import
mandel
parents:
diff changeset
1189 case 'a':
e78566595089 initial import
mandel
parents:
diff changeset
1190 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1191 *(cursor + 2) == 'd' &&
e78566595089 initial import
mandel
parents:
diff changeset
1192 *(cursor + 3) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1193 *(cursor + 4) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1194 *(cursor + 5) == 'q')
e78566595089 initial import
mandel
parents:
diff changeset
1195 {
e78566595089 initial import
mandel
parents:
diff changeset
1196 token_stream[(int) index++].kind = Token_and_eq;
e78566595089 initial import
mandel
parents:
diff changeset
1197 return;
e78566595089 initial import
mandel
parents:
diff changeset
1198 }
e78566595089 initial import
mandel
parents:
diff changeset
1199 break;
e78566595089 initial import
mandel
parents:
diff changeset
1200
e78566595089 initial import
mandel
parents:
diff changeset
1201 case 'b':
e78566595089 initial import
mandel
parents:
diff changeset
1202 if (*(cursor + 1) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1203 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1204 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1205 *(cursor + 4) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1206 *(cursor + 5) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1207 {
e78566595089 initial import
mandel
parents:
diff changeset
1208 token_stream[(int) index++].kind = Token_bitand;
e78566595089 initial import
mandel
parents:
diff changeset
1209 return;
e78566595089 initial import
mandel
parents:
diff changeset
1210 }
e78566595089 initial import
mandel
parents:
diff changeset
1211 break;
e78566595089 initial import
mandel
parents:
diff changeset
1212
e78566595089 initial import
mandel
parents:
diff changeset
1213 case 'e':
e78566595089 initial import
mandel
parents:
diff changeset
1214 if (*(cursor + 1) == 'x' &&
e78566595089 initial import
mandel
parents:
diff changeset
1215 *(cursor + 2) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1216 *(cursor + 3) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1217 *(cursor + 4) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1218 *(cursor + 5) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1219 {
e78566595089 initial import
mandel
parents:
diff changeset
1220 token_stream[(int) index++].kind = Token_export;
e78566595089 initial import
mandel
parents:
diff changeset
1221 return;
e78566595089 initial import
mandel
parents:
diff changeset
1222 }
e78566595089 initial import
mandel
parents:
diff changeset
1223 if (*(cursor + 1) == 'x' &&
e78566595089 initial import
mandel
parents:
diff changeset
1224 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1225 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1226 *(cursor + 4) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1227 *(cursor + 5) == 'n')
e78566595089 initial import
mandel
parents:
diff changeset
1228 {
e78566595089 initial import
mandel
parents:
diff changeset
1229 token_stream[(int) index++].kind = Token_extern;
e78566595089 initial import
mandel
parents:
diff changeset
1230 return;
e78566595089 initial import
mandel
parents:
diff changeset
1231 }
e78566595089 initial import
mandel
parents:
diff changeset
1232 break;
e78566595089 initial import
mandel
parents:
diff changeset
1233
e78566595089 initial import
mandel
parents:
diff changeset
1234 case 'd':
e78566595089 initial import
mandel
parents:
diff changeset
1235 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1236 *(cursor + 2) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1237 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1238 *(cursor + 4) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1239 *(cursor + 5) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1240 {
e78566595089 initial import
mandel
parents:
diff changeset
1241 token_stream[(int) index++].kind = Token_delete;
e78566595089 initial import
mandel
parents:
diff changeset
1242 return;
e78566595089 initial import
mandel
parents:
diff changeset
1243 }
e78566595089 initial import
mandel
parents:
diff changeset
1244 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1245 *(cursor + 2) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1246 *(cursor + 3) == 'b' &&
e78566595089 initial import
mandel
parents:
diff changeset
1247 *(cursor + 4) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1248 *(cursor + 5) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1249 {
e78566595089 initial import
mandel
parents:
diff changeset
1250 token_stream[(int) index++].kind = Token_double;
e78566595089 initial import
mandel
parents:
diff changeset
1251 return;
e78566595089 initial import
mandel
parents:
diff changeset
1252 }
e78566595089 initial import
mandel
parents:
diff changeset
1253 break;
e78566595089 initial import
mandel
parents:
diff changeset
1254
e78566595089 initial import
mandel
parents:
diff changeset
1255 case 'f':
e78566595089 initial import
mandel
parents:
diff changeset
1256 if (*(cursor + 1) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1257 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1258 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1259 *(cursor + 4) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1260 *(cursor + 5) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1261 {
e78566595089 initial import
mandel
parents:
diff changeset
1262 token_stream[(int) index++].kind = Token_friend;
e78566595089 initial import
mandel
parents:
diff changeset
1263 return;
e78566595089 initial import
mandel
parents:
diff changeset
1264 }
e78566595089 initial import
mandel
parents:
diff changeset
1265 break;
e78566595089 initial import
mandel
parents:
diff changeset
1266
e78566595089 initial import
mandel
parents:
diff changeset
1267 case 'i':
e78566595089 initial import
mandel
parents:
diff changeset
1268 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1269 *(cursor + 2) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1270 *(cursor + 3) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1271 *(cursor + 4) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1272 *(cursor + 5) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1273 {
e78566595089 initial import
mandel
parents:
diff changeset
1274 token_stream[(int) index++].kind = Token_inline;
e78566595089 initial import
mandel
parents:
diff changeset
1275 return;
e78566595089 initial import
mandel
parents:
diff changeset
1276 }
e78566595089 initial import
mandel
parents:
diff changeset
1277 break;
e78566595089 initial import
mandel
parents:
diff changeset
1278
e78566595089 initial import
mandel
parents:
diff changeset
1279 case 'K':
e78566595089 initial import
mandel
parents:
diff changeset
1280 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1281 *(cursor + 2) == 'D' &&
e78566595089 initial import
mandel
parents:
diff changeset
1282 *(cursor + 3) == 'C' &&
e78566595089 initial import
mandel
parents:
diff changeset
1283 *(cursor + 4) == 'O' &&
e78566595089 initial import
mandel
parents:
diff changeset
1284 *(cursor + 5) == 'P')
e78566595089 initial import
mandel
parents:
diff changeset
1285 {
e78566595089 initial import
mandel
parents:
diff changeset
1286 token_stream[(int) index++].kind = Token_K_DCOP;
e78566595089 initial import
mandel
parents:
diff changeset
1287 return;
e78566595089 initial import
mandel
parents:
diff changeset
1288 }
e78566595089 initial import
mandel
parents:
diff changeset
1289 break;
e78566595089 initial import
mandel
parents:
diff changeset
1290
e78566595089 initial import
mandel
parents:
diff changeset
1291 case 'n':
e78566595089 initial import
mandel
parents:
diff changeset
1292 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1293 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1294 *(cursor + 3) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1295 *(cursor + 4) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1296 *(cursor + 5) == 'q')
e78566595089 initial import
mandel
parents:
diff changeset
1297 {
e78566595089 initial import
mandel
parents:
diff changeset
1298 token_stream[(int) index++].kind = Token_not_eq;
e78566595089 initial import
mandel
parents:
diff changeset
1299 return;
e78566595089 initial import
mandel
parents:
diff changeset
1300 }
e78566595089 initial import
mandel
parents:
diff changeset
1301 break;
e78566595089 initial import
mandel
parents:
diff changeset
1302
e78566595089 initial import
mandel
parents:
diff changeset
1303 case 'p':
e78566595089 initial import
mandel
parents:
diff changeset
1304 if (*(cursor + 1) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1305 *(cursor + 2) == 'b' &&
e78566595089 initial import
mandel
parents:
diff changeset
1306 *(cursor + 3) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1307 *(cursor + 4) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1308 *(cursor + 5) == 'c')
e78566595089 initial import
mandel
parents:
diff changeset
1309 {
e78566595089 initial import
mandel
parents:
diff changeset
1310 token_stream[(int) index++].kind = Token_public;
e78566595089 initial import
mandel
parents:
diff changeset
1311 return;
e78566595089 initial import
mandel
parents:
diff changeset
1312 }
e78566595089 initial import
mandel
parents:
diff changeset
1313 break;
e78566595089 initial import
mandel
parents:
diff changeset
1314
e78566595089 initial import
mandel
parents:
diff changeset
1315 case 's':
e78566595089 initial import
mandel
parents:
diff changeset
1316 if (*(cursor + 1) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1317 *(cursor + 2) == 'g' &&
e78566595089 initial import
mandel
parents:
diff changeset
1318 *(cursor + 3) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1319 *(cursor + 4) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1320 *(cursor + 5) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1321 {
e78566595089 initial import
mandel
parents:
diff changeset
1322 token_stream[(int) index++].kind = Token_signed;
e78566595089 initial import
mandel
parents:
diff changeset
1323 return;
e78566595089 initial import
mandel
parents:
diff changeset
1324 }
e78566595089 initial import
mandel
parents:
diff changeset
1325 if (*(cursor + 1) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1326 *(cursor + 2) == 'z' &&
e78566595089 initial import
mandel
parents:
diff changeset
1327 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1328 *(cursor + 4) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1329 *(cursor + 5) == 'f')
e78566595089 initial import
mandel
parents:
diff changeset
1330 {
e78566595089 initial import
mandel
parents:
diff changeset
1331 token_stream[(int) index++].kind = Token_sizeof;
e78566595089 initial import
mandel
parents:
diff changeset
1332 return;
e78566595089 initial import
mandel
parents:
diff changeset
1333 }
e78566595089 initial import
mandel
parents:
diff changeset
1334 if (*(cursor + 1) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1335 *(cursor + 2) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1336 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1337 *(cursor + 4) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1338 *(cursor + 5) == 'c')
e78566595089 initial import
mandel
parents:
diff changeset
1339 {
e78566595089 initial import
mandel
parents:
diff changeset
1340 token_stream[(int) index++].kind = Token_static;
e78566595089 initial import
mandel
parents:
diff changeset
1341 return;
e78566595089 initial import
mandel
parents:
diff changeset
1342 }
e78566595089 initial import
mandel
parents:
diff changeset
1343 if (*(cursor + 1) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1344 *(cursor + 2) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1345 *(cursor + 3) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1346 *(cursor + 4) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1347 *(cursor + 5) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1348 {
e78566595089 initial import
mandel
parents:
diff changeset
1349 token_stream[(int) index++].kind = Token_struct;
e78566595089 initial import
mandel
parents:
diff changeset
1350 return;
e78566595089 initial import
mandel
parents:
diff changeset
1351 }
e78566595089 initial import
mandel
parents:
diff changeset
1352 if (*(cursor + 1) == 'w' &&
e78566595089 initial import
mandel
parents:
diff changeset
1353 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1354 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1355 *(cursor + 4) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1356 *(cursor + 5) == 'h')
e78566595089 initial import
mandel
parents:
diff changeset
1357 {
e78566595089 initial import
mandel
parents:
diff changeset
1358 token_stream[(int) index++].kind = Token_switch;
e78566595089 initial import
mandel
parents:
diff changeset
1359 return;
e78566595089 initial import
mandel
parents:
diff changeset
1360 }
e78566595089 initial import
mandel
parents:
diff changeset
1361 break;
e78566595089 initial import
mandel
parents:
diff changeset
1362
e78566595089 initial import
mandel
parents:
diff changeset
1363 case 'r':
e78566595089 initial import
mandel
parents:
diff changeset
1364 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1365 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1366 *(cursor + 3) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1367 *(cursor + 4) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1368 *(cursor + 5) == 'n')
e78566595089 initial import
mandel
parents:
diff changeset
1369 {
e78566595089 initial import
mandel
parents:
diff changeset
1370 token_stream[(int) index++].kind = Token_return;
e78566595089 initial import
mandel
parents:
diff changeset
1371 return;
e78566595089 initial import
mandel
parents:
diff changeset
1372 }
e78566595089 initial import
mandel
parents:
diff changeset
1373 break;
e78566595089 initial import
mandel
parents:
diff changeset
1374
e78566595089 initial import
mandel
parents:
diff changeset
1375 case 't':
e78566595089 initial import
mandel
parents:
diff changeset
1376 if (*(cursor + 1) == 'y' &&
e78566595089 initial import
mandel
parents:
diff changeset
1377 *(cursor + 2) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1378 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1379 *(cursor + 4) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1380 *(cursor + 5) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1381 {
e78566595089 initial import
mandel
parents:
diff changeset
1382 token_stream[(int) index++].kind = Token_typeid;
e78566595089 initial import
mandel
parents:
diff changeset
1383 return;
e78566595089 initial import
mandel
parents:
diff changeset
1384 }
e78566595089 initial import
mandel
parents:
diff changeset
1385 break;
e78566595089 initial import
mandel
parents:
diff changeset
1386
e78566595089 initial import
mandel
parents:
diff changeset
1387 case 'x':
e78566595089 initial import
mandel
parents:
diff changeset
1388 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1389 *(cursor + 2) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1390 *(cursor + 3) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1391 *(cursor + 4) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1392 *(cursor + 5) == 'q')
e78566595089 initial import
mandel
parents:
diff changeset
1393 {
e78566595089 initial import
mandel
parents:
diff changeset
1394 token_stream[(int) index++].kind = Token_xor_eq;
e78566595089 initial import
mandel
parents:
diff changeset
1395 return;
e78566595089 initial import
mandel
parents:
diff changeset
1396 }
e78566595089 initial import
mandel
parents:
diff changeset
1397 break;
e78566595089 initial import
mandel
parents:
diff changeset
1398
e78566595089 initial import
mandel
parents:
diff changeset
1399 case 'k':
e78566595089 initial import
mandel
parents:
diff changeset
1400 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1401 *(cursor + 2) == 'd' &&
e78566595089 initial import
mandel
parents:
diff changeset
1402 *(cursor + 3) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1403 *(cursor + 4) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1404 *(cursor + 5) == 'p')
e78566595089 initial import
mandel
parents:
diff changeset
1405 {
e78566595089 initial import
mandel
parents:
diff changeset
1406 token_stream[(int) index++].kind = Token_k_dcop;
e78566595089 initial import
mandel
parents:
diff changeset
1407 return;
e78566595089 initial import
mandel
parents:
diff changeset
1408 }
e78566595089 initial import
mandel
parents:
diff changeset
1409 break;
e78566595089 initial import
mandel
parents:
diff changeset
1410
e78566595089 initial import
mandel
parents:
diff changeset
1411 }
e78566595089 initial import
mandel
parents:
diff changeset
1412 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1413 }
e78566595089 initial import
mandel
parents:
diff changeset
1414
e78566595089 initial import
mandel
parents:
diff changeset
1415 void Lexer::scanKeyword7()
e78566595089 initial import
mandel
parents:
diff changeset
1416 {
e78566595089 initial import
mandel
parents:
diff changeset
1417 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1418 {
e78566595089 initial import
mandel
parents:
diff changeset
1419 case 'd':
e78566595089 initial import
mandel
parents:
diff changeset
1420 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1421 *(cursor + 2) == 'f' &&
e78566595089 initial import
mandel
parents:
diff changeset
1422 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1423 *(cursor + 4) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1424 *(cursor + 5) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1425 *(cursor + 6) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1426 {
e78566595089 initial import
mandel
parents:
diff changeset
1427 token_stream[(int) index++].kind = Token_default;
e78566595089 initial import
mandel
parents:
diff changeset
1428 return;
e78566595089 initial import
mandel
parents:
diff changeset
1429 }
e78566595089 initial import
mandel
parents:
diff changeset
1430 break;
e78566595089 initial import
mandel
parents:
diff changeset
1431
e78566595089 initial import
mandel
parents:
diff changeset
1432 case 'm':
e78566595089 initial import
mandel
parents:
diff changeset
1433 if (*(cursor + 1) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1434 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1435 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1436 *(cursor + 4) == 'b' &&
e78566595089 initial import
mandel
parents:
diff changeset
1437 *(cursor + 5) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1438 *(cursor + 6) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1439 {
e78566595089 initial import
mandel
parents:
diff changeset
1440 token_stream[(int) index++].kind = Token_mutable;
e78566595089 initial import
mandel
parents:
diff changeset
1441 return;
e78566595089 initial import
mandel
parents:
diff changeset
1442 }
e78566595089 initial import
mandel
parents:
diff changeset
1443 break;
e78566595089 initial import
mandel
parents:
diff changeset
1444
e78566595089 initial import
mandel
parents:
diff changeset
1445 case 'p':
e78566595089 initial import
mandel
parents:
diff changeset
1446 if (*(cursor + 1) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1447 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1448 *(cursor + 3) == 'v' &&
e78566595089 initial import
mandel
parents:
diff changeset
1449 *(cursor + 4) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1450 *(cursor + 5) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1451 *(cursor + 6) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1452 {
e78566595089 initial import
mandel
parents:
diff changeset
1453 token_stream[(int) index++].kind = Token_private;
e78566595089 initial import
mandel
parents:
diff changeset
1454 return;
e78566595089 initial import
mandel
parents:
diff changeset
1455 }
e78566595089 initial import
mandel
parents:
diff changeset
1456 break;
e78566595089 initial import
mandel
parents:
diff changeset
1457 case 's':
e78566595089 initial import
mandel
parents:
diff changeset
1458 if (*(cursor + 1) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1459 *(cursor + 2) == 'g' &&
e78566595089 initial import
mandel
parents:
diff changeset
1460 *(cursor + 3) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1461 *(cursor + 4) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1462 *(cursor + 5) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1463 *(cursor + 6) == 's')
e78566595089 initial import
mandel
parents:
diff changeset
1464 {
e78566595089 initial import
mandel
parents:
diff changeset
1465 token_stream[(int) index++].kind = Token_signals;
e78566595089 initial import
mandel
parents:
diff changeset
1466 return;
e78566595089 initial import
mandel
parents:
diff changeset
1467 }
e78566595089 initial import
mandel
parents:
diff changeset
1468 break;
e78566595089 initial import
mandel
parents:
diff changeset
1469 case 't':
e78566595089 initial import
mandel
parents:
diff changeset
1470 if (*(cursor + 1) == 'y' &&
e78566595089 initial import
mandel
parents:
diff changeset
1471 *(cursor + 2) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1472 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1473 *(cursor + 4) == 'd' &&
e78566595089 initial import
mandel
parents:
diff changeset
1474 *(cursor + 5) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1475 *(cursor + 6) == 'f')
e78566595089 initial import
mandel
parents:
diff changeset
1476 {
e78566595089 initial import
mandel
parents:
diff changeset
1477 token_stream[(int) index++].kind = Token_typedef;
e78566595089 initial import
mandel
parents:
diff changeset
1478 return;
e78566595089 initial import
mandel
parents:
diff changeset
1479 }
e78566595089 initial import
mandel
parents:
diff changeset
1480 break;
e78566595089 initial import
mandel
parents:
diff changeset
1481
e78566595089 initial import
mandel
parents:
diff changeset
1482 case 'v':
e78566595089 initial import
mandel
parents:
diff changeset
1483 if (*(cursor + 1) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1484 *(cursor + 2) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1485 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1486 *(cursor + 4) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1487 *(cursor + 5) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1488 *(cursor + 6) == 'l')
e78566595089 initial import
mandel
parents:
diff changeset
1489 {
e78566595089 initial import
mandel
parents:
diff changeset
1490 token_stream[(int) index++].kind = Token_virtual;
e78566595089 initial import
mandel
parents:
diff changeset
1491 return;
e78566595089 initial import
mandel
parents:
diff changeset
1492 }
e78566595089 initial import
mandel
parents:
diff changeset
1493 break;
e78566595089 initial import
mandel
parents:
diff changeset
1494
e78566595089 initial import
mandel
parents:
diff changeset
1495 case 'Q':
e78566595089 initial import
mandel
parents:
diff changeset
1496 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1497 *(cursor + 2) == 'E' &&
e78566595089 initial import
mandel
parents:
diff changeset
1498 *(cursor + 3) == 'N' &&
e78566595089 initial import
mandel
parents:
diff changeset
1499 *(cursor + 4) == 'U' &&
e78566595089 initial import
mandel
parents:
diff changeset
1500 *(cursor + 5) == 'M' &&
e78566595089 initial import
mandel
parents:
diff changeset
1501 *(cursor + 6) == 'S')
e78566595089 initial import
mandel
parents:
diff changeset
1502 {
e78566595089 initial import
mandel
parents:
diff changeset
1503 token_stream[(int) index++].kind = Token_Q_ENUMS;
e78566595089 initial import
mandel
parents:
diff changeset
1504 return;
e78566595089 initial import
mandel
parents:
diff changeset
1505 }
e78566595089 initial import
mandel
parents:
diff changeset
1506 break;
e78566595089 initial import
mandel
parents:
diff changeset
1507
e78566595089 initial import
mandel
parents:
diff changeset
1508 }
e78566595089 initial import
mandel
parents:
diff changeset
1509 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1510 }
e78566595089 initial import
mandel
parents:
diff changeset
1511
e78566595089 initial import
mandel
parents:
diff changeset
1512 void Lexer::scanKeyword8()
e78566595089 initial import
mandel
parents:
diff changeset
1513 {
e78566595089 initial import
mandel
parents:
diff changeset
1514 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1515 {
e78566595089 initial import
mandel
parents:
diff changeset
1516 case '_':
e78566595089 initial import
mandel
parents:
diff changeset
1517 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1518 *(cursor + 2) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1519 *(cursor + 3) == 'y' &&
e78566595089 initial import
mandel
parents:
diff changeset
1520 *(cursor + 4) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1521 *(cursor + 5) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1522 *(cursor + 6) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1523 *(cursor + 7) == 'f')
e78566595089 initial import
mandel
parents:
diff changeset
1524 {
e78566595089 initial import
mandel
parents:
diff changeset
1525 token_stream[(int) index++].kind = Token___typeof;
e78566595089 initial import
mandel
parents:
diff changeset
1526 return;
e78566595089 initial import
mandel
parents:
diff changeset
1527 }
e78566595089 initial import
mandel
parents:
diff changeset
1528 break;
e78566595089 initial import
mandel
parents:
diff changeset
1529
e78566595089 initial import
mandel
parents:
diff changeset
1530 case 'c':
e78566595089 initial import
mandel
parents:
diff changeset
1531 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1532 *(cursor + 2) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1533 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1534 *(cursor + 4) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1535 *(cursor + 5) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1536 *(cursor + 6) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1537 *(cursor + 7) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1538 {
e78566595089 initial import
mandel
parents:
diff changeset
1539 token_stream[(int) index++].kind = Token_continue;
e78566595089 initial import
mandel
parents:
diff changeset
1540 return;
e78566595089 initial import
mandel
parents:
diff changeset
1541 }
e78566595089 initial import
mandel
parents:
diff changeset
1542 break;
e78566595089 initial import
mandel
parents:
diff changeset
1543
e78566595089 initial import
mandel
parents:
diff changeset
1544 case 'e':
e78566595089 initial import
mandel
parents:
diff changeset
1545 if (*(cursor + 1) == 'x' &&
e78566595089 initial import
mandel
parents:
diff changeset
1546 *(cursor + 2) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1547 *(cursor + 3) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1548 *(cursor + 4) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1549 *(cursor + 5) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1550 *(cursor + 6) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1551 *(cursor + 7) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1552 {
e78566595089 initial import
mandel
parents:
diff changeset
1553 token_stream[(int) index++].kind = Token_explicit;
e78566595089 initial import
mandel
parents:
diff changeset
1554 return;
e78566595089 initial import
mandel
parents:
diff changeset
1555 }
e78566595089 initial import
mandel
parents:
diff changeset
1556 break;
e78566595089 initial import
mandel
parents:
diff changeset
1557
e78566595089 initial import
mandel
parents:
diff changeset
1558 case 'o':
e78566595089 initial import
mandel
parents:
diff changeset
1559 if (*(cursor + 1) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1560 *(cursor + 2) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1561 *(cursor + 3) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1562 *(cursor + 4) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1563 *(cursor + 5) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1564 *(cursor + 6) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1565 *(cursor + 7) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
1566 {
e78566595089 initial import
mandel
parents:
diff changeset
1567 token_stream[(int) index++].kind = Token_operator;
e78566595089 initial import
mandel
parents:
diff changeset
1568 return;
e78566595089 initial import
mandel
parents:
diff changeset
1569 }
e78566595089 initial import
mandel
parents:
diff changeset
1570 break;
e78566595089 initial import
mandel
parents:
diff changeset
1571
e78566595089 initial import
mandel
parents:
diff changeset
1572 case 'Q':
e78566595089 initial import
mandel
parents:
diff changeset
1573 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1574 *(cursor + 2) == 'O' &&
e78566595089 initial import
mandel
parents:
diff changeset
1575 *(cursor + 3) == 'B' &&
e78566595089 initial import
mandel
parents:
diff changeset
1576 *(cursor + 4) == 'J' &&
e78566595089 initial import
mandel
parents:
diff changeset
1577 *(cursor + 5) == 'E' &&
e78566595089 initial import
mandel
parents:
diff changeset
1578 *(cursor + 6) == 'C' &&
e78566595089 initial import
mandel
parents:
diff changeset
1579 *(cursor + 7) == 'T')
e78566595089 initial import
mandel
parents:
diff changeset
1580 {
e78566595089 initial import
mandel
parents:
diff changeset
1581 token_stream[(int) index++].kind = Token_Q_OBJECT;
e78566595089 initial import
mandel
parents:
diff changeset
1582 return;
e78566595089 initial import
mandel
parents:
diff changeset
1583 }
e78566595089 initial import
mandel
parents:
diff changeset
1584 break;
e78566595089 initial import
mandel
parents:
diff changeset
1585
e78566595089 initial import
mandel
parents:
diff changeset
1586 case 'r':
e78566595089 initial import
mandel
parents:
diff changeset
1587 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1588 *(cursor + 2) == 'g' &&
e78566595089 initial import
mandel
parents:
diff changeset
1589 *(cursor + 3) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1590 *(cursor + 4) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1591 *(cursor + 5) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1592 *(cursor + 6) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1593 *(cursor + 7) == 'r')
e78566595089 initial import
mandel
parents:
diff changeset
1594 {
e78566595089 initial import
mandel
parents:
diff changeset
1595 token_stream[(int) index++].kind = Token_register;
e78566595089 initial import
mandel
parents:
diff changeset
1596 return;
e78566595089 initial import
mandel
parents:
diff changeset
1597 }
e78566595089 initial import
mandel
parents:
diff changeset
1598 break;
e78566595089 initial import
mandel
parents:
diff changeset
1599
e78566595089 initial import
mandel
parents:
diff changeset
1600 case 'u':
e78566595089 initial import
mandel
parents:
diff changeset
1601 if (*(cursor + 1) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1602 *(cursor + 2) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1603 *(cursor + 3) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1604 *(cursor + 4) == 'g' &&
e78566595089 initial import
mandel
parents:
diff changeset
1605 *(cursor + 5) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1606 *(cursor + 6) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1607 *(cursor + 7) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1608 {
e78566595089 initial import
mandel
parents:
diff changeset
1609 token_stream[(int) index++].kind = Token_unsigned;
e78566595089 initial import
mandel
parents:
diff changeset
1610 return;
e78566595089 initial import
mandel
parents:
diff changeset
1611 }
e78566595089 initial import
mandel
parents:
diff changeset
1612 break;
e78566595089 initial import
mandel
parents:
diff changeset
1613
e78566595089 initial import
mandel
parents:
diff changeset
1614 case 't':
e78566595089 initial import
mandel
parents:
diff changeset
1615 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1616 *(cursor + 2) == 'm' &&
e78566595089 initial import
mandel
parents:
diff changeset
1617 *(cursor + 3) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1618 *(cursor + 4) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1619 *(cursor + 5) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1620 *(cursor + 6) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1621 *(cursor + 7) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1622 {
e78566595089 initial import
mandel
parents:
diff changeset
1623 token_stream[(int) index++].kind = Token_template;
e78566595089 initial import
mandel
parents:
diff changeset
1624 return;
e78566595089 initial import
mandel
parents:
diff changeset
1625 }
e78566595089 initial import
mandel
parents:
diff changeset
1626 if (*(cursor + 1) == 'y' &&
e78566595089 initial import
mandel
parents:
diff changeset
1627 *(cursor + 2) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1628 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1629 *(cursor + 4) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1630 *(cursor + 5) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1631 *(cursor + 6) == 'm' &&
e78566595089 initial import
mandel
parents:
diff changeset
1632 *(cursor + 7) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1633 {
e78566595089 initial import
mandel
parents:
diff changeset
1634 token_stream[(int) index++].kind = Token_typename;
e78566595089 initial import
mandel
parents:
diff changeset
1635 return;
e78566595089 initial import
mandel
parents:
diff changeset
1636 }
e78566595089 initial import
mandel
parents:
diff changeset
1637 break;
e78566595089 initial import
mandel
parents:
diff changeset
1638
e78566595089 initial import
mandel
parents:
diff changeset
1639 case 'v':
e78566595089 initial import
mandel
parents:
diff changeset
1640 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1641 *(cursor + 2) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1642 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1643 *(cursor + 4) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1644 *(cursor + 5) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1645 *(cursor + 6) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1646 *(cursor + 7) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1647 {
e78566595089 initial import
mandel
parents:
diff changeset
1648 token_stream[(int) index++].kind = Token_volatile;
e78566595089 initial import
mandel
parents:
diff changeset
1649 return;
e78566595089 initial import
mandel
parents:
diff changeset
1650 }
e78566595089 initial import
mandel
parents:
diff changeset
1651 break;
e78566595089 initial import
mandel
parents:
diff changeset
1652
e78566595089 initial import
mandel
parents:
diff changeset
1653 }
e78566595089 initial import
mandel
parents:
diff changeset
1654 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1655 }
e78566595089 initial import
mandel
parents:
diff changeset
1656
e78566595089 initial import
mandel
parents:
diff changeset
1657 void Lexer::scanKeyword9()
e78566595089 initial import
mandel
parents:
diff changeset
1658 {
e78566595089 initial import
mandel
parents:
diff changeset
1659 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1660 {
e78566595089 initial import
mandel
parents:
diff changeset
1661 case 'p':
e78566595089 initial import
mandel
parents:
diff changeset
1662 if (*(cursor + 1) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1663 *(cursor + 2) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1664 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1665 *(cursor + 4) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1666 *(cursor + 5) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1667 *(cursor + 6) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1668 *(cursor + 7) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1669 *(cursor + 8) == 'd')
e78566595089 initial import
mandel
parents:
diff changeset
1670 {
e78566595089 initial import
mandel
parents:
diff changeset
1671 token_stream[(int) index++].kind = Token_protected;
e78566595089 initial import
mandel
parents:
diff changeset
1672 return;
e78566595089 initial import
mandel
parents:
diff changeset
1673 }
e78566595089 initial import
mandel
parents:
diff changeset
1674 break;
e78566595089 initial import
mandel
parents:
diff changeset
1675
e78566595089 initial import
mandel
parents:
diff changeset
1676 case 'n':
e78566595089 initial import
mandel
parents:
diff changeset
1677 if (*(cursor + 1) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1678 *(cursor + 2) == 'm' &&
e78566595089 initial import
mandel
parents:
diff changeset
1679 *(cursor + 3) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1680 *(cursor + 4) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1681 *(cursor + 5) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1682 *(cursor + 6) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1683 *(cursor + 7) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1684 *(cursor + 8) == 'e')
e78566595089 initial import
mandel
parents:
diff changeset
1685 {
e78566595089 initial import
mandel
parents:
diff changeset
1686 token_stream[(int) index++].kind = Token_namespace;
e78566595089 initial import
mandel
parents:
diff changeset
1687 return;
e78566595089 initial import
mandel
parents:
diff changeset
1688 }
e78566595089 initial import
mandel
parents:
diff changeset
1689 break;
e78566595089 initial import
mandel
parents:
diff changeset
1690
e78566595089 initial import
mandel
parents:
diff changeset
1691 }
e78566595089 initial import
mandel
parents:
diff changeset
1692 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1693 }
e78566595089 initial import
mandel
parents:
diff changeset
1694
e78566595089 initial import
mandel
parents:
diff changeset
1695 void Lexer::scanKeyword10()
e78566595089 initial import
mandel
parents:
diff changeset
1696 {
e78566595089 initial import
mandel
parents:
diff changeset
1697 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1698 {
e78566595089 initial import
mandel
parents:
diff changeset
1699 case 'c':
e78566595089 initial import
mandel
parents:
diff changeset
1700 if (*(cursor + 1) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1701 *(cursor + 2) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1702 *(cursor + 3) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1703 *(cursor + 4) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1704 *(cursor + 5) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1705 *(cursor + 6) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1706 *(cursor + 7) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1707 *(cursor + 8) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1708 *(cursor + 9) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1709 {
e78566595089 initial import
mandel
parents:
diff changeset
1710 token_stream[(int) index++].kind = Token_const_cast;
e78566595089 initial import
mandel
parents:
diff changeset
1711 return;
e78566595089 initial import
mandel
parents:
diff changeset
1712 }
e78566595089 initial import
mandel
parents:
diff changeset
1713 break;
e78566595089 initial import
mandel
parents:
diff changeset
1714
e78566595089 initial import
mandel
parents:
diff changeset
1715 case 'Q':
e78566595089 initial import
mandel
parents:
diff changeset
1716 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1717 *(cursor + 2) == 'P' &&
e78566595089 initial import
mandel
parents:
diff changeset
1718 *(cursor + 3) == 'R' &&
e78566595089 initial import
mandel
parents:
diff changeset
1719 *(cursor + 4) == 'O' &&
e78566595089 initial import
mandel
parents:
diff changeset
1720 *(cursor + 5) == 'P' &&
e78566595089 initial import
mandel
parents:
diff changeset
1721 *(cursor + 6) == 'E' &&
e78566595089 initial import
mandel
parents:
diff changeset
1722 *(cursor + 7) == 'R' &&
e78566595089 initial import
mandel
parents:
diff changeset
1723 *(cursor + 8) == 'T' &&
e78566595089 initial import
mandel
parents:
diff changeset
1724 *(cursor + 9) == 'Y')
e78566595089 initial import
mandel
parents:
diff changeset
1725 {
e78566595089 initial import
mandel
parents:
diff changeset
1726 token_stream[(int) index++].kind = Token_Q_PROPERTY;
e78566595089 initial import
mandel
parents:
diff changeset
1727 return;
e78566595089 initial import
mandel
parents:
diff changeset
1728 }
e78566595089 initial import
mandel
parents:
diff changeset
1729
e78566595089 initial import
mandel
parents:
diff changeset
1730 break;
e78566595089 initial import
mandel
parents:
diff changeset
1731 }
e78566595089 initial import
mandel
parents:
diff changeset
1732
e78566595089 initial import
mandel
parents:
diff changeset
1733 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1734 }
e78566595089 initial import
mandel
parents:
diff changeset
1735
e78566595089 initial import
mandel
parents:
diff changeset
1736 void Lexer::scanKeyword11()
e78566595089 initial import
mandel
parents:
diff changeset
1737 {
e78566595089 initial import
mandel
parents:
diff changeset
1738 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1739 {
e78566595089 initial import
mandel
parents:
diff changeset
1740 case 'Q':
e78566595089 initial import
mandel
parents:
diff changeset
1741 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1742 *(cursor + 2) == 'I' &&
e78566595089 initial import
mandel
parents:
diff changeset
1743 *(cursor + 3) == 'N' &&
e78566595089 initial import
mandel
parents:
diff changeset
1744 *(cursor + 4) == 'V' &&
e78566595089 initial import
mandel
parents:
diff changeset
1745 *(cursor + 5) == 'O' &&
e78566595089 initial import
mandel
parents:
diff changeset
1746 *(cursor + 6) == 'K' &&
e78566595089 initial import
mandel
parents:
diff changeset
1747 *(cursor + 7) == 'A' &&
e78566595089 initial import
mandel
parents:
diff changeset
1748 *(cursor + 8) == 'B' &&
e78566595089 initial import
mandel
parents:
diff changeset
1749 *(cursor + 9) == 'L' &&
e78566595089 initial import
mandel
parents:
diff changeset
1750 *(cursor + 10) == 'E')
e78566595089 initial import
mandel
parents:
diff changeset
1751 {
e78566595089 initial import
mandel
parents:
diff changeset
1752 token_stream[(int) index++].kind = Token_Q_INVOKABLE;
e78566595089 initial import
mandel
parents:
diff changeset
1753 return;
e78566595089 initial import
mandel
parents:
diff changeset
1754 }
e78566595089 initial import
mandel
parents:
diff changeset
1755 break;
e78566595089 initial import
mandel
parents:
diff changeset
1756
e78566595089 initial import
mandel
parents:
diff changeset
1757 case 's':
e78566595089 initial import
mandel
parents:
diff changeset
1758 if (*(cursor + 1) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1759 *(cursor + 2) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1760 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1761 *(cursor + 4) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1762 *(cursor + 5) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1763 *(cursor + 6) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1764 *(cursor + 7) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1765 *(cursor + 8) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1766 *(cursor + 9) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1767 *(cursor + 10) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1768 {
e78566595089 initial import
mandel
parents:
diff changeset
1769 token_stream[(int) index++].kind = Token_static_cast;
e78566595089 initial import
mandel
parents:
diff changeset
1770 return;
e78566595089 initial import
mandel
parents:
diff changeset
1771 }
e78566595089 initial import
mandel
parents:
diff changeset
1772 break;
e78566595089 initial import
mandel
parents:
diff changeset
1773
e78566595089 initial import
mandel
parents:
diff changeset
1774 }
e78566595089 initial import
mandel
parents:
diff changeset
1775 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1776 }
e78566595089 initial import
mandel
parents:
diff changeset
1777
e78566595089 initial import
mandel
parents:
diff changeset
1778 void Lexer::scanKeyword12()
e78566595089 initial import
mandel
parents:
diff changeset
1779 {
e78566595089 initial import
mandel
parents:
diff changeset
1780 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1781 {
e78566595089 initial import
mandel
parents:
diff changeset
1782 case 'd':
e78566595089 initial import
mandel
parents:
diff changeset
1783 if (*(cursor + 1) == 'y' &&
e78566595089 initial import
mandel
parents:
diff changeset
1784 *(cursor + 2) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1785 *(cursor + 3) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1786 *(cursor + 4) == 'm' &&
e78566595089 initial import
mandel
parents:
diff changeset
1787 *(cursor + 5) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1788 *(cursor + 6) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1789 *(cursor + 7) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1790 *(cursor + 8) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1791 *(cursor + 9) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1792 *(cursor + 10) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1793 *(cursor + 11) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1794 {
e78566595089 initial import
mandel
parents:
diff changeset
1795 token_stream[(int) index++].kind = Token_dynamic_cast;
e78566595089 initial import
mandel
parents:
diff changeset
1796 return;
e78566595089 initial import
mandel
parents:
diff changeset
1797 }
e78566595089 initial import
mandel
parents:
diff changeset
1798 break;
e78566595089 initial import
mandel
parents:
diff changeset
1799
e78566595089 initial import
mandel
parents:
diff changeset
1800 }
e78566595089 initial import
mandel
parents:
diff changeset
1801 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1802 }
e78566595089 initial import
mandel
parents:
diff changeset
1803
e78566595089 initial import
mandel
parents:
diff changeset
1804 void Lexer::scanKeyword13()
e78566595089 initial import
mandel
parents:
diff changeset
1805 {
e78566595089 initial import
mandel
parents:
diff changeset
1806 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1807 {
e78566595089 initial import
mandel
parents:
diff changeset
1808 case '_':
e78566595089 initial import
mandel
parents:
diff changeset
1809 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1810 *(cursor + 2) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1811 *(cursor + 3) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1812 *(cursor + 4) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1813 *(cursor + 5) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1814 *(cursor + 6) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1815 *(cursor + 7) == 'b' &&
e78566595089 initial import
mandel
parents:
diff changeset
1816 *(cursor + 8) == 'u' &&
e78566595089 initial import
mandel
parents:
diff changeset
1817 *(cursor + 9) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1818 *(cursor + 10) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1819 *(cursor + 11) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1820 *(cursor + 12) == '_')
e78566595089 initial import
mandel
parents:
diff changeset
1821 {
e78566595089 initial import
mandel
parents:
diff changeset
1822 token_stream[(int) index++].kind = Token___attribute__;
e78566595089 initial import
mandel
parents:
diff changeset
1823 return;
e78566595089 initial import
mandel
parents:
diff changeset
1824 }
e78566595089 initial import
mandel
parents:
diff changeset
1825 break;
e78566595089 initial import
mandel
parents:
diff changeset
1826 }
e78566595089 initial import
mandel
parents:
diff changeset
1827 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1828 }
e78566595089 initial import
mandel
parents:
diff changeset
1829
e78566595089 initial import
mandel
parents:
diff changeset
1830 void Lexer::scanKeyword14()
e78566595089 initial import
mandel
parents:
diff changeset
1831 {
e78566595089 initial import
mandel
parents:
diff changeset
1832 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1833 {
e78566595089 initial import
mandel
parents:
diff changeset
1834 case 'k':
e78566595089 initial import
mandel
parents:
diff changeset
1835 if (*(cursor + 1) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1836 *(cursor + 2) == 'd' &&
e78566595089 initial import
mandel
parents:
diff changeset
1837 *(cursor + 3) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1838 *(cursor + 4) == 'o' &&
e78566595089 initial import
mandel
parents:
diff changeset
1839 *(cursor + 5) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1840 *(cursor + 6) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1841 *(cursor + 7) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1842 *(cursor + 8) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1843 *(cursor + 9) == 'g' &&
e78566595089 initial import
mandel
parents:
diff changeset
1844 *(cursor + 10) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1845 *(cursor + 11) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1846 *(cursor + 12) == 'l' &&
e78566595089 initial import
mandel
parents:
diff changeset
1847 *(cursor + 13) == 's')
e78566595089 initial import
mandel
parents:
diff changeset
1848 {
e78566595089 initial import
mandel
parents:
diff changeset
1849 token_stream[(int) index++].kind = Token_k_dcop_signals;
e78566595089 initial import
mandel
parents:
diff changeset
1850 return;
e78566595089 initial import
mandel
parents:
diff changeset
1851 }
e78566595089 initial import
mandel
parents:
diff changeset
1852 break;
e78566595089 initial import
mandel
parents:
diff changeset
1853 }
e78566595089 initial import
mandel
parents:
diff changeset
1854 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1855 }
e78566595089 initial import
mandel
parents:
diff changeset
1856
e78566595089 initial import
mandel
parents:
diff changeset
1857 void Lexer::scanKeyword16()
e78566595089 initial import
mandel
parents:
diff changeset
1858 {
e78566595089 initial import
mandel
parents:
diff changeset
1859 switch (*cursor)
e78566595089 initial import
mandel
parents:
diff changeset
1860 {
e78566595089 initial import
mandel
parents:
diff changeset
1861 case 'r':
e78566595089 initial import
mandel
parents:
diff changeset
1862 if (*(cursor + 1) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1863 *(cursor + 2) == 'i' &&
e78566595089 initial import
mandel
parents:
diff changeset
1864 *(cursor + 3) == 'n' &&
e78566595089 initial import
mandel
parents:
diff changeset
1865 *(cursor + 4) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1866 *(cursor + 5) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1867 *(cursor + 6) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1868 *(cursor + 7) == 'p' &&
e78566595089 initial import
mandel
parents:
diff changeset
1869 *(cursor + 8) == 'r' &&
e78566595089 initial import
mandel
parents:
diff changeset
1870 *(cursor + 9) == 'e' &&
e78566595089 initial import
mandel
parents:
diff changeset
1871 *(cursor + 10) == 't' &&
e78566595089 initial import
mandel
parents:
diff changeset
1872 *(cursor + 11) == '_' &&
e78566595089 initial import
mandel
parents:
diff changeset
1873 *(cursor + 12) == 'c' &&
e78566595089 initial import
mandel
parents:
diff changeset
1874 *(cursor + 13) == 'a' &&
e78566595089 initial import
mandel
parents:
diff changeset
1875 *(cursor + 14) == 's' &&
e78566595089 initial import
mandel
parents:
diff changeset
1876 *(cursor + 15) == 't')
e78566595089 initial import
mandel
parents:
diff changeset
1877 {
e78566595089 initial import
mandel
parents:
diff changeset
1878 token_stream[(int) index++].kind = Token_reinterpret_cast;
e78566595089 initial import
mandel
parents:
diff changeset
1879 return;
e78566595089 initial import
mandel
parents:
diff changeset
1880 }
e78566595089 initial import
mandel
parents:
diff changeset
1881 break;
e78566595089 initial import
mandel
parents:
diff changeset
1882 }
e78566595089 initial import
mandel
parents:
diff changeset
1883
e78566595089 initial import
mandel
parents:
diff changeset
1884 token_stream[(int) index++].kind = Token_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
1885 }
e78566595089 initial import
mandel
parents:
diff changeset
1886
e78566595089 initial import
mandel
parents:
diff changeset
1887 // kate: space-indent on; indent-width 2; replace-tabs on;