1 mike 1.1.2.1 /*
2 **==============================================================================
3 **
4 ** Includes
5 **
6 **==============================================================================
7 */
8
9 %{
10
|
11 mike 1.1.2.5 #include <Pegasus/Common/Config.h>
12 #include <Pegasus/WQL/WQLOperation.h>
13 #include <Pegasus/WQL/WQLOperand.h>
|
14 mike 1.1.2.6 #include <Pegasus/WQL/WQLParserState.h>
|
15 mike 1.1.2.5 #include <Pegasus/WQL/WQLSelectStatement.h>
|
16 mike 1.1.2.1 #include <string.h>
17 #include <stdlib.h>
18
19 #ifdef PEGASUS_OS_TYPE_WINDOWS
20 # include <malloc.h>
21 #endif
22
23 #if defined(PEGASUS_COMPILER_ACC) && defined(PEGASUS_OS_HPUX)
24 # include <alloca.h>
25 #endif
26
|
27 mike 1.1.2.7 #if 0
|
28 mike 1.1.2.6 # define WQL_TRACE(X) printf X
|
29 mike 1.1.2.2 #else
30 # define WQL_TRACE(X)
31 #endif
32
|
33 mike 1.1.2.1 extern int WQL_lex();
34 extern int WQL_error(char*);
35
|
36 mike 1.1.2.7 //
37 // Define the global parser state object:
38 //
39
|
40 mike 1.1.2.6 PEGASUS_USING_PEGASUS;
41
42 PEGASUS_NAMESPACE_BEGIN
43
44 extern WQLParserState* globalParserState;
45
46 PEGASUS_NAMESPACE_END
47
|
48 mike 1.1.2.1 %}
49
50 /*
51 **==============================================================================
52 **
53 ** Union used to pass tokens from Lexer to this Parser.
54 **
55 **==============================================================================
56 */
57
58 %union
59 {
60 int intValue;
61 double doubleValue;
62 char* strValue;
63 void* nodeValue;
64 }
65
66 /*
67 **==============================================================================
68 **
69 mike 1.1.2.1 ** Tokens, types, and associative rules.
70 **
71 **==============================================================================
72 */
73
74 %token <intValue> TOK_INTEGER
75 %token <doubleValue> TOK_DOUBLE
|
76 mike 1.1.2.2 %token <strValue> TOK_STRING
77 %token <intValue> TOK_TRUE
78 %token <intValue> TOK_FALSE
|
79 mike 1.1.2.3 %token <intValue> TOK_NULL
|
80 mike 1.1.2.2
81 %token <intValue> TOK_EQ
82 %token <intValue> TOK_NE
83 %token <intValue> TOK_LT
84 %token <intValue> TOK_LE
85 %token <intValue> TOK_GT
86 %token <intValue> TOK_GE
87
88 %token <intValue> TOK_NOT
89 %token <intValue> TOK_OR
90 %token <intValue> TOK_AND
|
91 mike 1.1.2.3 %token <intValue> TOK_IS
|
92 mike 1.1.2.2
|
93 mike 1.1.2.1 %token <strValue> TOK_IDENTIFIER
|
94 mike 1.1.2.2 %token <intValue> TOK_SELECT
95 %token <intValue> TOK_WHERE
96 %token <intValue> TOK_FROM
97
|
98 mike 1.1.2.6 %token <intValue> TOK_UNEXPECTED_CHAR
|
99 mike 1.1.2.1
|
100 mike 1.1.2.6 %type <strValue> propertyName
|
101 mike 1.1.2.1 %type <nodeValue> propertyList
|
102 mike 1.1.2.3 %type <nodeValue> predicate
103 %type <nodeValue> comparisonPredicate
|
104 mike 1.1.2.7 // %type <nodeValue> comparisonTerm
|
105 mike 1.1.2.3 %type <nodeValue> nullPredicate
106 %type <nodeValue> searchCondition
107 %type <nodeValue> fromClause
|
108 mike 1.1.2.1 %type <nodeValue> whereClause
109 %type <nodeValue> selectStatement
|
110 mike 1.1.2.3 %type <nodeValue> selectList
111 %type <nodeValue> selectExpression
|
112 mike 1.1.2.1 %type <strValue> className
|
113 mike 1.1.2.7 %type <intValue> truthValue
|
114 mike 1.1.2.1
|
115 mike 1.1.2.2 %left TOK_OR
116 %left TOK_AND
117 %nonassoc TOK_NOT
118
119 %%
|
120 mike 1.1.2.1
121 /*
122 **==============================================================================
123 **
124 ** The grammar itself.
125 **
126 **==============================================================================
127 */
128
129 start
130 : selectStatement
131 {
|
132 mike 1.1.2.7 WQL_TRACE(("YACC: start\n"));
|
133 mike 1.1.2.1 }
134
135 selectStatement
|
136 mike 1.1.2.3 : TOK_SELECT selectList selectExpression
|
137 mike 1.1.2.1 {
138
139 }
140
|
141 mike 1.1.2.3 selectList
142 : '*'
|
143 mike 1.1.2.1 {
|
144 mike 1.1.2.9 globalParserState->statement->appendSelectPropertyName("*");
|
145 mike 1.1.2.1 }
|
146 mike 1.1.2.3 | propertyList
|
147 mike 1.1.2.1 {
148
149 }
150
|
151 mike 1.1.2.3 propertyList
152 : propertyName
|
153 mike 1.1.2.1 {
|
154 mike 1.1.2.9 globalParserState->statement->appendSelectPropertyName($1);
|
155 mike 1.1.2.1 }
|
156 mike 1.1.2.3 | propertyList ',' propertyName
|
157 mike 1.1.2.1 {
|
158 mike 1.1.2.9 globalParserState->statement->appendSelectPropertyName($3);
|
159 mike 1.1.2.1 }
160
|
161 mike 1.1.2.3 selectExpression
162 : fromClause whereClause
|
163 mike 1.1.2.1 {
164
165 }
|
166 mike 1.1.2.3 | fromClause
|
167 mike 1.1.2.1 {
168
169 }
170
|
171 mike 1.1.2.3 fromClause
172 : TOK_FROM className
|
173 mike 1.1.2.1 {
|
174 mike 1.1.2.6 WQL_TRACE(("YACC: fromClause: TOK_FROM className(%s)\n", $2));
175 globalParserState->statement->setClassName($2);
|
176 mike 1.1.2.1 }
177
|
178 mike 1.1.2.3 whereClause
179 : TOK_WHERE searchCondition
|
180 mike 1.1.2.1 {
181
182 }
183
|
184 mike 1.1.2.3 searchCondition
185 : searchCondition TOK_OR searchCondition
|
186 mike 1.1.2.1 {
|
187 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_OR\n"));
|
188 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_OR);
|
189 mike 1.1.2.1 }
|
190 mike 1.1.2.3 | searchCondition TOK_AND searchCondition
|
191 mike 1.1.2.1 {
|
192 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_AND\n"));
|
193 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_AND);
|
194 mike 1.1.2.1 }
|
195 mike 1.1.2.3 | TOK_NOT searchCondition
|
196 mike 1.1.2.1 {
|
197 mike 1.1.2.7 WQL_TRACE(("YACC: TOK_NOT\n"));
|
198 mike 1.1.2.1
|
199 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_NOT);
|
200 mike 1.1.2.1 }
|
201 mike 1.1.2.3 | '(' searchCondition ')'
|
202 mike 1.1.2.1 {
203
204 }
|
205 mike 1.1.2.3 | predicate
|
206 mike 1.1.2.1 {
207
208 }
|
209 mike 1.1.2.3 | predicate TOK_IS truthValue
|
210 mike 1.1.2.1 {
|
211 mike 1.1.2.7 WQLOperation op = $3 ? WQL_IS_TRUE : WQL_IS_FALSE;
212 globalParserState->statement->appendOperation(op);
|
213 mike 1.1.2.1 }
|
214 mike 1.1.2.3 | predicate TOK_IS TOK_NOT truthValue
|
215 mike 1.1.2.1 {
|
216 mike 1.1.2.7 WQLOperation op = $4 ? WQL_IS_NOT_TRUE : WQL_IS_NOT_FALSE;
217 globalParserState->statement->appendOperation(op);
|
218 mike 1.1.2.1 }
219
|
220 mike 1.1.2.7 /******************************************************************************/
221
|
222 mike 1.1.2.3 predicate
223 : comparisonPredicate
|
224 mike 1.1.2.1 {
225
226 }
|
227 mike 1.1.2.3 | nullPredicate
|
228 mike 1.1.2.1 {
229
230 }
231
|
232 mike 1.1.2.3 comparisonPredicate
233 : comparisonTerm TOK_LT comparisonTerm
|
234 mike 1.1.2.1 {
|
235 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_LT\n"));
|
236 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_LT);
|
237 mike 1.1.2.1 }
|
238 mike 1.1.2.3 | comparisonTerm TOK_GT comparisonTerm
|
239 mike 1.1.2.1 {
|
240 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_GT\n"));
|
241 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_GT);
|
242 mike 1.1.2.1 }
|
243 mike 1.1.2.3 | comparisonTerm TOK_LE comparisonTerm
|
244 mike 1.1.2.1 {
|
245 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_LE\n"));
|
246 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_LE);
|
247 mike 1.1.2.1 }
|
248 mike 1.1.2.3 | comparisonTerm TOK_GE comparisonTerm
|
249 mike 1.1.2.1 {
|
250 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_GE\n"));
|
251 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_GE);
|
252 mike 1.1.2.1 }
|
253 mike 1.1.2.3 | comparisonTerm TOK_EQ comparisonTerm
|
254 mike 1.1.2.1 {
|
255 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_EQ\n"));
|
256 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_EQ);
|
257 mike 1.1.2.1 }
|
258 mike 1.1.2.3 | comparisonTerm TOK_NE comparisonTerm
|
259 mike 1.1.2.1 {
|
260 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_NE\n"));
|
261 mike 1.1.2.7 globalParserState->statement->appendOperation(WQL_NE);
|
262 mike 1.1.2.1 }
263
|
264 mike 1.1.2.3 nullPredicate
265 : comparisonTerm TOK_IS TOK_NULL
|
266 mike 1.1.2.1 {
|
267 mike 1.1.2.7 WQL_TRACE(("YACC: nullPredicate : comparisonTerm IS NULL\n"));
268 globalParserState->statement->appendOperation(WQL_IS_NULL);
|
269 mike 1.1.2.1 }
|
270 mike 1.1.2.3 | comparisonTerm TOK_IS TOK_NOT TOK_NULL
|
271 mike 1.1.2.1 {
|
272 mike 1.1.2.7 WQL_TRACE(("YACC: nullPredicate : comparisonTerm IS NOT NULL\n"));
273 globalParserState->statement->appendOperation(WQL_IS_NOT_NULL);
|
274 mike 1.1.2.1 }
275
|
276 mike 1.1.2.3 truthValue
277 : TOK_TRUE
|
278 mike 1.1.2.1 {
|
279 mike 1.1.2.7 $$ = 1;
|
280 mike 1.1.2.1 }
|
281 mike 1.1.2.3 | TOK_FALSE
|
282 mike 1.1.2.1 {
|
283 mike 1.1.2.7 $$ = 0;
|
284 mike 1.1.2.1 }
285
|
286 mike 1.1.2.3 propertyName
287 : TOK_IDENTIFIER
|
288 mike 1.1.2.1 {
|
289 mike 1.1.2.6 WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1));
290 $$ = $1;
|
291 mike 1.1.2.1 }
292
|
293 mike 1.1.2.3 className : TOK_IDENTIFIER
|
294 mike 1.1.2.1 {
|
295 mike 1.1.2.6 WQL_TRACE(("YACC: TOK_IDENTIFIER %s\n", $1));
296 $$ = $1;
|
297 mike 1.1.2.1 }
298
|
299 mike 1.1.2.3 comparisonTerm
300 : propertyName
|
301 mike 1.1.2.1 {
|
302 mike 1.1.2.7 globalParserState->statement->appendOperand(
|
303 mike 1.1.2.8 WQLOperand($1, WQL_PROPERTY_NAME_TAG));
|
304 mike 1.1.2.9 globalParserState->statement->appendWherePropertyName($1);
|
305 mike 1.1.2.1 }
|
306 mike 1.1.2.3 | TOK_INTEGER
|
307 mike 1.1.2.1 {
|
308 mike 1.1.2.7 globalParserState->statement->appendOperand(
|
309 mike 1.1.2.8 WQLOperand($1, WQL_INTEGER_VALUE_TAG));
|
310 mike 1.1.2.1 }
|
311 mike 1.1.2.3 | TOK_DOUBLE
|
312 mike 1.1.2.1 {
|
313 mike 1.1.2.7 globalParserState->statement->appendOperand(
|
314 mike 1.1.2.8 WQLOperand($1, WQL_DOUBLE_VALUE_TAG));
|
315 mike 1.1.2.1 }
|
316 mike 1.1.2.3 | TOK_STRING
|
317 mike 1.1.2.1 {
|
318 mike 1.1.2.7 globalParserState->statement->appendOperand(
|
319 mike 1.1.2.8 WQLOperand($1, WQL_STRING_VALUE_TAG));
|
320 mike 1.1.2.1 }
|
321 mike 1.1.2.3 | truthValue
|
322 mike 1.1.2.1 {
|
323 mike 1.1.2.7 globalParserState->statement->appendOperand(
|
324 mike 1.1.2.8 WQLOperand($1 != 0, WQL_BOOLEAN_VALUE_TAG));
|
325 mike 1.1.2.1 }
326
327 %%
|