1 martin 1.22 /*
2 //%LICENSE////////////////////////////////////////////////////////////////
|
3 martin 1.23 //
|
4 martin 1.22 // Licensed to The Open Group (TOG) under one or more contributor license
5 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
6 // this work for additional information regarding copyright ownership.
7 // Each contributor licenses this file to you under the OpenPegasus Open
8 // Source License; you may not use this file except in compliance with the
9 // License.
|
10 martin 1.23 //
|
11 martin 1.22 // Permission is hereby granted, free of charge, to any person obtaining a
12 // copy of this software and associated documentation files (the "Software"),
13 // to deal in the Software without restriction, including without limitation
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 // and/or sell copies of the Software, and to permit persons to whom the
16 // Software is furnished to do so, subject to the following conditions:
|
17 martin 1.23 //
|
18 martin 1.22 // The above copyright notice and this permission notice shall be included
19 // in all copies or substantial portions of the Software.
|
20 martin 1.23 //
|
21 martin 1.22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
22 martin 1.23 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
23 martin 1.22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
25 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
28 martin 1.23 //
|
29 martin 1.22 //////////////////////////////////////////////////////////////////////////
30 */
|
31 karl 1.14
|
32 kumpf 1.25 /*
|
33 karl 1.15 This file describes the language tokens possible for CQL. When a token is
34 matched, the token postion is updated in the CQL_globalParserState, copying
35 from the lex buffer to a shared buffer (shared with the lexer and parser)
36 may happen, then a token identifier is returned to the parser.
|
37 humberto 1.9
|
38 kumpf 1.25 */
|
39 humberto 1.9
|
40 chuck 1.2 %option never-interactive
41 %{
42 extern int CQLInput(char* buffer, int& numRead, int numRequested);
43 extern int CQL_error(const char*);
44
45 #ifdef CQLINPUT
46 #define YY_INPUT(BUF, NREAD, NREQUESTED) CQLInput(BUF, NREAD, NREQUESTED)
47 #endif
48
49 #include <Pegasus/Common/Config.h>
|
50 chuck 1.12 #include <Pegasus/Common/CommonUTF.h>
51 #include <Pegasus/Common/MessageLoader.h>
|
52 chuck 1.2 #include "CQLParserState.h"
53 #include <stdlib.h>
54 #include <stdio.h>
55 #include <cstring>
56 #include "CQLObjects.h"
57 #include "CQLYACC.h"
58 PEGASUS_NAMESPACE_BEGIN
|
59 kumpf 1.25
|
60 humberto 1.8 extern CQLParserState* CQL_globalParserState;
|
61 kumpf 1.25
|
62 chuck 1.2 PEGASUS_NAMESPACE_END
|
63 dave.sudlik 1.17
64
65 #ifdef CQL_DEBUG_LEXER
66 #define CQL_DEBUG_TRACE(X) \
67 printf(X);
68 #define CQL_DEBUG_TRACE2(X,Y) \
69 printf(X,Y);
70 #else
71 #define CQL_DEBUG_TRACE(X)
72 #define CQL_DEBUG_TRACE2(X,Y)
73 #endif
|
74 chuck 1.2
75 int lineno;
76
77 %}
78 SIGN [+-]
79 BINARY_DIGIT [01]
80 HEX_DIGIT [A-Fa-f0-9]
81 HEX_IDENT 0[Xx]
82 POSITIVE_DECIMAL_DIGIT [1-9]
83 DECIMAL_DIGIT [0-9]
84 BLANK [ \t]
85 IDENT_CHAR [0-9A-Za-z_\x80-\xFF]
|
86 humberto 1.9 IDENT_CHAR_1 [0-9A-Za-z_\x80-\xFF]
87 IDENT_CHAR_NO_NUM [A-Za-z_\x80-\xFF]
|
88 chuck 1.2 PROP_CHAR [A-Za-z0-9_\[\]\-\#\']
89
90 A [Aa]
91 B [Bb]
92 C [Cc]
93 D [Dd]
94 E [Ee]
95 F [Ff]
96 G [Gg]
97 H [Hh]
98 I [Ii]
99 J [Jj]
100 K [Kk]
101 L [Ll]
102 M [Mm]
103 N [Nn]
104 O [Oo]
105 P [Pp]
106 Q [Qq]
107 R [Rr]
108 S [Ss]
109 chuck 1.2 T [Tt]
110 U [Uu]
111 V [Vv]
112 W [Ww]
113 X [Xx]
114 Y [Yy]
115 Z [Zz]
116
117 %%
118
119 {S}{E}{L}{E}{C}{T} {
120
|
121 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_SELECT] ", yytext);
|
122 kumpf 1.25 CQL_globalParserState->currentTokenPos+=yyleng;
|
123 humberto 1.8 CQL_globalParserState->tokenCount++;
|
124 karl 1.15 return TOK_SELECT;
|
125 chuck 1.2 }
126
127 {F}{R}{O}{M} {
128
|
129 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_FROM] ", yytext);
|
130 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
131 CQL_globalParserState->tokenCount++;
|
132 karl 1.15 return TOK_FROM;
|
133 chuck 1.2 }
134
135 {W}{H}{E}{R}{E} {
136
|
137 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_WHERE] ", yytext);
|
138 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
139 CQL_globalParserState->tokenCount++;
|
140 karl 1.15 return TOK_WHERE;
|
141 chuck 1.2 }
142
143 {A}{N}{Y} {
144
|
145 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_ANY] ", yytext);
|
146 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
147 CQL_globalParserState->tokenCount++;
|
148 karl 1.15 return TOK_ANY;
|
149 chuck 1.2 }
150
151 {A}{S} {
|
152 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_AS] ", yytext);
|
153 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
154 CQL_globalParserState->tokenCount++;
|
155 karl 1.15 return TOK_AS;
|
156 chuck 1.2 }
157
158 {A}{S}{C} {
|
159 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_ASC] ", yytext);
|
160 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
161 CQL_globalParserState->tokenCount++;
|
162 karl 1.15 return TOK_ASC;
|
163 chuck 1.2 }
164
165 {B}{Y} {
|
166 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_BY] ", yytext);
|
167 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
168 CQL_globalParserState->tokenCount++;
|
169 karl 1.15 return TOK_BY;
|
170 chuck 1.2 }
171
172 {D}{E}{S}{C} {
|
173 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_DESC] ", yytext);
|
174 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
175 CQL_globalParserState->tokenCount++;
|
176 karl 1.15 return TOK_DESC;
|
177 chuck 1.2 }
178
179
180 {D}{I}{S}{T}{I}{N}{C}{T} {
|
181 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_DISTINCT] ", yytext);
|
182 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
183 CQL_globalParserState->tokenCount++;
|
184 karl 1.15 return TOK_DISTINCT;
|
185 chuck 1.2 }
186
187 {E}{V}{E}{R}{Y} {
|
188 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_EVERY] ", yytext);
|
189 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
190 CQL_globalParserState->tokenCount++;
|
191 karl 1.15 return TOK_EVERY;
|
192 chuck 1.2 }
193
194 {F}{I}{R}{S}{T} {
|
195 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_FIRST] ", yytext);
|
196 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
197 CQL_globalParserState->tokenCount++;
|
198 karl 1.15 return TOK_FIRST;
|
199 chuck 1.2 }
200
201 {I}{N} {
|
202 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_IN] ", yytext);
|
203 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
204 CQL_globalParserState->tokenCount++;
|
205 karl 1.15 return TOK_IN;
|
206 chuck 1.2 }
207
208 {I}{S} {
|
209 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_IS] ", yytext);
|
210 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
211 CQL_globalParserState->tokenCount++;
|
212 karl 1.15 return TOK_IS;
|
213 chuck 1.2 }
214
215 {I}{S}{A} {
|
216 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [ISA] ", yytext);
|
217 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
218 CQL_globalParserState->tokenCount++;
|
219 karl 1.15 return TOK_ISA;
|
220 chuck 1.2 }
221
222 {L}{I}{K}{E} {
|
223 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOKE_LIKE] ", yytext);
|
224 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
225 CQL_globalParserState->tokenCount++;
|
226 karl 1.15 return TOK_LIKE;
|
227 chuck 1.2 }
228
229 {O}{R}{D}{E}{R} {
|
230 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_ORDER] ", yytext);
|
231 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
232 CQL_globalParserState->tokenCount++;
|
233 karl 1.15 return TOK_ORDER;
|
234 chuck 1.2 }
235
236 {S}{A}{T}{I}{S}{F}{I}{E}{S} {
|
237 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_SATISFIES] ", yytext);
|
238 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
239 CQL_globalParserState->tokenCount++;
|
240 karl 1.15 return TOK_SATISFIES;
|
241 chuck 1.2 }
242
243 {T}{R}{U}{E} {
|
244 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_TRUE] ", yytext);
|
245 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
246 CQL_globalParserState->tokenCount++;
|
247 karl 1.15 return TOK_TRUE;
|
248 chuck 1.2 }
249
250 {F}{A}{L}{S}{E} {
|
251 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_FALSE] ", yytext);
|
252 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
253 CQL_globalParserState->tokenCount++;
|
254 karl 1.15 return TOK_FALSE;
|
255 chuck 1.2 }
256
257 {N}{U}{L}{L} {
|
258 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NULL] ", yytext);
|
259 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
260 CQL_globalParserState->tokenCount++;
|
261 karl 1.15 return TOK_NULL;
|
262 chuck 1.2 }
263
264 {N}{O}{T} {
|
265 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NOT] ", yytext);
|
266 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
267 CQL_globalParserState->tokenCount++;
|
268 karl 1.15 return TOK_NOT;
|
269 chuck 1.2 }
270
271 {A}{N}{D} {
|
272 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_AND] ", yytext);
|
273 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
274 CQL_globalParserState->tokenCount++;
|
275 karl 1.15 return TOK_AND;
|
276 chuck 1.2 }
277
278 {O}{R} {
|
279 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_OR] ", yytext);
|
280 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
281 CQL_globalParserState->tokenCount++;
|
282 karl 1.15 return TOK_OR;
|
283 chuck 1.2 }
|
284 karl 1.24 /* NOCHKSRC */
|
285 humberto 1.9 {IDENT_CHAR_NO_NUM}{IDENT_CHAR}*\:\:{IDENT_CHAR_NO_NUM}({IDENT_CHAR}*|{IDENT_CHAR}*\[.*\]|{IDENT_CHAR}*#\'.*\') {
|
286 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
287 CQL_globalParserState->tokenCount++;
|
288 karl 1.15 /* remove any single quotes surrounding embedded literals */
289 size_t n;
290 if(CQL_lval.strValue)
291 delete [] CQL_lval.strValue;
|
292 karl 1.24 /* CHKSRC */
|
293 chuck 1.12 // chuck
294 if (!isUTF8Str(yytext))
|
295 kumpf 1.25 {
|
296 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [STRING]-> BAD UTF\n");
|
297 chuck 1.12 throw CQLSyntaxErrorException(
|
298 karl 1.15 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
299 "Bad UTF8 encountered parsing rule $0 in position $1.",
300 "identifier",
301 CQL_globalParserState->currentTokenPos));
|
302 chuck 1.12 }
|
303 kumpf 1.25
|
304 karl 1.15 String s(yytext);
305 Uint32 index = s.find("'");
306 if(index != PEG_NOT_FOUND){
307 s.remove(index,1);
308 s.remove(s.size()-1,1);
309 CString cstr = s.getCString();
310 const char* string = (const char*)cstr;
311 n = strlen(string);
312 CQL_lval.strValue = new char[n+1];
313 memcpy(CQL_lval.strValue, string, n);
314 }else{
315 n = strlen(yytext);
316 CQL_lval.strValue = new char[n+1];
|
317 humberto 1.5 memcpy(CQL_lval.strValue, yytext, n);
|
318 karl 1.15 }
|
319 chuck 1.2 CQL_lval.strValue[n] = '\0';
|
320 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [SCOPED_PROPERTY] ", CQL_lval.strValue);
|
321 chuck 1.2
|
322 karl 1.15 return TOK_SCOPED_PROPERTY;
|
323 chuck 1.2 }
324
325 [-]{1}[0][Xx]{HEX_DIGIT}{HEX_DIGIT}* {
|
326 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_HEXADECIMAL] ", yytext);
|
327 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
328 CQL_globalParserState->tokenCount++;
|
329 chuck 1.2 /* copy the hex value */
330 {
331 size_t n = strlen(yytext);
|
332 karl 1.15 if(CQL_lval.strValue)
333 delete [] CQL_lval.strValue;
|
334 chuck 1.2 CQL_lval.strValue = new char[n + 1];
335 memcpy(CQL_lval.strValue, yytext, n);
336 CQL_lval.strValue[n] = '\0';
337 }
|
338 karl 1.15 return TOK_NEGATIVE_HEXADECIMAL;
|
339 chuck 1.2 }
340
341 [+]?[0][Xx]{HEX_DIGIT}{HEX_DIGIT}* {
|
342 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_HEXADECIMAL] ", yytext);
|
343 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
344 CQL_globalParserState->tokenCount++;
|
345 chuck 1.2 /* copy the hex value */
346 {
347 size_t n = strlen(yytext);
348 if(CQL_lval.strValue)
349 delete [] CQL_lval.strValue;
350 CQL_lval.strValue = new char[n + 1];
351 memcpy(CQL_lval.strValue, yytext, n);
352 CQL_lval.strValue[n] = '\0';
353 }
|
354 karl 1.15 return TOK_HEXADECIMAL;
|
355 chuck 1.2 }
356
357 [-]{1}{BINARY_DIGIT}{BINARY_DIGIT}*{B} {
|
358 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_BINARY] ", yytext);
|
359 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
360 CQL_globalParserState->tokenCount++;
|
361 kumpf 1.25 /* copy the bin value */
|
362 chuck 1.2 {
363 size_t n = strlen(yytext);
|
364 karl 1.15 if(CQL_lval.strValue)
|
365 chuck 1.2 delete [] CQL_lval.strValue;
366 CQL_lval.strValue = new char[n + 1];
367 memcpy(CQL_lval.strValue, yytext, n);
368 CQL_lval.strValue[n] = '\0';
369 }
|
370 karl 1.15 return TOK_NEGATIVE_BINARY;
|
371 chuck 1.2 }
372
373 [+]?{BINARY_DIGIT}{BINARY_DIGIT}*{B} {
|
374 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_BINARY] ", yytext);
|
375 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
376 CQL_globalParserState->tokenCount++;
|
377 chuck 1.2 /* copy the bin value */
378 {
379 size_t n = strlen(yytext);
380 if(CQL_lval.strValue)
381 delete [] CQL_lval.strValue;
382 CQL_lval.strValue = new char[n + 1];
383 memcpy(CQL_lval.strValue, yytext, n);
384 CQL_lval.strValue[n] = '\0';
385 }
|
386 karl 1.15 return TOK_BINARY;
|
387 chuck 1.2 }
388
389
390 [-]{1}{POSITIVE_DECIMAL_DIGIT}{DECIMAL_DIGIT}* {
391
|
392 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_INTEGER] ", yytext);
|
393 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
394 CQL_globalParserState->tokenCount++;
|
395 chuck 1.2 size_t n = strlen(yytext);
396 if(CQL_lval.strValue)
|
397 karl 1.15 delete [] CQL_lval.strValue;
|
398 chuck 1.2 CQL_lval.strValue = new char[n + 1];
399 memcpy(CQL_lval.strValue, yytext, n);
400 CQL_lval.strValue[n] = '\0';
401
402 /*CQL_lval.intValue = strtol(yytext, (char**)0, 10);*/
|
403 karl 1.15 return TOK_NEGATIVE_INTEGER;
|
404 chuck 1.2 }
405
|
406 humberto 1.9 [+]?{DECIMAL_DIGIT}+ {
|
407 karl 1.16
|
408 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_INTEGER] ", yytext);
|
409 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
410 CQL_globalParserState->tokenCount++;
|
411 chuck 1.2 size_t n = strlen(yytext);
412 if(CQL_lval.strValue)
413 delete [] CQL_lval.strValue;
414 CQL_lval.strValue = new char[n + 1];
415 memcpy(CQL_lval.strValue, yytext, n);
416 CQL_lval.strValue[n] = '\0';
|
417 karl 1.16
|
418 chuck 1.2 /*CQL_lval.intValue = strtol(yytext, (char**)0, 10);*/
|
419 karl 1.15 return TOK_INTEGER;
|
420 chuck 1.2 }
421
422 [-]{1}{DECIMAL_DIGIT}*\.{DECIMAL_DIGIT}+([eE][+-]?{DECIMAL_DIGIT}+)? {
423
|
424 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_REAL] ", yytext);
|
425 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
426 CQL_globalParserState->tokenCount++;
|
427 chuck 1.2 size_t n = strlen(yytext);
428 if(CQL_lval.strValue)
429 delete [] CQL_lval.strValue;
430 CQL_lval.strValue = new char[n + 1];
431 memcpy(CQL_lval.strValue, yytext, n);
432 CQL_lval.strValue[n] = '\0';
433
434 /*CQL_lval.realValue = strtod((char*)yytext, (char**)0);*/
|
435 karl 1.15 return TOK_NEGATIVE_REAL;
|
436 chuck 1.2 }
|
437 karl 1.24 /* NOCHKSRC */
|
438 humberto 1.9 ([+]?{DECIMAL_DIGIT}*\.{DECIMAL_DIGIT}+([eE][+-]?{DECIMAL_DIGIT}+)?)|([+]?{DECIMAL_DIGIT}+\.{DECIMAL_DIGIT}*([eE][+-]?{DECIMAL_DIGIT}+)?) {
|
439 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_REAL] ", yytext);
|
440 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
441 CQL_globalParserState->tokenCount++;
|
442 chuck 1.2 size_t n = strlen(yytext);
443 if(CQL_lval.strValue)
444 delete [] CQL_lval.strValue;
445 CQL_lval.strValue = new char[n + 1];
446 memcpy(CQL_lval.strValue, yytext, n);
447 CQL_lval.strValue[n] = '\0';
|
448 karl 1.16
|
449 chuck 1.2 /*CQL_lval.realValue = strtod((char*)yytext, (char**)0);*/
|
450 karl 1.15 return TOK_REAL;
|
451 chuck 1.2 }
|
452 karl 1.24 /* CHKSRC */
|
453 humberto 1.9 \'((\\')|(\\\\)|[^'(\\')])*\' {
|
454 karl 1.15 /* \'[^\'\n]*\' */
|
455 chuck 1.2 /* ATTN-B: handle long literals by using yyinput(). */
456 /* ATTN-B: Handle expansion of special characters */
457
|
458 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_STRING_LITERAL] ", yytext);
|
459 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
460 CQL_globalParserState->tokenCount++;
|
461 chuck 1.2 /* remove any escaped \ OR escaped ' */
462
463 String _esc_doubleslash = "\\\\";
464 String _esc_singlequote = "\\'";
|
465 chuck 1.12
466 if (!isUTF8Str(yytext))
|
467 kumpf 1.25 {
|
468 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [STRING]-> BAD UTF\n");
|
469 chuck 1.12 throw CQLSyntaxErrorException(
|
470 kumpf 1.21 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
471 "Bad UTF8 encountered parsing rule $0 in position $1.",
472 "literal_string",
|
473 karl 1.16 CQL_globalParserState->currentTokenPos));
|
474 chuck 1.12 }
475
|
476 chuck 1.2 String s(yytext);
477
478 Uint32 index = 1;
|
479 kumpf 1.25 while((index = s.find(_esc_doubleslash)) != PEG_NOT_FOUND ||
|
480 karl 1.15 (index = s.find(_esc_singlequote)) != PEG_NOT_FOUND)
481 {
482 // make sure we don't remove the slasy from say 'abc\'
483 if(index == s.size() - 2)
484 break;
485 s.remove(index,1);
|
486 chuck 1.2 }
487 CString cstr = s.getCString();
488 const char* string = (const char*)cstr;
489
490 /* Copy the string (but remove the surrounding quotes */
491
492 {
|
493 karl 1.15 size_t n = strlen(string) - 2;
494 if(CQL_lval.strValue)
495 delete [] CQL_lval.strValue;
496 CQL_lval.strValue = new char[n + 1];
497 memcpy(CQL_lval.strValue, string + 1, n);
498 CQL_lval.strValue[n] = '\0';
|
499 chuck 1.2 }
|
500 karl 1.15 return TOK_STRING_LITERAL;
|
501 chuck 1.2 }
502
503 \'[^\'\n]*$ {
504
|
505 dave.sudlik 1.17 CQL_DEBUG_TRACE("Unterminated string");
|
506 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
507 CQL_globalParserState->tokenCount++;
|
508 chuck 1.2 }
509
510 \*{1} {
|
511 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_STAR] ");
|
512 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
513 CQL_globalParserState->tokenCount++;
|
514 karl 1.15 return TOK_STAR;
|
515 chuck 1.2 }
516
517 \/{1} {
|
518 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_DIV] ");
|
519 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
520 CQL_globalParserState->tokenCount++;
|
521 karl 1.15 return TOK_DIV;
|
522 chuck 1.2 }
523
524 \+{1} {
|
525 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_PLUS] ");
|
526 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
527 CQL_globalParserState->tokenCount++;
|
528 karl 1.15 return TOK_PLUS;
|
529 chuck 1.2 }
530
531 \-{1} {
|
532 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_MINUS] ");
|
533 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
534 CQL_globalParserState->tokenCount++;
|
535 karl 1.15 return TOK_MINUS;
|
536 chuck 1.2 }
537
538 \,{1} {
|
539 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_COMMA] ");
|
540 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
541 CQL_globalParserState->tokenCount++;
|
542 karl 1.15 return TOK_COMMA;
|
543 chuck 1.2 }
544
545 \.{2} {
|
546 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_DOTDOT] ");
|
547 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
548 CQL_globalParserState->tokenCount++;
|
549 karl 1.15 return TOK_DOTDOT;
|
550 chuck 1.2 }
551
552 \#{1} {
|
553 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_HASH] ");
|
554 karl 1.16 CQL_globalParserState->currentTokenPos+=yyleng;
|
555 humberto 1.8 CQL_globalParserState->tokenCount++;
|
556 karl 1.15 return TOK_HASH;
|
557 chuck 1.2 }
558
559 \.{1} {
|
560 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_DOT] ");
|
561 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
562 CQL_globalParserState->tokenCount++;
|
563 karl 1.15 return TOK_DOT;
|
564 chuck 1.2 }
565
566 \[{1} {
|
567 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_LBRKT] ");
|
568 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
569 CQL_globalParserState->tokenCount++;
|
570 karl 1.15 return TOK_LBRKT;
|
571 chuck 1.2 }
572
573 \]{1} {
|
574 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_RBRKT] ");
|
575 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
576 CQL_globalParserState->tokenCount++;
|
577 karl 1.15 return TOK_RBRKT;
|
578 chuck 1.2 }
579
580 \({1} {
|
581 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_LPAR] ");
|
582 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
583 CQL_globalParserState->tokenCount++;
|
584 karl 1.15 return TOK_LPAR;
|
585 chuck 1.2 }
586
587 \){1} {
|
588 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_RPAR] ");
|
589 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
590 CQL_globalParserState->tokenCount++;
|
591 karl 1.15 return TOK_RPAR;
|
592 chuck 1.2 }
593
594 "||" {
|
595 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_DBL_PIPE] ", yytext);
|
596 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
597 CQL_globalParserState->tokenCount++;
|
598 karl 1.15 return TOK_DBL_PIPE;
|
599 chuck 1.2 }
600
601 "_" {
|
602 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_UNDERSCORE] ", yytext);
|
603 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
604 CQL_globalParserState->tokenCount++;
|
605 karl 1.15 return TOK_UNDERSCORE;
|
606 chuck 1.2 }
607
|
608 kumpf 1.25 "=" {
|
609 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_EQ] ", yytext);
|
610 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
611 CQL_globalParserState->tokenCount++;
|
612 kumpf 1.25 return TOK_EQ;
|
613 chuck 1.2 }
614
|
615 humberto 1.7
|
616 kumpf 1.25 "<>" {
|
617 chuck 1.2
|
618 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NE] ", yytext);
|
619 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
620 CQL_globalParserState->tokenCount++;
|
621 kumpf 1.25 return TOK_NE;
|
622 chuck 1.2 }
623
|
624 humberto 1.7
|
625 kumpf 1.25 "<=" {
|
626 chuck 1.2
|
627 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_LE] ", yytext);
|
628 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
629 CQL_globalParserState->tokenCount++;
|
630 kumpf 1.25 return TOK_LE;
|
631 chuck 1.2 }
632
|
633 kumpf 1.25 "<" {
|
634 chuck 1.2
|
635 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_LT] ", yytext);
|
636 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
637 CQL_globalParserState->tokenCount++;
|
638 kumpf 1.25 return TOK_LT;
|
639 chuck 1.2 }
640
|
641 kumpf 1.25 ">=" {
|
642 chuck 1.2
|
643 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_GE] ", yytext);
|
644 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
645 CQL_globalParserState->tokenCount++;
|
646 kumpf 1.25 return TOK_GE;
|
647 chuck 1.2 }
648
|
649 kumpf 1.25 ">" {
|
650 chuck 1.2
|
651 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_GT] ", yytext);
|
652 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
653 CQL_globalParserState->tokenCount++;
|
654 kumpf 1.25 return TOK_GT;
|
655 chuck 1.2 }
656
|
657 humberto 1.9 {IDENT_CHAR_NO_NUM}({IDENT_CHAR})* {
|
658 chuck 1.2
|
659 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_IDENTIFIER] ", yytext);
|
660 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
661 CQL_globalParserState->tokenCount++;
|
662 chuck 1.2 {
|
663 karl 1.16 size_t n = strlen(yytext);
664 if(CQL_lval.strValue)
665 delete [] CQL_lval.strValue;
666 CQL_lval.strValue = new char[n + 1];
667 memcpy(CQL_lval.strValue, yytext, n);
668 CQL_lval.strValue[n] = '\0';
|
669 chuck 1.2 }
670
|
671 karl 1.15 return TOK_IDENTIFIER;
|
672 chuck 1.2 }
673
674 {BLANK}+ {
675
676 /* Ignore blanks */
|
677 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
|
678 chuck 1.2 }
679
680 \n {
|
681 karl 1.15 CQL_globalParserState->currentTokenPos=0;
682 return 0;
|
683 chuck 1.2 }
684
685 <<EOF>> {
686 return 0;
687 }
688
689 . {
|
690 kumpf 1.18 delete [] CQL_lval.strValue;
|
691 chuck 1.2 CQL_lval.strValue = 0;
|
692 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX::TOK_UNEXPECTED_CHAR\n");
|
693 chuck 1.2
|
694 karl 1.15 return TOK_UNEXPECTED_CHAR;
|
695 chuck 1.2 }
696
697 %%
698 extern "C" int CQL_wrap()
699 {
700 return 1;
701 }
702
703
|