(file) Return to WQL.y CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / WQL

  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.6 	globalParserState->statement->appendPropertyName("*");
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.6 	globalParserState->statement->appendPropertyName($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.6 	globalParserState->statement->appendPropertyName($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.1     }
305 mike  1.1.2.3     | TOK_INTEGER
306 mike  1.1.2.1     {
307 mike  1.1.2.7 	globalParserState->statement->appendOperand(
308 mike  1.1.2.8 	    WQLOperand($1, WQL_INTEGER_VALUE_TAG));
309 mike  1.1.2.1     }
310 mike  1.1.2.3     | TOK_DOUBLE
311 mike  1.1.2.1     {
312 mike  1.1.2.7 	globalParserState->statement->appendOperand(
313 mike  1.1.2.8 	    WQLOperand($1, WQL_DOUBLE_VALUE_TAG));
314 mike  1.1.2.1     }
315 mike  1.1.2.3     | TOK_STRING
316 mike  1.1.2.1     {
317 mike  1.1.2.7 	globalParserState->statement->appendOperand(
318 mike  1.1.2.8 	    WQLOperand($1, WQL_STRING_VALUE_TAG));
319 mike  1.1.2.1     }
320 mike  1.1.2.3     | truthValue
321 mike  1.1.2.1     {
322 mike  1.1.2.7 	globalParserState->statement->appendOperand(
323 mike  1.1.2.8 	    WQLOperand($1 != 0, WQL_BOOLEAN_VALUE_TAG));
324 mike  1.1.2.1     }
325               
326               %%

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2