(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 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                  

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2