annotate generator/parser/rpp/pp-scanner.h @ 52:09a0f1d048f2

update parser to that from jambi 4.5, attemt to fix building with gcc 4.4
author eldar
date Mon, 18 May 2009 15:23:28 +0000
parents e78566595089
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 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 #ifndef PP_SCANNER_H
e78566595089 initial import
mandel
parents:
diff changeset
45 #define PP_SCANNER_H
e78566595089 initial import
mandel
parents:
diff changeset
46
e78566595089 initial import
mandel
parents:
diff changeset
47 namespace rpp {
e78566595089 initial import
mandel
parents:
diff changeset
48
e78566595089 initial import
mandel
parents:
diff changeset
49 struct pp_skip_blanks
e78566595089 initial import
mandel
parents:
diff changeset
50 {
e78566595089 initial import
mandel
parents:
diff changeset
51 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
52
e78566595089 initial import
mandel
parents:
diff changeset
53 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
54 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
55 {
e78566595089 initial import
mandel
parents:
diff changeset
56 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
57
e78566595089 initial import
mandel
parents:
diff changeset
58 for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
59 {
e78566595089 initial import
mandel
parents:
diff changeset
60 if (*__first == '\\')
e78566595089 initial import
mandel
parents:
diff changeset
61 {
e78566595089 initial import
mandel
parents:
diff changeset
62 _InputIterator __begin = __first;
e78566595089 initial import
mandel
parents:
diff changeset
63 ++__begin;
e78566595089 initial import
mandel
parents:
diff changeset
64
e78566595089 initial import
mandel
parents:
diff changeset
65 if (__begin != __last && *__begin == '\n')
e78566595089 initial import
mandel
parents:
diff changeset
66 ++__first;
e78566595089 initial import
mandel
parents:
diff changeset
67 else
e78566595089 initial import
mandel
parents:
diff changeset
68 break;
e78566595089 initial import
mandel
parents:
diff changeset
69 }
e78566595089 initial import
mandel
parents:
diff changeset
70 else if (*__first == '\n' || !pp_isspace (*__first))
e78566595089 initial import
mandel
parents:
diff changeset
71 break;
e78566595089 initial import
mandel
parents:
diff changeset
72 }
e78566595089 initial import
mandel
parents:
diff changeset
73
e78566595089 initial import
mandel
parents:
diff changeset
74 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
75 }
e78566595089 initial import
mandel
parents:
diff changeset
76 };
e78566595089 initial import
mandel
parents:
diff changeset
77
e78566595089 initial import
mandel
parents:
diff changeset
78 struct pp_skip_whitespaces
e78566595089 initial import
mandel
parents:
diff changeset
79 {
e78566595089 initial import
mandel
parents:
diff changeset
80 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
81
e78566595089 initial import
mandel
parents:
diff changeset
82 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
83 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
84 {
e78566595089 initial import
mandel
parents:
diff changeset
85 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
86
e78566595089 initial import
mandel
parents:
diff changeset
87 for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
88 {
e78566595089 initial import
mandel
parents:
diff changeset
89 if (! pp_isspace (*__first))
e78566595089 initial import
mandel
parents:
diff changeset
90 break;
e78566595089 initial import
mandel
parents:
diff changeset
91 }
e78566595089 initial import
mandel
parents:
diff changeset
92
e78566595089 initial import
mandel
parents:
diff changeset
93 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
94 }
e78566595089 initial import
mandel
parents:
diff changeset
95 };
e78566595089 initial import
mandel
parents:
diff changeset
96
e78566595089 initial import
mandel
parents:
diff changeset
97 struct pp_skip_comment_or_divop
e78566595089 initial import
mandel
parents:
diff changeset
98 {
e78566595089 initial import
mandel
parents:
diff changeset
99 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
100
e78566595089 initial import
mandel
parents:
diff changeset
101 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
102 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
103 {
e78566595089 initial import
mandel
parents:
diff changeset
104 enum {
e78566595089 initial import
mandel
parents:
diff changeset
105 MAYBE_BEGIN,
e78566595089 initial import
mandel
parents:
diff changeset
106 BEGIN,
e78566595089 initial import
mandel
parents:
diff changeset
107 MAYBE_END,
e78566595089 initial import
mandel
parents:
diff changeset
108 END,
e78566595089 initial import
mandel
parents:
diff changeset
109 IN_COMMENT,
e78566595089 initial import
mandel
parents:
diff changeset
110 IN_CXX_COMMENT
e78566595089 initial import
mandel
parents:
diff changeset
111 } state (MAYBE_BEGIN);
e78566595089 initial import
mandel
parents:
diff changeset
112
e78566595089 initial import
mandel
parents:
diff changeset
113 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
114
e78566595089 initial import
mandel
parents:
diff changeset
115 for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
116 {
e78566595089 initial import
mandel
parents:
diff changeset
117 switch (state)
e78566595089 initial import
mandel
parents:
diff changeset
118 {
e78566595089 initial import
mandel
parents:
diff changeset
119 default:
e78566595089 initial import
mandel
parents:
diff changeset
120 assert (0);
e78566595089 initial import
mandel
parents:
diff changeset
121 break;
e78566595089 initial import
mandel
parents:
diff changeset
122
e78566595089 initial import
mandel
parents:
diff changeset
123 case MAYBE_BEGIN:
e78566595089 initial import
mandel
parents:
diff changeset
124 if (*__first != '/')
e78566595089 initial import
mandel
parents:
diff changeset
125 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
126
e78566595089 initial import
mandel
parents:
diff changeset
127 state = BEGIN;
e78566595089 initial import
mandel
parents:
diff changeset
128 break;
e78566595089 initial import
mandel
parents:
diff changeset
129
e78566595089 initial import
mandel
parents:
diff changeset
130 case BEGIN:
e78566595089 initial import
mandel
parents:
diff changeset
131 if (*__first == '*')
e78566595089 initial import
mandel
parents:
diff changeset
132 state = IN_COMMENT;
e78566595089 initial import
mandel
parents:
diff changeset
133 else if (*__first == '/')
e78566595089 initial import
mandel
parents:
diff changeset
134 state = IN_CXX_COMMENT;
e78566595089 initial import
mandel
parents:
diff changeset
135 else
e78566595089 initial import
mandel
parents:
diff changeset
136 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
137 break;
e78566595089 initial import
mandel
parents:
diff changeset
138
e78566595089 initial import
mandel
parents:
diff changeset
139 case IN_COMMENT:
e78566595089 initial import
mandel
parents:
diff changeset
140 if (*__first == '*')
e78566595089 initial import
mandel
parents:
diff changeset
141 state = MAYBE_END;
e78566595089 initial import
mandel
parents:
diff changeset
142 break;
e78566595089 initial import
mandel
parents:
diff changeset
143
e78566595089 initial import
mandel
parents:
diff changeset
144 case IN_CXX_COMMENT:
e78566595089 initial import
mandel
parents:
diff changeset
145 if (*__first == '\n')
e78566595089 initial import
mandel
parents:
diff changeset
146 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
147 break;
e78566595089 initial import
mandel
parents:
diff changeset
148
e78566595089 initial import
mandel
parents:
diff changeset
149 case MAYBE_END:
e78566595089 initial import
mandel
parents:
diff changeset
150 if (*__first == '/')
e78566595089 initial import
mandel
parents:
diff changeset
151 state = END;
e78566595089 initial import
mandel
parents:
diff changeset
152 else if (*__first != '*')
e78566595089 initial import
mandel
parents:
diff changeset
153 state = IN_COMMENT;
e78566595089 initial import
mandel
parents:
diff changeset
154 break;
e78566595089 initial import
mandel
parents:
diff changeset
155
e78566595089 initial import
mandel
parents:
diff changeset
156 case END:
e78566595089 initial import
mandel
parents:
diff changeset
157 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
158 }
e78566595089 initial import
mandel
parents:
diff changeset
159 }
e78566595089 initial import
mandel
parents:
diff changeset
160
e78566595089 initial import
mandel
parents:
diff changeset
161 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
162 }
e78566595089 initial import
mandel
parents:
diff changeset
163 };
e78566595089 initial import
mandel
parents:
diff changeset
164
e78566595089 initial import
mandel
parents:
diff changeset
165 struct pp_skip_identifier
e78566595089 initial import
mandel
parents:
diff changeset
166 {
e78566595089 initial import
mandel
parents:
diff changeset
167 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
168
e78566595089 initial import
mandel
parents:
diff changeset
169 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
170 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
171 {
e78566595089 initial import
mandel
parents:
diff changeset
172 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
173
e78566595089 initial import
mandel
parents:
diff changeset
174 for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
175 {
e78566595089 initial import
mandel
parents:
diff changeset
176 if (! pp_isalnum (*__first) && *__first != '_')
e78566595089 initial import
mandel
parents:
diff changeset
177 break;
e78566595089 initial import
mandel
parents:
diff changeset
178 }
e78566595089 initial import
mandel
parents:
diff changeset
179
e78566595089 initial import
mandel
parents:
diff changeset
180 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
181 }
e78566595089 initial import
mandel
parents:
diff changeset
182 };
e78566595089 initial import
mandel
parents:
diff changeset
183
e78566595089 initial import
mandel
parents:
diff changeset
184 struct pp_skip_number
e78566595089 initial import
mandel
parents:
diff changeset
185 {
e78566595089 initial import
mandel
parents:
diff changeset
186 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
187
e78566595089 initial import
mandel
parents:
diff changeset
188 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
189 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
190 {
e78566595089 initial import
mandel
parents:
diff changeset
191 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
192
e78566595089 initial import
mandel
parents:
diff changeset
193 for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
194 {
e78566595089 initial import
mandel
parents:
diff changeset
195 if (! pp_isalnum (*__first) && *__first != '.')
e78566595089 initial import
mandel
parents:
diff changeset
196 break;
e78566595089 initial import
mandel
parents:
diff changeset
197 }
e78566595089 initial import
mandel
parents:
diff changeset
198
e78566595089 initial import
mandel
parents:
diff changeset
199 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
200 }
e78566595089 initial import
mandel
parents:
diff changeset
201 };
e78566595089 initial import
mandel
parents:
diff changeset
202
e78566595089 initial import
mandel
parents:
diff changeset
203 struct pp_skip_string_literal
e78566595089 initial import
mandel
parents:
diff changeset
204 {
e78566595089 initial import
mandel
parents:
diff changeset
205 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
206
e78566595089 initial import
mandel
parents:
diff changeset
207 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
208 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
209 {
e78566595089 initial import
mandel
parents:
diff changeset
210 enum {
e78566595089 initial import
mandel
parents:
diff changeset
211 BEGIN,
e78566595089 initial import
mandel
parents:
diff changeset
212 IN_STRING,
e78566595089 initial import
mandel
parents:
diff changeset
213 QUOTE,
e78566595089 initial import
mandel
parents:
diff changeset
214 END
e78566595089 initial import
mandel
parents:
diff changeset
215 } state (BEGIN);
e78566595089 initial import
mandel
parents:
diff changeset
216
e78566595089 initial import
mandel
parents:
diff changeset
217 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
218
e78566595089 initial import
mandel
parents:
diff changeset
219 for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
220 {
e78566595089 initial import
mandel
parents:
diff changeset
221 switch (state)
e78566595089 initial import
mandel
parents:
diff changeset
222 {
e78566595089 initial import
mandel
parents:
diff changeset
223 default:
e78566595089 initial import
mandel
parents:
diff changeset
224 assert (0);
e78566595089 initial import
mandel
parents:
diff changeset
225 break;
e78566595089 initial import
mandel
parents:
diff changeset
226
e78566595089 initial import
mandel
parents:
diff changeset
227 case BEGIN:
e78566595089 initial import
mandel
parents:
diff changeset
228 if (*__first != '\"')
e78566595089 initial import
mandel
parents:
diff changeset
229 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
230 state = IN_STRING;
e78566595089 initial import
mandel
parents:
diff changeset
231 break;
e78566595089 initial import
mandel
parents:
diff changeset
232
e78566595089 initial import
mandel
parents:
diff changeset
233 case IN_STRING:
e78566595089 initial import
mandel
parents:
diff changeset
234 assert (*__first != '\n');
e78566595089 initial import
mandel
parents:
diff changeset
235
e78566595089 initial import
mandel
parents:
diff changeset
236 if (*__first == '\"')
e78566595089 initial import
mandel
parents:
diff changeset
237 state = END;
e78566595089 initial import
mandel
parents:
diff changeset
238 else if (*__first == '\\')
e78566595089 initial import
mandel
parents:
diff changeset
239 state = QUOTE;
e78566595089 initial import
mandel
parents:
diff changeset
240 break;
e78566595089 initial import
mandel
parents:
diff changeset
241
e78566595089 initial import
mandel
parents:
diff changeset
242 case QUOTE:
e78566595089 initial import
mandel
parents:
diff changeset
243 state = IN_STRING;
e78566595089 initial import
mandel
parents:
diff changeset
244 break;
e78566595089 initial import
mandel
parents:
diff changeset
245
e78566595089 initial import
mandel
parents:
diff changeset
246 case END:
e78566595089 initial import
mandel
parents:
diff changeset
247 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
248 }
e78566595089 initial import
mandel
parents:
diff changeset
249 }
e78566595089 initial import
mandel
parents:
diff changeset
250
e78566595089 initial import
mandel
parents:
diff changeset
251 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
252 }
e78566595089 initial import
mandel
parents:
diff changeset
253 };
e78566595089 initial import
mandel
parents:
diff changeset
254
e78566595089 initial import
mandel
parents:
diff changeset
255 struct pp_skip_char_literal
e78566595089 initial import
mandel
parents:
diff changeset
256 {
e78566595089 initial import
mandel
parents:
diff changeset
257 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
258
e78566595089 initial import
mandel
parents:
diff changeset
259 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
260 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
261 {
e78566595089 initial import
mandel
parents:
diff changeset
262 enum {
e78566595089 initial import
mandel
parents:
diff changeset
263 BEGIN,
e78566595089 initial import
mandel
parents:
diff changeset
264 IN_STRING,
e78566595089 initial import
mandel
parents:
diff changeset
265 QUOTE,
e78566595089 initial import
mandel
parents:
diff changeset
266 END
e78566595089 initial import
mandel
parents:
diff changeset
267 } state (BEGIN);
e78566595089 initial import
mandel
parents:
diff changeset
268
e78566595089 initial import
mandel
parents:
diff changeset
269 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
270
e78566595089 initial import
mandel
parents:
diff changeset
271 for (; state != END && __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
e78566595089 initial import
mandel
parents:
diff changeset
272 {
e78566595089 initial import
mandel
parents:
diff changeset
273 switch (state)
e78566595089 initial import
mandel
parents:
diff changeset
274 {
e78566595089 initial import
mandel
parents:
diff changeset
275 default:
e78566595089 initial import
mandel
parents:
diff changeset
276 assert (0);
e78566595089 initial import
mandel
parents:
diff changeset
277 break;
e78566595089 initial import
mandel
parents:
diff changeset
278
e78566595089 initial import
mandel
parents:
diff changeset
279 case BEGIN:
e78566595089 initial import
mandel
parents:
diff changeset
280 if (*__first != '\'')
e78566595089 initial import
mandel
parents:
diff changeset
281 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
282 state = IN_STRING;
e78566595089 initial import
mandel
parents:
diff changeset
283 break;
e78566595089 initial import
mandel
parents:
diff changeset
284
e78566595089 initial import
mandel
parents:
diff changeset
285 case IN_STRING:
e78566595089 initial import
mandel
parents:
diff changeset
286 assert (*__first != '\n');
e78566595089 initial import
mandel
parents:
diff changeset
287
e78566595089 initial import
mandel
parents:
diff changeset
288 if (*__first == '\'')
e78566595089 initial import
mandel
parents:
diff changeset
289 state = END;
e78566595089 initial import
mandel
parents:
diff changeset
290 else if (*__first == '\\')
e78566595089 initial import
mandel
parents:
diff changeset
291 state = QUOTE;
e78566595089 initial import
mandel
parents:
diff changeset
292 break;
e78566595089 initial import
mandel
parents:
diff changeset
293
e78566595089 initial import
mandel
parents:
diff changeset
294 case QUOTE:
e78566595089 initial import
mandel
parents:
diff changeset
295 state = IN_STRING;
e78566595089 initial import
mandel
parents:
diff changeset
296 break;
e78566595089 initial import
mandel
parents:
diff changeset
297 }
e78566595089 initial import
mandel
parents:
diff changeset
298 }
e78566595089 initial import
mandel
parents:
diff changeset
299
e78566595089 initial import
mandel
parents:
diff changeset
300 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
301 }
e78566595089 initial import
mandel
parents:
diff changeset
302 };
e78566595089 initial import
mandel
parents:
diff changeset
303
e78566595089 initial import
mandel
parents:
diff changeset
304 struct pp_skip_argument
e78566595089 initial import
mandel
parents:
diff changeset
305 {
e78566595089 initial import
mandel
parents:
diff changeset
306 pp_skip_identifier skip_number;
e78566595089 initial import
mandel
parents:
diff changeset
307 pp_skip_identifier skip_identifier;
e78566595089 initial import
mandel
parents:
diff changeset
308 pp_skip_string_literal skip_string_literal;
e78566595089 initial import
mandel
parents:
diff changeset
309 pp_skip_char_literal skip_char_literal;
e78566595089 initial import
mandel
parents:
diff changeset
310 pp_skip_comment_or_divop skip_comment_or_divop;
e78566595089 initial import
mandel
parents:
diff changeset
311 int lines;
e78566595089 initial import
mandel
parents:
diff changeset
312
e78566595089 initial import
mandel
parents:
diff changeset
313 template <typename _InputIterator>
e78566595089 initial import
mandel
parents:
diff changeset
314 _InputIterator operator () (_InputIterator __first, _InputIterator __last)
e78566595089 initial import
mandel
parents:
diff changeset
315 {
e78566595089 initial import
mandel
parents:
diff changeset
316 int depth = 0;
e78566595089 initial import
mandel
parents:
diff changeset
317 lines = 0;
e78566595089 initial import
mandel
parents:
diff changeset
318
e78566595089 initial import
mandel
parents:
diff changeset
319 while (__first != __last)
e78566595089 initial import
mandel
parents:
diff changeset
320 {
e78566595089 initial import
mandel
parents:
diff changeset
321 if (!depth && (*__first == ')' || *__first == ','))
e78566595089 initial import
mandel
parents:
diff changeset
322 break;
e78566595089 initial import
mandel
parents:
diff changeset
323 else if (*__first == '(')
e78566595089 initial import
mandel
parents:
diff changeset
324 ++depth, ++__first;
e78566595089 initial import
mandel
parents:
diff changeset
325 else if (*__first == ')')
e78566595089 initial import
mandel
parents:
diff changeset
326 --depth, ++__first;
e78566595089 initial import
mandel
parents:
diff changeset
327 else if (*__first == '\"')
e78566595089 initial import
mandel
parents:
diff changeset
328 {
e78566595089 initial import
mandel
parents:
diff changeset
329 __first = skip_string_literal (__first, __last);
e78566595089 initial import
mandel
parents:
diff changeset
330 lines += skip_string_literal.lines;
e78566595089 initial import
mandel
parents:
diff changeset
331 }
e78566595089 initial import
mandel
parents:
diff changeset
332 else if (*__first == '\'')
e78566595089 initial import
mandel
parents:
diff changeset
333 {
e78566595089 initial import
mandel
parents:
diff changeset
334 __first = skip_char_literal (__first, __last);
e78566595089 initial import
mandel
parents:
diff changeset
335 lines += skip_char_literal.lines;
e78566595089 initial import
mandel
parents:
diff changeset
336 }
e78566595089 initial import
mandel
parents:
diff changeset
337 else if (*__first == '/')
e78566595089 initial import
mandel
parents:
diff changeset
338 {
e78566595089 initial import
mandel
parents:
diff changeset
339 __first = skip_comment_or_divop (__first, __last);
e78566595089 initial import
mandel
parents:
diff changeset
340 lines += skip_comment_or_divop.lines;
e78566595089 initial import
mandel
parents:
diff changeset
341 }
e78566595089 initial import
mandel
parents:
diff changeset
342 else if (pp_isalpha (*__first) || *__first == '_')
e78566595089 initial import
mandel
parents:
diff changeset
343 {
e78566595089 initial import
mandel
parents:
diff changeset
344 __first = skip_identifier (__first, __last);
e78566595089 initial import
mandel
parents:
diff changeset
345 lines += skip_identifier.lines;
e78566595089 initial import
mandel
parents:
diff changeset
346 }
e78566595089 initial import
mandel
parents:
diff changeset
347 else if (pp_isdigit (*__first))
e78566595089 initial import
mandel
parents:
diff changeset
348 {
e78566595089 initial import
mandel
parents:
diff changeset
349 __first = skip_number (__first, __last);
e78566595089 initial import
mandel
parents:
diff changeset
350 lines += skip_number.lines;
e78566595089 initial import
mandel
parents:
diff changeset
351 }
e78566595089 initial import
mandel
parents:
diff changeset
352 else if (*__first == '\n')
e78566595089 initial import
mandel
parents:
diff changeset
353 {
e78566595089 initial import
mandel
parents:
diff changeset
354 ++__first;
e78566595089 initial import
mandel
parents:
diff changeset
355 ++lines;
e78566595089 initial import
mandel
parents:
diff changeset
356 }
e78566595089 initial import
mandel
parents:
diff changeset
357 else
e78566595089 initial import
mandel
parents:
diff changeset
358 ++__first;
e78566595089 initial import
mandel
parents:
diff changeset
359 }
e78566595089 initial import
mandel
parents:
diff changeset
360
e78566595089 initial import
mandel
parents:
diff changeset
361 return __first;
e78566595089 initial import
mandel
parents:
diff changeset
362 }
e78566595089 initial import
mandel
parents:
diff changeset
363 };
e78566595089 initial import
mandel
parents:
diff changeset
364
e78566595089 initial import
mandel
parents:
diff changeset
365 } // namespace rpp
e78566595089 initial import
mandel
parents:
diff changeset
366
e78566595089 initial import
mandel
parents:
diff changeset
367 #endif // PP_SCANNER_H
e78566595089 initial import
mandel
parents:
diff changeset
368
e78566595089 initial import
mandel
parents:
diff changeset
369 // kate: space-indent on; indent-width 2; replace-tabs on;