(file) Return to wql.y CVS log (file) (dir) Up to [OMI] / omi / wql

  1 mike  1.1 %{
  2           
  3           #include <stdio.h>
  4           #include "state.h"
  5           #include "wql.h"
  6           
  7           #if 0
  8           # define YACCTRACE(MSG) \
  9               printf("WQL_TRACE: %s(%d): %s\n", __FILE__, __LINE__, #MSG)
 10           #else
 11           # define YACCTRACE(MSG)
 12           #endif
 13           
 14           extern int wqllex();
 15           extern void wqlerror(const char* msg);
 16           
 17           extern int yylex();
 18           extern void yyerror(const char* msg);
 19           
 20           extern void* wqlmalloc(size_t size);
 21           extern MI_Char* wqlstrdup(const MI_Char* str);
 22 mike  1.1 
 23           %}
 24           
 25           %union
 26           {
 27               WQL_Symbol symbol;
 28               MI_Char* string;
 29               long long integer;
 30               double real;
 31               unsigned char boolean;
 32           }
 33           
 34 krisbash 1.3 %left WQL_DOT
 35              %left WQL_COLON
 36 mike     1.1 %left WQL_OR
 37              %left WQL_AND
 38              %nonassoc WQL_NOT
 39              
 40              %token WQL_ERROR
 41              %token WQL_LT
 42              %token WQL_FROM
 43              %token WQL_LE
 44              %token WQL_WHERE
 45              %token WQL_NE
 46              %token WQL_GT
 47              %token WQL_EQ
 48              %token WQL_SELECT
 49              %token WQL_GE
 50              %token WQL_NULL
 51 krisbash 1.3 %token WQL_LIKE
 52              %token WQL_ISA
 53              %token WQL_DOT
 54              %token WQL_COLON
 55 mike     1.1 
 56              %token <string> WQL_IDENTIFIER;
 57              %token <boolean> WQL_BOOLEAN;
 58              %token <integer> WQL_INTEGER;
 59              %token <real> WQL_REAL;
 60              %token <string> WQL_STRING;
 61              
 62              %type <symbol> Operand;
 63              
 64 krisbash 1.3 %type <symbol> Property;
 65 mike     1.1 
 66              %%
 67              
 68              Start
 69                  : WQL_SELECT SelectList WQL_FROM WQL_IDENTIFIER
 70                  {
 71                      YACCTRACE(Start1);
 72                      wqlstate.wql->className = $4;
 73                  }
 74                  | WQL_SELECT SelectList WQL_FROM WQL_IDENTIFIER WQL_WHERE Condition
 75                  {
 76                      YACCTRACE(Start2);
 77                      wqlstate.wql->className = $4;
 78                  }
 79              
 80              SelectList
 81                  : '*'
 82                  {
 83                      YACCTRACE(SelectList1);
 84                  }
 85                  | PropertyList
 86 mike     1.1     {
 87 krisbash 1.3         YACCTRACE(SelectList2);
 88 mike     1.1     }
 89              
 90              PropertyList
 91                  : WQL_IDENTIFIER
 92                  {
 93                      YACCTRACE(PropertyList1);
 94              
 95                      if (wqlstate.wql->nproperties == WQL_MAX_PROPERTIES)
 96                      {
 97                          yyerror("property array overflow");
 98                          YYABORT;
 99                      }
100              
101                      wqlstate.wql->properties[wqlstate.wql->nproperties++] = $1;
102                  }
103                  | PropertyList ',' WQL_IDENTIFIER
104                  {
105                      YACCTRACE(PropertyList2);
106              
107                      if (wqlstate.wql->nproperties == WQL_MAX_PROPERTIES)
108                      {
109 mike     1.1             yyerror("property array overflow");
110                          YYABORT;
111                      }
112              
113                      wqlstate.wql->properties[wqlstate.wql->nproperties++] = $3;
114                  }
115              
116              Condition
117                  : '(' Condition ')'
118                  {
119                      YACCTRACE(Condition1);
120                  }
121                  | WQL_NOT Condition
122                  {
123                      WQL_Symbol operator;
124              
125                      YACCTRACE(Condition2);
126              
127                      if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS)
128                      {
129                          yyerror("symbol array overflow");
130 mike     1.1             YYABORT;
131                      }
132              
133                      memset(&operator, 0, sizeof(WQL_Symbol));
134                      operator.type = WQL_TYPE_NOT;
135                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
136                  }
137                  | Condition WQL_AND Condition
138                  {
139                      WQL_Symbol operator;
140              
141                      YACCTRACE(Condition3);
142              
143                      if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS)
144                      {
145                          yyerror("symbol array overflow");
146                          YYABORT;
147                      }
148              
149                      memset(&operator, 0, sizeof(WQL_Symbol));
150                      operator.type = WQL_TYPE_AND;
151 mike     1.1         wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
152                  }
153                  | Condition WQL_OR Condition
154                  {
155                      WQL_Symbol operator;
156              
157                      YACCTRACE(Condition4);
158              
159                      if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS)
160                      {
161                          yyerror("symbol array overflow");
162                          YYABORT;
163                      }
164              
165                      memset(&operator, 0, sizeof(WQL_Symbol));
166                      operator.type = WQL_TYPE_OR;
167                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
168                  }
169                  | Predicate
170                  {
171                      YACCTRACE(Condition5);
172 mike     1.1     }
173              
174              Predicate
175                  : Operand WQL_EQ Operand
176                  {
177                      WQL_Symbol operator;
178              
179                      YACCTRACE(Predicate1);
180              
181                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
182                      {
183                          yyerror("symbol array overflow");
184                          YYABORT;
185                      }
186              
187                      memset(&operator, 0, sizeof(WQL_Symbol));
188                      operator.type = WQL_TYPE_EQ;
189              
190                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
191                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
192                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
193 mike     1.1     }
194                  | Operand WQL_NE Operand
195                  {
196                      WQL_Symbol operator;
197              
198                      YACCTRACE(Predicate2);
199              
200                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
201                      {
202                          yyerror("symbol array overflow");
203                          YYABORT;
204                      }
205              
206                      memset(&operator, 0, sizeof(WQL_Symbol));
207                      operator.type = WQL_TYPE_NE;
208              
209                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
210                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
211                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
212                  }
213                  | Operand WQL_LT Operand
214 mike     1.1     {
215                      WQL_Symbol operator;
216              
217                      YACCTRACE(Predicate3);
218              
219                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
220                      {
221                          yyerror("symbol array overflow");
222                          YYABORT;
223                      }
224              
225                      memset(&operator, 0, sizeof(WQL_Symbol));
226                      operator.type = WQL_TYPE_LT;
227              
228                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
229                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
230                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
231                  }
232                  | Operand WQL_LE Operand
233                  {
234                      WQL_Symbol operator;
235 mike     1.1 
236                      YACCTRACE(Predicate4);
237              
238                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
239                      {
240                          yyerror("symbol array overflow");
241                          YYABORT;
242                      }
243              
244                      memset(&operator, 0, sizeof(WQL_Symbol));
245                      operator.type = WQL_TYPE_LE;
246              
247                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
248                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
249                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
250                  }
251                  | Operand WQL_GT Operand
252                  {
253                      WQL_Symbol operator;
254              
255                      YACCTRACE(Predicate5);
256 mike     1.1 
257                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
258                      {
259                          yyerror("symbol array overflow");
260                          YYABORT;
261                      }
262              
263                      memset(&operator, 0, sizeof(WQL_Symbol));
264                      operator.type = WQL_TYPE_GT;
265              
266                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
267                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
268                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
269                  }
270                  | Operand WQL_GE Operand
271                  {
272                      WQL_Symbol operator;
273              
274                      YACCTRACE(Predicate6);
275              
276                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
277 mike     1.1         {
278                          yyerror("symbol array overflow");
279                          YYABORT;
280                      }
281              
282                      memset(&operator, 0, sizeof(WQL_Symbol));
283                      operator.type = WQL_TYPE_GE;
284              
285                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
286                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
287                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
288                  }
289 krisbash 1.3     | Operand WQL_LIKE Operand
290                  {
291                      WQL_Symbol operator;
292              
293                      YACCTRACE(Predicate6);
294              
295                      /* Only WQL LIKE is supported */
296                      if (wqlstate.wql->dialect != WQL_DIALECT_WQL)
297                      {
298                          yyerror("CQL LIKE not supported");
299                          YYABORT;
300                      }
301              
302                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
303                      {
304                          yyerror("symbol array overflow");
305                          YYABORT;
306                      }
307              
308                      memset(&operator, 0, sizeof(WQL_Symbol));
309                      operator.type = WQL_TYPE_LIKE;
310 krisbash 1.3 
311                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
312                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
313                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
314                  }
315                  | WQL_IDENTIFIER WQL_ISA WQL_IDENTIFIER
316                  {
317                      WQL_Symbol lhs;
318                      WQL_Symbol rhs;
319                      WQL_Symbol operator;
320              
321                      YACCTRACE(Predicate7);
322              
323                      /* Check for symbol stack overflow */
324                      if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
325                      {
326                          yyerror("symbol array overflow");
327                          YYABORT;
328                      }
329              
330                      /* Left-hand-side (embedded property name) */
331 krisbash 1.3         memset(&lhs, 0, sizeof(WQL_Symbol));
332                      lhs.value.string = $1;
333                      lhs.type = WQL_TYPE_STRING;
334              
335                      /* Right-hand-side (embedded class name) */
336                      memset(&rhs, 0, sizeof(WQL_Symbol));
337                      rhs.value.string = $3;
338                      rhs.type = WQL_TYPE_STRING;
339              
340                      /* Operator */
341                      memset(&operator, 0, sizeof(WQL_Symbol));
342                      operator.type = WQL_TYPE_ISA;
343              
344                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = lhs;
345                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = rhs;
346                      wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
347                  }
348 mike     1.1 
349              Operand
350                  : WQL_BOOLEAN
351                  {
352                      YACCTRACE(Operand1);
353                      $$.value.boolean = $1;
354                      $$.type = WQL_TYPE_BOOLEAN;
355                  }
356                  | WQL_INTEGER
357                  {
358                      YACCTRACE(Operand2);
359                      $$.value.integer = $1;
360                      $$.type = WQL_TYPE_INTEGER;
361                  }
362                  | WQL_REAL
363                  {
364                      YACCTRACE(Operand3);
365                      $$.value.real = $1;
366                      $$.type = WQL_TYPE_REAL;
367                  }
368                  | WQL_STRING
369 mike     1.1     {
370                      YACCTRACE(Operand4);
371                      $$.value.string = $1;
372                      $$.type = WQL_TYPE_STRING;
373                  }
374 krisbash 1.3     | WQL_NULL
375 mike     1.1     {
376 krisbash 1.3         YACCTRACE(Operand6);
377                      $$.value.integer = 0;
378                      $$.type = WQL_TYPE_NULL;
379                  }
380                  | Property
381                  {
382                      YACCTRACE(Operand7);
383                      $$ = $1;
384                  }
385              
386              Property
387                  : WQL_IDENTIFIER
388                  {
389                      YACCTRACE(Property1);
390 mike     1.1         $$.value.string = $1;
391 krisbash 1.3         $$.value.embeddedClassName = NULL;
392                      $$.value.embeddedPropertyName = NULL;
393 mike     1.1         $$.type = WQL_TYPE_IDENTIFIER;
394                  }
395 krisbash 1.3     | WQL_IDENTIFIER WQL_DOT WQL_IDENTIFIER
396 mike     1.1     {
397 krisbash 1.3         MI_Char* str;
398                      YACCTRACE(Property2);
399              
400                      $$.value.string = $1;
401                      $$.value.embeddedClassName = NULL;
402                      $$.value.embeddedPropertyName = $3;
403                      $$.type = WQL_TYPE_IDENTIFIER;
404 mike     1.1     }
405 krisbash 1.3     | WQL_IDENTIFIER WQL_DOT WQL_IDENTIFIER WQL_COLON WQL_COLON WQL_IDENTIFIER
406                  {
407                      MI_Char* str;
408                      YACCTRACE(Property2);
409 mike     1.1 
410 krisbash 1.3         $$.value.string = $1;
411                      $$.value.embeddedClassName = $3;
412                      $$.value.embeddedPropertyName = $6;
413                      $$.type = WQL_TYPE_IDENTIFIER;
414                  }

ViewCVS 0.9.2