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