(file) Return to CQL.l CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / CQL

  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                  

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2