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