(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           %left WQL_OR
 35           %left WQL_AND
 36           %nonassoc WQL_NOT
 37           
 38           %token WQL_ERROR
 39           %token WQL_LT
 40           %token WQL_FROM
 41           %token WQL_LE
 42           %token WQL_WHERE
 43 mike  1.1 %token WQL_NE
 44           %token WQL_GT
 45           %token WQL_REAL
 46           %token WQL_EQ
 47           %token WQL_SELECT
 48           %token WQL_GE
 49           %token WQL_NULL
 50           
 51           %token <string> WQL_IDENTIFIER;
 52           %token <boolean> WQL_BOOLEAN;
 53           %token <integer> WQL_INTEGER;
 54           %token <real> WQL_REAL;
 55           %token <string> WQL_STRING;
 56           
 57           %type <symbol> Operand;
 58           
 59           
 60           %%
 61           
 62           Start
 63               : WQL_SELECT SelectList WQL_FROM WQL_IDENTIFIER
 64 mike  1.1     {
 65                   YACCTRACE(Start1);
 66                   wqlstate.wql->className = $4;
 67               }
 68               | WQL_SELECT SelectList WQL_FROM WQL_IDENTIFIER WQL_WHERE Condition
 69               {
 70                   YACCTRACE(Start2);
 71                   wqlstate.wql->className = $4;
 72               }
 73           
 74           SelectList
 75               : '*'
 76               {
 77                   YACCTRACE(SelectList1);
 78               }
 79               | PropertyList
 80               {
 81                   YACCTRACE(SelectList12);
 82               }
 83           
 84           PropertyList
 85 mike  1.1     : WQL_IDENTIFIER
 86               {
 87                   YACCTRACE(PropertyList1);
 88           
 89                   if (wqlstate.wql->nproperties == WQL_MAX_PROPERTIES)
 90                   {
 91                       yyerror("property array overflow");
 92                       YYABORT;
 93                   }
 94           
 95                   wqlstate.wql->properties[wqlstate.wql->nproperties++] = $1;
 96               }
 97               | PropertyList ',' WQL_IDENTIFIER
 98               {
 99                   YACCTRACE(PropertyList2);
100           
101                   if (wqlstate.wql->nproperties == WQL_MAX_PROPERTIES)
102                   {
103                       yyerror("property array overflow");
104                       YYABORT;
105                   }
106 mike  1.1 
107                   wqlstate.wql->properties[wqlstate.wql->nproperties++] = $3;
108               }
109           
110           Condition
111               : '(' Condition ')'
112               {
113                   YACCTRACE(Condition1);
114               }
115               | WQL_NOT Condition
116               {
117                   WQL_Symbol operator;
118           
119                   YACCTRACE(Condition2);
120           
121                   if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS)
122                   {
123                       yyerror("symbol array overflow");
124                       YYABORT;
125                   }
126           
127 mike  1.1         memset(&operator, 0, sizeof(WQL_Symbol));
128                   operator.type = WQL_TYPE_NOT;
129                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
130               }
131               | Condition WQL_AND Condition
132               {
133                   WQL_Symbol operator;
134           
135                   YACCTRACE(Condition3);
136           
137                   if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS)
138                   {
139                       yyerror("symbol array overflow");
140                       YYABORT;
141                   }
142           
143                   memset(&operator, 0, sizeof(WQL_Symbol));
144                   operator.type = WQL_TYPE_AND;
145                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
146               }
147               | Condition WQL_OR Condition
148 mike  1.1     {
149                   WQL_Symbol operator;
150           
151                   YACCTRACE(Condition4);
152           
153                   if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS)
154                   {
155                       yyerror("symbol array overflow");
156                       YYABORT;
157                   }
158           
159                   memset(&operator, 0, sizeof(WQL_Symbol));
160                   operator.type = WQL_TYPE_OR;
161                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
162               }
163               | Predicate
164               {
165                   YACCTRACE(Condition5);
166               }
167           
168           Predicate
169 mike  1.1     : Operand WQL_EQ Operand
170               {
171                   WQL_Symbol operator;
172           
173                   YACCTRACE(Predicate1);
174           
175                   if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
176                   {
177                       yyerror("symbol array overflow");
178                       YYABORT;
179                   }
180           
181                   memset(&operator, 0, sizeof(WQL_Symbol));
182                   operator.type = WQL_TYPE_EQ;
183           
184                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
185                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
186                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
187               }
188               | Operand WQL_NE Operand
189               {
190 mike  1.1         WQL_Symbol operator;
191           
192                   YACCTRACE(Predicate2);
193           
194                   if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
195                   {
196                       yyerror("symbol array overflow");
197                       YYABORT;
198                   }
199           
200                   memset(&operator, 0, sizeof(WQL_Symbol));
201                   operator.type = WQL_TYPE_NE;
202           
203                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
204                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
205                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
206               }
207               | Operand WQL_LT Operand
208               {
209                   WQL_Symbol operator;
210           
211 mike  1.1         YACCTRACE(Predicate3);
212           
213                   if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
214                   {
215                       yyerror("symbol array overflow");
216                       YYABORT;
217                   }
218           
219                   memset(&operator, 0, sizeof(WQL_Symbol));
220                   operator.type = WQL_TYPE_LT;
221           
222                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
223                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
224                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
225               }
226               | Operand WQL_LE Operand
227               {
228                   WQL_Symbol operator;
229           
230                   YACCTRACE(Predicate4);
231           
232 mike  1.1         if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
233                   {
234                       yyerror("symbol array overflow");
235                       YYABORT;
236                   }
237           
238                   memset(&operator, 0, sizeof(WQL_Symbol));
239                   operator.type = WQL_TYPE_LE;
240           
241                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
242                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
243                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
244               }
245               | Operand WQL_GT Operand
246               {
247                   WQL_Symbol operator;
248           
249                   YACCTRACE(Predicate5);
250           
251                   if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
252                   {
253 mike  1.1             yyerror("symbol array overflow");
254                       YYABORT;
255                   }
256           
257                   memset(&operator, 0, sizeof(WQL_Symbol));
258                   operator.type = WQL_TYPE_GT;
259           
260                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
261                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
262                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
263               }
264               | Operand WQL_GE Operand
265               {
266                   WQL_Symbol operator;
267           
268                   YACCTRACE(Predicate6);
269           
270                   if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS)
271                   {
272                       yyerror("symbol array overflow");
273                       YYABORT;
274 mike  1.1         }
275           
276                   memset(&operator, 0, sizeof(WQL_Symbol));
277                   operator.type = WQL_TYPE_GE;
278           
279                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1;
280                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3;
281                   wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator;
282               }
283           
284           Operand
285               : WQL_BOOLEAN
286               {
287                   YACCTRACE(Operand1);
288                   $$.value.boolean = $1;
289                   $$.type = WQL_TYPE_BOOLEAN;
290               }
291               | WQL_INTEGER
292               {
293                   YACCTRACE(Operand2);
294                   $$.value.integer = $1;
295 mike  1.1         $$.type = WQL_TYPE_INTEGER;
296               }
297               | WQL_REAL
298               {
299                   YACCTRACE(Operand3);
300                   $$.value.real = $1;
301                   $$.type = WQL_TYPE_REAL;
302               }
303               | WQL_STRING
304               {
305                   YACCTRACE(Operand4);
306                   $$.value.string = $1;
307                   $$.type = WQL_TYPE_STRING;
308               }
309               | WQL_IDENTIFIER
310               {
311                   YACCTRACE(Operand5);
312                   $$.value.string = $1;
313                   $$.type = WQL_TYPE_IDENTIFIER;
314               }
315               | WQL_NULL
316 mike  1.1     {
317                   YACCTRACE(Operand6);
318                   $$.value.integer = 0;
319                   $$.type = WQL_TYPE_NULL;
320               }
321           
322           %%

ViewCVS 0.9.2