![]() ![]() |
![]() |
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.5 #if 1 | ||
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.6 PEGASUS_USING_PEGASUS; 37 38 PEGASUS_NAMESPACE_BEGIN 39 40 extern WQLParserState* globalParserState; 41 42 PEGASUS_NAMESPACE_END 43 | ||
44 mike 1.1.2.1 %} 45 46 /* 47 **============================================================================== 48 ** 49 ** Union used to pass tokens from Lexer to this Parser. 50 ** 51 **============================================================================== 52 */ 53 54 %union 55 { 56 int intValue; 57 double doubleValue; 58 char* strValue; 59 void* nodeValue; 60 } 61 62 /* 63 **============================================================================== 64 ** 65 mike 1.1.2.1 ** Tokens, types, and associative rules. 66 ** 67 **============================================================================== 68 */ 69 70 %token <intValue> TOK_INTEGER 71 %token <doubleValue> TOK_DOUBLE | ||
72 mike 1.1.2.2 %token <strValue> TOK_STRING 73 %token <intValue> TOK_TRUE 74 %token <intValue> TOK_FALSE | ||
75 mike 1.1.2.3 %token <intValue> TOK_NULL | ||
76 mike 1.1.2.2 77 %token <intValue> TOK_EQ 78 %token <intValue> TOK_NE 79 %token <intValue> TOK_LT 80 %token <intValue> TOK_LE 81 %token <intValue> TOK_GT 82 %token <intValue> TOK_GE 83 84 %token <intValue> TOK_NOT 85 %token <intValue> TOK_OR 86 %token <intValue> TOK_AND | ||
87 mike 1.1.2.3 %token <intValue> TOK_IS | ||
88 mike 1.1.2.2 | ||
89 mike 1.1.2.1 %token <strValue> TOK_IDENTIFIER | ||
90 mike 1.1.2.2 %token <intValue> TOK_SELECT 91 %token <intValue> TOK_WHERE 92 %token <intValue> TOK_FROM 93 | ||
94 mike 1.1.2.6 %token <intValue> TOK_UNEXPECTED_CHAR | ||
95 mike 1.1.2.1 | ||
96 mike 1.1.2.6 %type <strValue> propertyName | ||
97 mike 1.1.2.1 %type <nodeValue> propertyList | ||
98 mike 1.1.2.3 %type <nodeValue> predicate 99 %type <nodeValue> comparisonPredicate 100 %type <nodeValue> comparisonTerm 101 %type <nodeValue> nullPredicate 102 %type <nodeValue> searchCondition 103 %type <nodeValue> fromClause | ||
104 mike 1.1.2.1 %type <nodeValue> whereClause 105 %type <nodeValue> selectStatement | ||
106 mike 1.1.2.3 %type <nodeValue> selectList 107 %type <nodeValue> selectExpression | ||
108 mike 1.1.2.1 %type <strValue> className 109 | ||
110 mike 1.1.2.2 %left TOK_OR 111 %left TOK_AND 112 %nonassoc TOK_NOT 113 114 %% | ||
115 mike 1.1.2.1 116 /* 117 **============================================================================== 118 ** 119 ** The grammar itself. 120 ** 121 **============================================================================== 122 */ 123 124 start 125 : selectStatement 126 { | ||
127 mike 1.1.2.4 printf("YACC: start\n"); | ||
128 mike 1.1.2.1 } 129 130 selectStatement | ||
131 mike 1.1.2.3 : TOK_SELECT selectList selectExpression | ||
132 mike 1.1.2.1 { 133 134 } 135 | ||
136 mike 1.1.2.3 selectList 137 : '*' | ||
138 mike 1.1.2.1 { | ||
139 mike 1.1.2.6 globalParserState->statement->appendPropertyName("*"); | ||
140 mike 1.1.2.1 } | ||
141 mike 1.1.2.3 | propertyList | ||
142 mike 1.1.2.1 { 143 144 } 145 | ||
146 mike 1.1.2.3 propertyList 147 : propertyName | ||
148 mike 1.1.2.1 { | ||
149 mike 1.1.2.6 globalParserState->statement->appendPropertyName($1); | ||
150 mike 1.1.2.1 } | ||
151 mike 1.1.2.3 | propertyList ',' propertyName | ||
152 mike 1.1.2.1 { | ||
153 mike 1.1.2.6 globalParserState->statement->appendPropertyName($3); | ||
154 mike 1.1.2.1 } 155 | ||
156 mike 1.1.2.3 selectExpression 157 : fromClause whereClause | ||
158 mike 1.1.2.1 { 159 160 } | ||
161 mike 1.1.2.3 | fromClause | ||
162 mike 1.1.2.1 { 163 164 } 165 | ||
166 mike 1.1.2.3 fromClause 167 : TOK_FROM className | ||
168 mike 1.1.2.1 { | ||
169 mike 1.1.2.6 WQL_TRACE(("YACC: fromClause: TOK_FROM className(%s)\n", $2)); 170 globalParserState->statement->setClassName($2); 171 delete [] $2; | ||
172 mike 1.1.2.1 } 173 | ||
174 mike 1.1.2.3 whereClause 175 : TOK_WHERE searchCondition | ||
176 mike 1.1.2.1 { 177 178 } 179 | ||
180 mike 1.1.2.3 searchCondition 181 : searchCondition TOK_OR searchCondition | ||
182 mike 1.1.2.1 { | ||
183 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_OR\n")); | ||
184 mike 1.1.2.1 } | ||
185 mike 1.1.2.3 | searchCondition TOK_AND searchCondition | ||
186 mike 1.1.2.1 { | ||
187 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_AND\n")); | ||
188 mike 1.1.2.1 } | ||
189 mike 1.1.2.3 | TOK_NOT searchCondition | ||
190 mike 1.1.2.1 { 191 192 } | ||
193 mike 1.1.2.3 | '(' searchCondition ')' | ||
194 mike 1.1.2.1 { 195 196 } | ||
197 mike 1.1.2.3 | predicate | ||
198 mike 1.1.2.1 { 199 200 } | ||
201 mike 1.1.2.3 | predicate TOK_IS truthValue | ||
202 mike 1.1.2.1 { 203 204 } | ||
205 mike 1.1.2.3 | predicate TOK_IS TOK_NOT truthValue | ||
206 mike 1.1.2.1 { 207 208 } 209 | ||
210 mike 1.1.2.3 predicate 211 : comparisonPredicate | ||
212 mike 1.1.2.1 { 213 214 } | ||
215 mike 1.1.2.3 | nullPredicate | ||
216 mike 1.1.2.1 { 217 218 } 219 | ||
220 mike 1.1.2.3 comparisonPredicate 221 : comparisonTerm TOK_LT comparisonTerm | ||
222 mike 1.1.2.1 { | ||
223 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_LT\n")); | ||
224 mike 1.1.2.1 } | ||
225 mike 1.1.2.3 | comparisonTerm TOK_GT comparisonTerm | ||
226 mike 1.1.2.1 { | ||
227 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_GT\n")); | ||
228 mike 1.1.2.1 } | ||
229 mike 1.1.2.3 | comparisonTerm TOK_LE comparisonTerm | ||
230 mike 1.1.2.1 { | ||
231 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_LE\n")); | ||
232 mike 1.1.2.1 } | ||
233 mike 1.1.2.3 | comparisonTerm TOK_GE comparisonTerm | ||
234 mike 1.1.2.1 { | ||
235 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_GE\n")); | ||
236 mike 1.1.2.1 } | ||
237 mike 1.1.2.3 | comparisonTerm TOK_EQ comparisonTerm | ||
238 mike 1.1.2.1 { | ||
239 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_EQ\n")); | ||
240 mike 1.1.2.1 } | ||
241 mike 1.1.2.3 | comparisonTerm TOK_NE comparisonTerm | ||
242 mike 1.1.2.1 { | ||
243 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_NE\n")); | ||
244 mike 1.1.2.1 } 245 | ||
246 mike 1.1.2.3 nullPredicate 247 : comparisonTerm TOK_IS TOK_NULL | ||
248 mike 1.1.2.1 { | ||
249 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_IS TOK_NULL\n")); | ||
250 mike 1.1.2.1 } | ||
251 mike 1.1.2.3 | comparisonTerm TOK_IS TOK_NOT TOK_NULL | ||
252 mike 1.1.2.1 { | ||
253 mike 1.1.2.5 WQL_TRACE(("YACC: TOK_NOT TOK_NULL\n")); | ||
254 mike 1.1.2.1 } 255 | ||
256 mike 1.1.2.3 truthValue 257 : TOK_TRUE | ||
258 mike 1.1.2.1 { 259 260 } | ||
261 mike 1.1.2.3 | TOK_FALSE | ||
262 mike 1.1.2.1 { 263 264 } 265 | ||
266 mike 1.1.2.3 propertyName 267 : TOK_IDENTIFIER | ||
268 mike 1.1.2.1 { | ||
269 mike 1.1.2.6 WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1)); 270 $$ = $1; | ||
271 mike 1.1.2.1 } 272 | ||
273 mike 1.1.2.3 className : TOK_IDENTIFIER | ||
274 mike 1.1.2.1 { | ||
275 mike 1.1.2.6 WQL_TRACE(("YACC: TOK_IDENTIFIER %s\n", $1)); 276 $$ = $1; | ||
277 mike 1.1.2.1 } 278 | ||
279 mike 1.1.2.3 comparisonTerm 280 : propertyName | ||
281 mike 1.1.2.1 { 282 283 } | ||
284 mike 1.1.2.3 | TOK_INTEGER | ||
285 mike 1.1.2.1 { 286 287 } | ||
288 mike 1.1.2.3 | TOK_DOUBLE | ||
289 mike 1.1.2.1 { 290 291 } | ||
292 mike 1.1.2.3 | TOK_STRING | ||
293 mike 1.1.2.1 { 294 295 } | ||
296 mike 1.1.2.3 | truthValue | ||
297 mike 1.1.2.1 { | ||
298 mike 1.1.2.5 | ||
299 mike 1.1.2.1 } 300 301 %% |
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |