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