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

  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                  

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2