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 kumpf 1.19 /* Avoid warn_unused_result warnings in Linux RPM build */
|
76 kumpf 1.20 #ifndef ECHO
77 # define ECHO do { size_t ignored = fwrite(yytext, yyleng, 1, yyout); } while(0)
78 #endif
|
79 kumpf 1.19
|
80 chuck 1.2 int lineno;
81
82 %}
83 SIGN [+-]
84 BINARY_DIGIT [01]
85 HEX_DIGIT [A-Fa-f0-9]
86 HEX_IDENT 0[Xx]
87 POSITIVE_DECIMAL_DIGIT [1-9]
88 DECIMAL_DIGIT [0-9]
89 BLANK [ \t]
90 IDENT_CHAR [0-9A-Za-z_\x80-\xFF]
|
91 humberto 1.9 IDENT_CHAR_1 [0-9A-Za-z_\x80-\xFF]
92 IDENT_CHAR_NO_NUM [A-Za-z_\x80-\xFF]
|
93 chuck 1.2 PROP_CHAR [A-Za-z0-9_\[\]\-\#\']
94
95 A [Aa]
96 B [Bb]
97 C [Cc]
98 D [Dd]
99 E [Ee]
100 F [Ff]
101 G [Gg]
102 H [Hh]
103 I [Ii]
104 J [Jj]
105 K [Kk]
106 L [Ll]
107 M [Mm]
108 N [Nn]
109 O [Oo]
110 P [Pp]
111 Q [Qq]
112 R [Rr]
113 S [Ss]
114 chuck 1.2 T [Tt]
115 U [Uu]
116 V [Vv]
117 W [Ww]
118 X [Xx]
119 Y [Yy]
120 Z [Zz]
121
122 %%
123
124 {S}{E}{L}{E}{C}{T} {
125
|
126 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_SELECT] ", yytext);
|
127 kumpf 1.25 CQL_globalParserState->currentTokenPos+=yyleng;
|
128 humberto 1.8 CQL_globalParserState->tokenCount++;
|
129 karl 1.15 return TOK_SELECT;
|
130 chuck 1.2 }
131
132 {F}{R}{O}{M} {
133
|
134 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_FROM] ", yytext);
|
135 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
136 CQL_globalParserState->tokenCount++;
|
137 karl 1.15 return TOK_FROM;
|
138 chuck 1.2 }
139
140 {W}{H}{E}{R}{E} {
141
|
142 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_WHERE] ", yytext);
|
143 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
144 CQL_globalParserState->tokenCount++;
|
145 karl 1.15 return TOK_WHERE;
|
146 chuck 1.2 }
147
148 {A}{N}{Y} {
149
|
150 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_ANY] ", yytext);
|
151 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
152 CQL_globalParserState->tokenCount++;
|
153 karl 1.15 return TOK_ANY;
|
154 chuck 1.2 }
155
156 {A}{S} {
|
157 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_AS] ", yytext);
|
158 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
159 CQL_globalParserState->tokenCount++;
|
160 karl 1.15 return TOK_AS;
|
161 chuck 1.2 }
162
163 {A}{S}{C} {
|
164 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_ASC] ", yytext);
|
165 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
166 CQL_globalParserState->tokenCount++;
|
167 karl 1.15 return TOK_ASC;
|
168 chuck 1.2 }
169
170 {B}{Y} {
|
171 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_BY] ", yytext);
|
172 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
173 CQL_globalParserState->tokenCount++;
|
174 karl 1.15 return TOK_BY;
|
175 chuck 1.2 }
176
177 {D}{E}{S}{C} {
|
178 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_DESC] ", yytext);
|
179 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
180 CQL_globalParserState->tokenCount++;
|
181 karl 1.15 return TOK_DESC;
|
182 chuck 1.2 }
183
184
185 {D}{I}{S}{T}{I}{N}{C}{T} {
|
186 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_DISTINCT] ", yytext);
|
187 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
188 CQL_globalParserState->tokenCount++;
|
189 karl 1.15 return TOK_DISTINCT;
|
190 chuck 1.2 }
191
192 {E}{V}{E}{R}{Y} {
|
193 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_EVERY] ", yytext);
|
194 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
195 CQL_globalParserState->tokenCount++;
|
196 karl 1.15 return TOK_EVERY;
|
197 chuck 1.2 }
198
199 {F}{I}{R}{S}{T} {
|
200 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_FIRST] ", yytext);
|
201 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
202 CQL_globalParserState->tokenCount++;
|
203 karl 1.15 return TOK_FIRST;
|
204 chuck 1.2 }
205
206 {I}{N} {
|
207 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_IN] ", yytext);
|
208 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
209 CQL_globalParserState->tokenCount++;
|
210 karl 1.15 return TOK_IN;
|
211 chuck 1.2 }
212
213 {I}{S} {
|
214 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_IS] ", yytext);
|
215 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
216 CQL_globalParserState->tokenCount++;
|
217 karl 1.15 return TOK_IS;
|
218 chuck 1.2 }
219
220 {I}{S}{A} {
|
221 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [ISA] ", yytext);
|
222 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
223 CQL_globalParserState->tokenCount++;
|
224 karl 1.15 return TOK_ISA;
|
225 chuck 1.2 }
226
227 {L}{I}{K}{E} {
|
228 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOKE_LIKE] ", yytext);
|
229 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
230 CQL_globalParserState->tokenCount++;
|
231 karl 1.15 return TOK_LIKE;
|
232 chuck 1.2 }
233
234 {O}{R}{D}{E}{R} {
|
235 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_ORDER] ", yytext);
|
236 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
237 CQL_globalParserState->tokenCount++;
|
238 karl 1.15 return TOK_ORDER;
|
239 chuck 1.2 }
240
241 {S}{A}{T}{I}{S}{F}{I}{E}{S} {
|
242 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_SATISFIES] ", yytext);
|
243 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
244 CQL_globalParserState->tokenCount++;
|
245 karl 1.15 return TOK_SATISFIES;
|
246 chuck 1.2 }
247
248 {T}{R}{U}{E} {
|
249 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_TRUE] ", yytext);
|
250 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
251 CQL_globalParserState->tokenCount++;
|
252 karl 1.15 return TOK_TRUE;
|
253 chuck 1.2 }
254
255 {F}{A}{L}{S}{E} {
|
256 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_FALSE] ", yytext);
|
257 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
258 CQL_globalParserState->tokenCount++;
|
259 karl 1.15 return TOK_FALSE;
|
260 chuck 1.2 }
261
262 {N}{U}{L}{L} {
|
263 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NULL] ", yytext);
|
264 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
265 CQL_globalParserState->tokenCount++;
|
266 karl 1.15 return TOK_NULL;
|
267 chuck 1.2 }
268
269 {N}{O}{T} {
|
270 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NOT] ", yytext);
|
271 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
272 CQL_globalParserState->tokenCount++;
|
273 karl 1.15 return TOK_NOT;
|
274 chuck 1.2 }
275
276 {A}{N}{D} {
|
277 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_AND] ", yytext);
|
278 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
279 CQL_globalParserState->tokenCount++;
|
280 karl 1.15 return TOK_AND;
|
281 chuck 1.2 }
282
283 {O}{R} {
|
284 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_OR] ", yytext);
|
285 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
286 CQL_globalParserState->tokenCount++;
|
287 karl 1.15 return TOK_OR;
|
288 chuck 1.2 }
|
289 karl 1.24 /* NOCHKSRC */
|
290 humberto 1.9 {IDENT_CHAR_NO_NUM}{IDENT_CHAR}*\:\:{IDENT_CHAR_NO_NUM}({IDENT_CHAR}*|{IDENT_CHAR}*\[.*\]|{IDENT_CHAR}*#\'.*\') {
|
291 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
292 CQL_globalParserState->tokenCount++;
|
293 karl 1.15 /* remove any single quotes surrounding embedded literals */
294 size_t n;
295 if(CQL_lval.strValue)
296 delete [] CQL_lval.strValue;
|
297 karl 1.24 /* CHKSRC */
|
298 chuck 1.12 // chuck
299 if (!isUTF8Str(yytext))
|
300 kumpf 1.25 {
|
301 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [STRING]-> BAD UTF\n");
|
302 chuck 1.12 throw CQLSyntaxErrorException(
|
303 karl 1.15 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
304 "Bad UTF8 encountered parsing rule $0 in position $1.",
305 "identifier",
306 CQL_globalParserState->currentTokenPos));
|
307 chuck 1.12 }
|
308 kumpf 1.25
|
309 karl 1.15 String s(yytext);
310 Uint32 index = s.find("'");
311 if(index != PEG_NOT_FOUND){
312 s.remove(index,1);
313 s.remove(s.size()-1,1);
314 CString cstr = s.getCString();
315 const char* string = (const char*)cstr;
316 n = strlen(string);
317 CQL_lval.strValue = new char[n+1];
318 memcpy(CQL_lval.strValue, string, n);
319 }else{
320 n = strlen(yytext);
321 CQL_lval.strValue = new char[n+1];
|
322 humberto 1.5 memcpy(CQL_lval.strValue, yytext, n);
|
323 karl 1.15 }
|
324 chuck 1.2 CQL_lval.strValue[n] = '\0';
|
325 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [SCOPED_PROPERTY] ", CQL_lval.strValue);
|
326 chuck 1.2
|
327 karl 1.15 return TOK_SCOPED_PROPERTY;
|
328 chuck 1.2 }
329
330 [-]{1}[0][Xx]{HEX_DIGIT}{HEX_DIGIT}* {
|
331 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_HEXADECIMAL] ", yytext);
|
332 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
333 CQL_globalParserState->tokenCount++;
|
334 chuck 1.2 /* copy the hex value */
335 {
336 size_t n = strlen(yytext);
|
337 karl 1.15 if(CQL_lval.strValue)
338 delete [] CQL_lval.strValue;
|
339 chuck 1.2 CQL_lval.strValue = new char[n + 1];
340 memcpy(CQL_lval.strValue, yytext, n);
341 CQL_lval.strValue[n] = '\0';
342 }
|
343 karl 1.15 return TOK_NEGATIVE_HEXADECIMAL;
|
344 chuck 1.2 }
345
346 [+]?[0][Xx]{HEX_DIGIT}{HEX_DIGIT}* {
|
347 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_HEXADECIMAL] ", yytext);
|
348 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
349 CQL_globalParserState->tokenCount++;
|
350 chuck 1.2 /* copy the hex value */
351 {
352 size_t n = strlen(yytext);
353 if(CQL_lval.strValue)
354 delete [] CQL_lval.strValue;
355 CQL_lval.strValue = new char[n + 1];
356 memcpy(CQL_lval.strValue, yytext, n);
357 CQL_lval.strValue[n] = '\0';
358 }
|
359 karl 1.15 return TOK_HEXADECIMAL;
|
360 chuck 1.2 }
361
362 [-]{1}{BINARY_DIGIT}{BINARY_DIGIT}*{B} {
|
363 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_BINARY] ", yytext);
|
364 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
365 CQL_globalParserState->tokenCount++;
|
366 kumpf 1.25 /* copy the bin value */
|
367 chuck 1.2 {
368 size_t n = strlen(yytext);
|
369 karl 1.15 if(CQL_lval.strValue)
|
370 chuck 1.2 delete [] CQL_lval.strValue;
371 CQL_lval.strValue = new char[n + 1];
372 memcpy(CQL_lval.strValue, yytext, n);
373 CQL_lval.strValue[n] = '\0';
374 }
|
375 karl 1.15 return TOK_NEGATIVE_BINARY;
|
376 chuck 1.2 }
377
378 [+]?{BINARY_DIGIT}{BINARY_DIGIT}*{B} {
|
379 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_BINARY] ", yytext);
|
380 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
381 CQL_globalParserState->tokenCount++;
|
382 chuck 1.2 /* copy the bin value */
383 {
384 size_t n = strlen(yytext);
385 if(CQL_lval.strValue)
386 delete [] CQL_lval.strValue;
387 CQL_lval.strValue = new char[n + 1];
388 memcpy(CQL_lval.strValue, yytext, n);
389 CQL_lval.strValue[n] = '\0';
390 }
|
391 karl 1.15 return TOK_BINARY;
|
392 chuck 1.2 }
393
394
395 [-]{1}{POSITIVE_DECIMAL_DIGIT}{DECIMAL_DIGIT}* {
396
|
397 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_INTEGER] ", yytext);
|
398 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
399 CQL_globalParserState->tokenCount++;
|
400 chuck 1.2 size_t n = strlen(yytext);
401 if(CQL_lval.strValue)
|
402 karl 1.15 delete [] CQL_lval.strValue;
|
403 chuck 1.2 CQL_lval.strValue = new char[n + 1];
404 memcpy(CQL_lval.strValue, yytext, n);
405 CQL_lval.strValue[n] = '\0';
406
407 /*CQL_lval.intValue = strtol(yytext, (char**)0, 10);*/
|
408 karl 1.15 return TOK_NEGATIVE_INTEGER;
|
409 chuck 1.2 }
410
|
411 humberto 1.9 [+]?{DECIMAL_DIGIT}+ {
|
412 karl 1.16
|
413 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_INTEGER] ", yytext);
|
414 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
415 CQL_globalParserState->tokenCount++;
|
416 chuck 1.2 size_t n = strlen(yytext);
417 if(CQL_lval.strValue)
418 delete [] CQL_lval.strValue;
419 CQL_lval.strValue = new char[n + 1];
420 memcpy(CQL_lval.strValue, yytext, n);
421 CQL_lval.strValue[n] = '\0';
|
422 karl 1.16
|
423 chuck 1.2 /*CQL_lval.intValue = strtol(yytext, (char**)0, 10);*/
|
424 karl 1.15 return TOK_INTEGER;
|
425 chuck 1.2 }
426
427 [-]{1}{DECIMAL_DIGIT}*\.{DECIMAL_DIGIT}+([eE][+-]?{DECIMAL_DIGIT}+)? {
428
|
429 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NEGATIVE_REAL] ", yytext);
|
430 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
431 CQL_globalParserState->tokenCount++;
|
432 chuck 1.2 size_t n = strlen(yytext);
433 if(CQL_lval.strValue)
434 delete [] CQL_lval.strValue;
435 CQL_lval.strValue = new char[n + 1];
436 memcpy(CQL_lval.strValue, yytext, n);
437 CQL_lval.strValue[n] = '\0';
438
439 /*CQL_lval.realValue = strtod((char*)yytext, (char**)0);*/
|
440 karl 1.15 return TOK_NEGATIVE_REAL;
|
441 chuck 1.2 }
|
442 karl 1.24 /* NOCHKSRC */
|
443 humberto 1.9 ([+]?{DECIMAL_DIGIT}*\.{DECIMAL_DIGIT}+([eE][+-]?{DECIMAL_DIGIT}+)?)|([+]?{DECIMAL_DIGIT}+\.{DECIMAL_DIGIT}*([eE][+-]?{DECIMAL_DIGIT}+)?) {
|
444 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_REAL] ", yytext);
|
445 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
446 CQL_globalParserState->tokenCount++;
|
447 chuck 1.2 size_t n = strlen(yytext);
448 if(CQL_lval.strValue)
449 delete [] CQL_lval.strValue;
450 CQL_lval.strValue = new char[n + 1];
451 memcpy(CQL_lval.strValue, yytext, n);
452 CQL_lval.strValue[n] = '\0';
|
453 karl 1.16
|
454 chuck 1.2 /*CQL_lval.realValue = strtod((char*)yytext, (char**)0);*/
|
455 karl 1.15 return TOK_REAL;
|
456 chuck 1.2 }
|
457 karl 1.24 /* CHKSRC */
|
458 humberto 1.9 \'((\\')|(\\\\)|[^'(\\')])*\' {
|
459 karl 1.15 /* \'[^\'\n]*\' */
|
460 chuck 1.2 /* ATTN-B: handle long literals by using yyinput(). */
461 /* ATTN-B: Handle expansion of special characters */
462
|
463 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_STRING_LITERAL] ", yytext);
|
464 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
465 CQL_globalParserState->tokenCount++;
|
466 chuck 1.2 /* remove any escaped \ OR escaped ' */
467
468 String _esc_doubleslash = "\\\\";
469 String _esc_singlequote = "\\'";
|
470 chuck 1.12
471 if (!isUTF8Str(yytext))
|
472 kumpf 1.25 {
|
473 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [STRING]-> BAD UTF\n");
|
474 chuck 1.12 throw CQLSyntaxErrorException(
|
475 kumpf 1.21 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
476 "Bad UTF8 encountered parsing rule $0 in position $1.",
477 "literal_string",
|
478 karl 1.16 CQL_globalParserState->currentTokenPos));
|
479 chuck 1.12 }
480
|
481 chuck 1.2 String s(yytext);
482
483 Uint32 index = 1;
|
484 kumpf 1.25 while((index = s.find(_esc_doubleslash)) != PEG_NOT_FOUND ||
|
485 karl 1.15 (index = s.find(_esc_singlequote)) != PEG_NOT_FOUND)
486 {
487 // make sure we don't remove the slasy from say 'abc\'
488 if(index == s.size() - 2)
489 break;
490 s.remove(index,1);
|
491 chuck 1.2 }
492 CString cstr = s.getCString();
493 const char* string = (const char*)cstr;
494
495 /* Copy the string (but remove the surrounding quotes */
496
497 {
|
498 karl 1.15 size_t n = strlen(string) - 2;
499 if(CQL_lval.strValue)
500 delete [] CQL_lval.strValue;
501 CQL_lval.strValue = new char[n + 1];
502 memcpy(CQL_lval.strValue, string + 1, n);
503 CQL_lval.strValue[n] = '\0';
|
504 chuck 1.2 }
|
505 karl 1.15 return TOK_STRING_LITERAL;
|
506 chuck 1.2 }
507
508 \'[^\'\n]*$ {
509
|
510 dave.sudlik 1.17 CQL_DEBUG_TRACE("Unterminated string");
|
511 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
512 CQL_globalParserState->tokenCount++;
|
513 chuck 1.2 }
514
515 \*{1} {
|
516 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_STAR] ");
|
517 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
518 CQL_globalParserState->tokenCount++;
|
519 karl 1.15 return TOK_STAR;
|
520 chuck 1.2 }
521
522 \/{1} {
|
523 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_DIV] ");
|
524 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
525 CQL_globalParserState->tokenCount++;
|
526 karl 1.15 return TOK_DIV;
|
527 chuck 1.2 }
528
529 \+{1} {
|
530 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_PLUS] ");
|
531 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
532 CQL_globalParserState->tokenCount++;
|
533 karl 1.15 return TOK_PLUS;
|
534 chuck 1.2 }
535
536 \-{1} {
|
537 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_MINUS] ");
|
538 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
539 CQL_globalParserState->tokenCount++;
|
540 karl 1.15 return TOK_MINUS;
|
541 chuck 1.2 }
542
543 \,{1} {
|
544 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_COMMA] ");
|
545 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
546 CQL_globalParserState->tokenCount++;
|
547 karl 1.15 return TOK_COMMA;
|
548 chuck 1.2 }
549
550 \.{2} {
|
551 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_DOTDOT] ");
|
552 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
553 CQL_globalParserState->tokenCount++;
|
554 karl 1.15 return TOK_DOTDOT;
|
555 chuck 1.2 }
556
557 \#{1} {
|
558 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_HASH] ");
|
559 karl 1.16 CQL_globalParserState->currentTokenPos+=yyleng;
|
560 humberto 1.8 CQL_globalParserState->tokenCount++;
|
561 karl 1.15 return TOK_HASH;
|
562 chuck 1.2 }
563
564 \.{1} {
|
565 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_DOT] ");
|
566 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
567 CQL_globalParserState->tokenCount++;
|
568 karl 1.15 return TOK_DOT;
|
569 chuck 1.2 }
570
571 \[{1} {
|
572 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_LBRKT] ");
|
573 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
574 CQL_globalParserState->tokenCount++;
|
575 karl 1.15 return TOK_LBRKT;
|
576 chuck 1.2 }
577
578 \]{1} {
|
579 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_RBRKT] ");
|
580 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
581 CQL_globalParserState->tokenCount++;
|
582 karl 1.15 return TOK_RBRKT;
|
583 chuck 1.2 }
584
585 \({1} {
|
586 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_LPAR] ");
|
587 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
588 CQL_globalParserState->tokenCount++;
|
589 karl 1.15 return TOK_LPAR;
|
590 chuck 1.2 }
591
592 \){1} {
|
593 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX: [TOK_RPAR] ");
|
594 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
595 CQL_globalParserState->tokenCount++;
|
596 karl 1.15 return TOK_RPAR;
|
597 chuck 1.2 }
598
599 "||" {
|
600 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_DBL_PIPE] ", yytext);
|
601 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
602 CQL_globalParserState->tokenCount++;
|
603 karl 1.15 return TOK_DBL_PIPE;
|
604 chuck 1.2 }
605
606 "_" {
|
607 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_UNDERSCORE] ", yytext);
|
608 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
609 CQL_globalParserState->tokenCount++;
|
610 karl 1.15 return TOK_UNDERSCORE;
|
611 chuck 1.2 }
612
|
613 kumpf 1.25 "=" {
|
614 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_EQ] ", yytext);
|
615 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
616 CQL_globalParserState->tokenCount++;
|
617 kumpf 1.25 return TOK_EQ;
|
618 chuck 1.2 }
619
|
620 humberto 1.7
|
621 kumpf 1.25 "<>" {
|
622 chuck 1.2
|
623 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_NE] ", yytext);
|
624 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
625 CQL_globalParserState->tokenCount++;
|
626 kumpf 1.25 return TOK_NE;
|
627 chuck 1.2 }
628
|
629 humberto 1.7
|
630 kumpf 1.25 "<=" {
|
631 chuck 1.2
|
632 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_LE] ", yytext);
|
633 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
634 CQL_globalParserState->tokenCount++;
|
635 kumpf 1.25 return TOK_LE;
|
636 chuck 1.2 }
637
|
638 kumpf 1.25 "<" {
|
639 chuck 1.2
|
640 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_LT] ", yytext);
|
641 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
642 CQL_globalParserState->tokenCount++;
|
643 kumpf 1.25 return TOK_LT;
|
644 chuck 1.2 }
645
|
646 kumpf 1.25 ">=" {
|
647 chuck 1.2
|
648 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_GE] ", yytext);
|
649 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
650 CQL_globalParserState->tokenCount++;
|
651 kumpf 1.25 return TOK_GE;
|
652 chuck 1.2 }
653
|
654 kumpf 1.25 ">" {
|
655 chuck 1.2
|
656 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_GT] ", yytext);
|
657 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
658 CQL_globalParserState->tokenCount++;
|
659 kumpf 1.25 return TOK_GT;
|
660 chuck 1.2 }
661
|
662 humberto 1.9 {IDENT_CHAR_NO_NUM}({IDENT_CHAR})* {
|
663 chuck 1.2
|
664 dave.sudlik 1.17 CQL_DEBUG_TRACE2("LEX: %s [TOK_IDENTIFIER] ", yytext);
|
665 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
666 CQL_globalParserState->tokenCount++;
|
667 chuck 1.2 {
|
668 karl 1.16 size_t n = strlen(yytext);
669 if(CQL_lval.strValue)
670 delete [] CQL_lval.strValue;
671 CQL_lval.strValue = new char[n + 1];
672 memcpy(CQL_lval.strValue, yytext, n);
673 CQL_lval.strValue[n] = '\0';
|
674 chuck 1.2 }
675
|
676 karl 1.15 return TOK_IDENTIFIER;
|
677 chuck 1.2 }
678
679 {BLANK}+ {
680
681 /* Ignore blanks */
|
682 humberto 1.8 CQL_globalParserState->currentTokenPos+=yyleng;
|
683 chuck 1.2 }
684
685 \n {
|
686 karl 1.15 CQL_globalParserState->currentTokenPos=0;
687 return 0;
|
688 chuck 1.2 }
689
690 <<EOF>> {
691 return 0;
692 }
693
694 . {
|
695 kumpf 1.18 delete [] CQL_lval.strValue;
|
696 chuck 1.2 CQL_lval.strValue = 0;
|
697 dave.sudlik 1.17 CQL_DEBUG_TRACE("LEX::TOK_UNEXPECTED_CHAR\n");
|
698 chuck 1.2
|
699 karl 1.15 return TOK_UNEXPECTED_CHAR;
|
700 chuck 1.2 }
701
702 %%
703 extern "C" int CQL_wrap()
704 {
705 return 1;
706 }
707
708
|