1 martin 1.17 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.18 //
|
3 martin 1.17 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.18 //
|
10 martin 1.17 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.18 //
|
17 martin 1.17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.18 //
|
20 martin 1.17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.18 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.18 //
|
28 martin 1.17 //////////////////////////////////////////////////////////////////////////
|
29 chuck 1.2 %{
30 #include <Pegasus/Common/Config.h>
31 #include <Pegasus/Common/String.h>
32 #include <Pegasus/Common/CommonUTF.h>
33 #include <Pegasus/Query/QueryCommon/QueryException.h>
34 #include <Pegasus/Common/MessageLoader.h>
35 #include <Pegasus/CQL/CQLFactory.h>
36 #include "CQLObjects.h"
37 #include <stdio.h>
38
39 #define yyparse CQL_parse
40 #define CQLPREDICATE 0
41 #define CQLVALUE 1
42 #define CQLIDENTIFIER 2
43 #define CQLFUNCTION 3
44 #define CQLCHAINEDIDENTIFIER 4
45
46 int yylex();
|
47 karl 1.13 #ifdef CQL_DEBUG_GRAMMAR
|
48 dave.sudlik 1.15 #define CQL_DEBUG_TRACE(X) \
49 printf(X);
50 #define CQL_DEBUG_TRACE2(X,Y) \
51 printf(X,Y);
|
52 karl 1.13 #else
|
53 dave.sudlik 1.15 #define CQL_DEBUG_TRACE(X)
54 #define CQL_DEBUG_TRACE2(X,Y)
|
55 karl 1.13 #endif
56
57
|
58 chuck 1.2 extern char * yytext;
59 int chain_state;
60 CQLFactory _factory = CQLFactory();
61 extern int CQL_error(const char *err);
|
62 humberto 1.6
63 enum CQLType { Id, CId, Val, Func, Fact, Trm, Expr, SPred, Pred, Str };
64
65 typedef struct CQLObjPtr {
66 void* _ptr;
|
67 kumpf 1.19 CQLType type;
|
68 humberto 1.6 } CQLOBJPTR;
69
70 Array<CQLObjPtr> _ptrs;
71 CQLOBJPTR _ObjPtr;
72
|
73 karl 1.13 PEGASUS_NAMESPACE_BEGIN
|
74 kumpf 1.19
|
75 karl 1.13 extern CQLParserState* CQL_globalParserState;
76 Array<CQLPredicate> _arglist;
77
78
79 PEGASUS_NAMESPACE_END
80
|
81 humberto 1.8
|
82 venkat.puvvada 1.16 void CQL_Arglist_Cleanup()
83 {
84 _arglist.clear();
85 }
86
|
87 humberto 1.8 void CQL_Bison_Cleanup(){
|
88 karl 1.13 for(Uint32 i = 0; i < _ptrs.size(); i++)
89 {
90 if(_ptrs[i]._ptr)
91 {
92 switch(_ptrs[i].type)
93 {
94 case Id:
95 delete (CQLIdentifier*)_ptrs[i]._ptr;
96 break;
97 case CId:
98 delete (CQLChainedIdentifier*)_ptrs[i]._ptr;
99 break;
100 case Val:
101 delete (CQLValue*)_ptrs[i]._ptr;
102 break;
103 case Func:
104 delete (CQLFunction*)_ptrs[i]._ptr;
105 break;
106 case Fact:
107 delete (CQLFactor*)_ptrs[i]._ptr;
108 break;
109 karl 1.13 case Trm:
110 delete (CQLTerm*)_ptrs[i]._ptr;
111 break;
112 case Expr:
113 delete (CQLExpression*)_ptrs[i]._ptr;
114 break;
115 case SPred:
116 delete (CQLSimplePredicate*)_ptrs[i]._ptr;
117 break;
118 case Pred:
119 delete (CQLPredicate*)_ptrs[i]._ptr;
120 break;
121 case Str:
122 delete (String*)_ptrs[i]._ptr;
123 }
124 }
125 }
|
126 venkat.puvvada 1.16 CQL_Arglist_Cleanup();
|
127 karl 1.13 _ptrs.clear();
|
128 humberto 1.6 _factory.cleanup();
|
129 karl 1.13 _factory = CQLFactory();
|
130 humberto 1.6 }
131
|
132 chuck 1.2 %}
133 %union {
|
134 karl 1.14 char * strValue;
135 String * _string;
136 CQLValue * _value;
137 CQLIdentifier * _identifier;
138 CQLChainedIdentifier * _chainedIdentifier;
139 CQLPredicate * _predicate;
140 ExpressionOpType _opType;
141 void * _node;
|
142 chuck 1.2 }
143
144 /* terminals */
|
145 kumpf 1.19 %token <strValue> TOK_IDENTIFIER
|
146 karl 1.13 %token <strValue> TOK_STRING_LITERAL
147 %token <strValue> TOK_BINARY
148 %token <strValue> TOK_NEGATIVE_BINARY
149 %token <strValue> TOK_HEXADECIMAL
150 %token <strValue> TOK_NEGATIVE_HEXADECIMAL
|
151 kumpf 1.19 %token <strValue> TOK_INTEGER
|
152 karl 1.13 %token <strValue> TOK_NEGATIVE_INTEGER
|
153 kumpf 1.19 %token <strValue> TOK_REAL
|
154 karl 1.13 %token <strValue> TOK_NEGATIVE_REAL
|
155 kumpf 1.19 %token <strValue> TOK_TRUE
156 %token <strValue> TOK_FALSE
|
157 karl 1.13 %token <strValue> TOK_SCOPED_PROPERTY
|
158 kumpf 1.19 %token <strValue> TOK_LPAR
159 %token <strValue> TOK_RPAR
|
160 karl 1.13 %token <strValue> TOK_HASH
|
161 kumpf 1.19 %token <strValue> TOK_DOT
162 %token <strValue> TOK_LBRKT
163 %token <strValue> TOK_RBRKT
|
164 karl 1.13 %token <strValue> TOK_UNDERSCORE
|
165 kumpf 1.19 %token <strValue> TOK_COMMA
166 %token <strValue> TOK_CONCAT
|
167 karl 1.13 %token <strValue> TOK_DBL_PIPE
168 %token <strValue> TOK_PLUS
|
169 kumpf 1.19 %token <strValue> TOK_MINUS
170 %token <strValue> TOK_TIMES
171 %token <strValue> TOK_DIV
172 %token <strValue> TOK_IS
173 %token <strValue> TOK_NULL
|
174 karl 1.13 %token <_opType> TOK_EQ
|
175 kumpf 1.19 %token <_opType> TOK_NE
176 %token <_opType> TOK_GT
177 %token <_opType> TOK_LT
178 %token <_opType> TOK_GE
179 %token <_opType> TOK_LE
180 %token <_opType> TOK_ISA
181 %token <_opType> TOK_LIKE
182 %token <strValue> TOK_NOT TOK_AND TOK_OR
183 %token <strValue> TOK_SCOPE
184 %token <strValue> TOK_ANY TOK_EVERY TOK_IN TOK_SATISFIES
185 %token <strValue> TOK_STAR
186 %token <strValue> TOK_DOTDOT
187 %token <strValue> TOK_SHARP TOK_DISTINCT
188 %token <strValue> TOK_SELECT
189 %token <strValue> TOK_FIRST
190 %token <strValue> TOK_FROM
191 %token <strValue> TOK_WHERE
192 %token <strValue> TOK_ORDER
193 %token <strValue> TOK_BY
194 %token <strValue> TOK_ASC
195 %token <strValue> TOK_DESC
196 kumpf 1.19 %token <strValue> TOK_AS
|
197 karl 1.13 %token <strValue> TOK_UNEXPECTED_CHAR
|
198 chuck 1.2
199
200 /* grammar - non terminals */
201 %type <_identifier> identifier
202 %type <_identifier> class_name
203 %type <_identifier> class_path
204 %type <_identifier> scoped_property
205 %type <_string> literal_string
206 %type <_value> binary_value
207 %type <_value> hex_value
208 %type <_value> decimal_value
209 %type <_value> real_value
210 %type <_value> literal
211 %type <_string> array_index
212 %type <_string> array_index_list
213 %type <_node> chain
214 %type <_predicate> concat
215 %type <_predicate> factor
216 %type <_predicate> term
217 %type <_predicate> arith
218 %type <_value> value_symbol
219 chuck 1.2 %type <_predicate> arith_or_value_symbol
220 %type <_opType> comp_op
221 %type <_predicate> comp
222 %type <_predicate> expr_factor
223 %type <_predicate> expr_term
224 %type <_predicate> expr
225 %type <_node> arg_list
226 %type <_node> from_specifier
227 %type <_node> from_criteria
228 %type <_chainedIdentifier> star_expr
229 %type <_node> selected_entry
230 %type <_node> select_list
231 %type <_node> select_list_tail
232 %type <_node> search_condition
233 %type <_node> optional_where
234 %type <_node> select_statement
235
|
236 ajay.rao 1.20 %destructor {CQL_Bison_Cleanup(); } TOK_SELECT
237
|
238 chuck 1.2 %start select_statement
239
240 %%
241
|
242 karl 1.13 /**
243 The general pattern: We construct small objects first (CQLIdentifiers,
244 CQLValues etc) which get forwared to more complex rules where more
245 complex objects are made. Eventually we have constructed a top level
246 CQLPredicate that gets added to the CQL_globalParserState select
247 statement.
248
249 Along the way we keep track of which rule we are processing so that
250 any errors encountered are specific enough to actually do us some good.
251
252 The CQLFactory object is used primarily to save space/coding efforts.
253 It enables us to build complex CQL objects with one simple call,
254 or query complex objects through one simple call.
|
255 kumpf 1.19
|
256 karl 1.13 */
|
257 humberto 1.4
|
258 chuck 1.2 /* CQLIdentifier */
|
259 kumpf 1.19 identifier : TOK_IDENTIFIER
260 {
|
261 dave.sudlik 1.15 CQL_globalParserState->currentRule = "identifier";
262 CQL_DEBUG_TRACE("BISON::identifier\n");
|
263 karl 1.13
|
264 karl 1.14 if(isUTF8Str(CQL_lval.strValue))
|
265 kumpf 1.19 {
|
266 karl 1.14 $$ = new CQLIdentifier(String(CQL_lval.strValue));
|
267 karl 1.13 _ObjPtr._ptr = $$;
268 _ObjPtr.type = Id;
269 _ptrs.append(_ObjPtr);
|
270 karl 1.14 }
271 else
272 {
|
273 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::identifier-> BAD UTF\n");
|
274 karl 1.14
275 throw CQLSyntaxErrorException(
276 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
277 "Bad UTF8 encountered parsing rule $0"
278 " in position $1.",
279 "identifier",
280 CQL_globalParserState->currentTokenPos) );
281 }
282 }
|
283 chuck 1.2 ;
284
|
285 kumpf 1.19 class_name : identifier
|
286 karl 1.14 {
|
287 dave.sudlik 1.15 CQL_globalParserState->currentRule = "class_name";
|
288 kumpf 1.19 CQL_DEBUG_TRACE2("BISON::class_name = %s\n",
|
289 dave.sudlik 1.15 (const char *)($1->getName().getString().getCString()));
|
290 karl 1.14 $$ = $1;
291 }
|
292 chuck 1.2 ;
293
|
294 kumpf 1.19 class_path : class_name
295 {
|
296 dave.sudlik 1.15 CQL_globalParserState->currentRule = "class_path";
297 CQL_DEBUG_TRACE("BISON::class_path\n");
|
298 karl 1.14 $$ = $1;
299 }
|
300 chuck 1.2 ;
|
301 karl 1.14 /**********************************
|
302 karl 1.13 property_scope : class_path TOK_SCOPE
|
303 kumpf 1.19 {
304 CQL_DEBUG_TRACE2("BISON::property_scope = %s\n",$1);
|
305 karl 1.14 }
306 ***********************************/
|
307 chuck 1.2 ;
308
309 /* CQLIdentifier */
|
310 karl 1.13 scoped_property : TOK_SCOPED_PROPERTY
|
311 karl 1.14 {
312 /*
313 TOK_SCOPED_PROPERTY can be:
314 - "A::prop"
315 - "A::class.prop"
316 - "A::class.prop#'OK'
317 - "A::class.prop[4]"
318 */
|
319 dave.sudlik 1.15 CQL_globalParserState->currentRule = "scoped_property";
320 CQL_DEBUG_TRACE2("BISON::scoped_property = %s\n", CQL_lval.strValue);
|
321 kumpf 1.19
|
322 karl 1.14 if(isUTF8Str(CQL_lval.strValue))
323 {
|
324 karl 1.13 String tmp(CQL_lval.strValue);
325 $$ = new CQLIdentifier(tmp);
326 _ObjPtr._ptr = $$;
327 _ObjPtr.type = Id;
328 _ptrs.append(_ObjPtr);
|
329 karl 1.14 }
330 else
331 {
|
332 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::scoped_property-> BAD UTF\n");
|
333 karl 1.13 throw CQLSyntaxErrorException(
334 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
335 "Bad UTF8 encountered parsing rule $0 in position $1.",
336 "scoped_property",
337 CQL_globalParserState->currentTokenPos) );
|
338 karl 1.14 }
339 }
|
340 kumpf 1.19 ;
|
341 chuck 1.2
342 /* String */
|
343 kumpf 1.19 literal_string : TOK_STRING_LITERAL
344 {
|
345 karl 1.14 /*
346 Make sure the literal is valid UTF8, then make a String
347 */
|
348 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal_string";
349 CQL_DEBUG_TRACE2("BISON::literal_string-> %s\n", CQL_lval.strValue);
|
350 kumpf 1.19
|
351 karl 1.14 if(isUTF8Str(CQL_lval.strValue))
352 {
|
353 karl 1.13 $$ = new String(CQL_lval.strValue);
354 _ObjPtr._ptr = $$;
355 _ObjPtr.type = Str;
356 _ptrs.append(_ObjPtr);
|
357 karl 1.14 }
358 else
359 {
|
360 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::literal_string-> BAD UTF\n");
|
361 kumpf 1.19
|
362 karl 1.13 throw CQLSyntaxErrorException(
363 MessageLoaderParms("CQL.CQL_y.BAD_UTF8",
364 "Bad UTF8 encountered parsing rule $0 in position $1.",
365 "literal_string",
366 CQL_globalParserState->currentTokenPos));
367 }
|
368 karl 1.14 }
|
369 chuck 1.2 ;
370
371 /* CQLValue */
|
372 kumpf 1.19 binary_value : TOK_BINARY
373 {
|
374 dave.sudlik 1.15 CQL_globalParserState->currentRule = "binary_value->TOK_BINARY";
375 CQL_DEBUG_TRACE2("BISON::binary_value-> %s\n", CQL_lval.strValue);
|
376 kumpf 1.19
377 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Binary);
|
378 dave.sudlik 1.15 _ObjPtr._ptr = $$;
379 _ObjPtr.type = Val;
380 _ptrs.append(_ObjPtr);
|
381 karl 1.14 }
|
382 kumpf 1.19 | TOK_NEGATIVE_BINARY
383 {
384 CQL_globalParserState->currentRule =
|
385 dave.sudlik 1.15 "binary_value->TOK_NEGATIVE_BINARY";
386 CQL_DEBUG_TRACE2("BISON::binary_value-> %s\n", CQL_lval.strValue);
|
387 kumpf 1.19
388 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Binary, false);
|
389 dave.sudlik 1.15 _ObjPtr._ptr = $$;
390 _ObjPtr.type = Val;
391 _ptrs.append(_ObjPtr);
|
392 karl 1.14 }
|
393 chuck 1.2 ;
394
395 /* CQLValue */
|
396 kumpf 1.19 hex_value : TOK_HEXADECIMAL
397 {
|
398 dave.sudlik 1.15 CQL_globalParserState->currentRule = "hex_value->TOK_HEXADECIMAL";
399 CQL_DEBUG_TRACE2("BISON::hex_value-> %s\n", CQL_lval.strValue);
|
400 kumpf 1.19
|
401 karl 1.14 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Hex);
402 _ObjPtr._ptr = $$;
403 _ObjPtr.type = Val;
404 _ptrs.append(_ObjPtr);
405 }
|
406 kumpf 1.19 | TOK_NEGATIVE_HEXADECIMAL
407 {
408 CQL_globalParserState->currentRule =
|
409 dave.sudlik 1.15 "hex_value->TOK_NEGATIVE_HEXADECIMAL";
410 CQL_DEBUG_TRACE2("BISON::hex_value-> %s\n", CQL_lval.strValue);
|
411 kumpf 1.19
|
412 karl 1.14 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Hex, false);
413 _ObjPtr._ptr = $$;
414 _ObjPtr.type = Val;
415 _ptrs.append(_ObjPtr);
416 }
|
417 chuck 1.2 ;
418
419 /* CQLValue */
|
420 kumpf 1.19 decimal_value : TOK_INTEGER
421 {
|
422 dave.sudlik 1.15 CQL_globalParserState->currentRule = "decimal_value->TOK_INTEGER";
423 CQL_DEBUG_TRACE2("BISON::decimal_value-> %s\n", CQL_lval.strValue);
|
424 kumpf 1.19
425 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Decimal);
|
426 karl 1.14 _ObjPtr._ptr = $$;
427 _ObjPtr.type = Val;
428 _ptrs.append(_ObjPtr);
429 }
|
430 kumpf 1.19 | TOK_NEGATIVE_INTEGER
431 {
432 CQL_globalParserState->currentRule =
|
433 dave.sudlik 1.15 "decimal_value->TOK_NEGATIVE_INTEGER";
434 CQL_DEBUG_TRACE2("BISON::decimal_value-> %s\n", CQL_lval.strValue);
|
435 kumpf 1.19
|
436 karl 1.14 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Decimal, false);
437 _ObjPtr._ptr = $$;
438 _ObjPtr.type = Val;
439 _ptrs.append(_ObjPtr);
440 }
|
441 chuck 1.2 ;
442
443 /* CQLValue */
|
444 kumpf 1.19 real_value : TOK_REAL
445 {
|
446 dave.sudlik 1.15 CQL_globalParserState->currentRule = "real_value->TOK_REAL";
447 CQL_DEBUG_TRACE2("BISON::real_value-> %s\n", CQL_lval.strValue);
|
448 kumpf 1.19
|
449 karl 1.14 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Real);
450 _ObjPtr._ptr = $$;
451 _ObjPtr.type = Val;
452 _ptrs.append(_ObjPtr);
453 }
|
454 kumpf 1.19 | TOK_NEGATIVE_REAL
455 {
|
456 dave.sudlik 1.15 CQL_globalParserState->currentRule = "real_value->TOK_NEGATIVE_REAL";
457 CQL_DEBUG_TRACE2("BISON::real_value-> %s\n", CQL_lval.strValue);
|
458 kumpf 1.19
|
459 karl 1.14 $$ = new CQLValue(CQL_lval.strValue, CQLValue::Real, false);
460 _ObjPtr._ptr = $$;
461 _ObjPtr.type = Val;
462 _ptrs.append(_ObjPtr);
463 }
|
464 chuck 1.2 ;
465
466 /* CQLValue */
|
467 kumpf 1.19 literal : literal_string
|
468 karl 1.14 {
|
469 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->literal_string";
470 CQL_DEBUG_TRACE("BISON::literal->literal_string\n");
|
471 karl 1.14 $$ = new CQLValue(*$1);
472 _ObjPtr._ptr = $$;
473 _ObjPtr.type = Val;
474 _ptrs.append(_ObjPtr);
475 }
476 | decimal_value
477 {
|
478 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->decimal_value";
479 CQL_DEBUG_TRACE("BISON::literal->decimal_value\n");
|
480 karl 1.14 }
481 | binary_value
482 {
|
483 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->binary_value";
484 CQL_DEBUG_TRACE("BISON::literal->binary_value\n");
|
485 karl 1.14 }
486 | hex_value
487 {
|
488 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->hex_value";
489 CQL_DEBUG_TRACE("BISON::literal->hex_value\n");
|
490 karl 1.14 }
491 | real_value
492 {
|
493 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->real_value";
494 CQL_DEBUG_TRACE("BISON::literal->real_value\n");
|
495 karl 1.14 }
496 | TOK_TRUE
497 {
|
498 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->TOK_TRUE";
499 CQL_DEBUG_TRACE("BISON::literal->TOK_TRUE\n");
|
500 kumpf 1.19
|
501 karl 1.14 $$ = new CQLValue(Boolean(true));
|
502 karl 1.13 _ObjPtr._ptr = $$;
|
503 karl 1.14 _ObjPtr.type = Val;
504 _ptrs.append(_ObjPtr);
505 }
506 | TOK_FALSE
507 {
|
508 dave.sudlik 1.15 CQL_globalParserState->currentRule = "literal->TOK_FALSE";
509 CQL_DEBUG_TRACE("BISON::literal->TOK_FALSE\n");
|
510 kumpf 1.19
|
511 dave.sudlik 1.15 $$ = new CQLValue(Boolean(false));
512 _ObjPtr._ptr = $$;
513 _ObjPtr.type = Val;
514 _ptrs.append(_ObjPtr);
|
515 karl 1.14 }
|
516 chuck 1.2 ;
517
518 /* String */
519 array_index : expr
|
520 karl 1.14 {
|
521 dave.sudlik 1.15 CQL_globalParserState->currentRule = "array_index->expr";
522 CQL_DEBUG_TRACE("BISON::array_index->expr\n");
|
523 kumpf 1.19
|
524 karl 1.14 CQLValue* _val = (CQLValue*)_factory.getObject($1,Predicate,Value);
525 $$ = new String(_val->toString());
526 _ObjPtr._ptr = $$;
527 _ObjPtr.type = Str;
528 _ptrs.append(_ObjPtr);
529 }
|
530 chuck 1.2 ;
531
532 /* String */
533 array_index_list : array_index
|
534 karl 1.14 {
|
535 dave.sudlik 1.15 CQL_globalParserState->currentRule = "array_index_list->array_index";
536 CQL_DEBUG_TRACE("BISON::array_index_list->array_index\n");
|
537 kumpf 1.19
|
538 karl 1.14 $$ = $1;
539 }
|
540 chuck 1.2 ;
541
542 /* void* */
543 chain : literal
|
544 karl 1.14 {
|
545 dave.sudlik 1.15 CQL_globalParserState->currentRule = "chain->literal";
546 CQL_DEBUG_TRACE("BISON::chain->literal\n");
|
547 kumpf 1.19
|
548 karl 1.14 chain_state = CQLVALUE;
|
549 kumpf 1.19 $$ = _factory.makeObject($1,Predicate);
|
550 karl 1.14 }
551
552 | TOK_LPAR expr TOK_RPAR
553 {
|
554 dave.sudlik 1.15 CQL_globalParserState->currentRule = "chain-> ( expr )";
555 CQL_DEBUG_TRACE("BISON::chain-> ( expr )\n");
|
556 karl 1.14
557 chain_state = CQLPREDICATE;
558 $$ = $2;
559 }
560
561 | identifier
562 {
|
563 dave.sudlik 1.15 CQL_globalParserState->currentRule = "chain->identifier";
564 CQL_DEBUG_TRACE("BISON::chain->identifier\n");
|
565 kumpf 1.19
|
566 karl 1.14 chain_state = CQLIDENTIFIER;
567 $$ = _factory.makeObject($1,Predicate);
568 }
569
570 | identifier TOK_HASH literal_string
571 {
|
572 kumpf 1.19 CQL_globalParserState->currentRule =
|
573 dave.sudlik 1.15 "chain->identifier#literal_string";
574 CQL_DEBUG_TRACE("BISON::chain->identifier#literal_string\n");
|
575 kumpf 1.19
|
576 karl 1.14 String tmp = $1->getName().getString();
577 tmp.append("#").append(*$3);
578 CQLIdentifier _id(tmp);
579 $$ = _factory.makeObject(&_id,Predicate);
580 chain_state = CQLIDENTIFIER;
581 }
|
582 karl 1.13
|
583 karl 1.14 | scoped_property
584 {
|
585 dave.sudlik 1.15 CQL_globalParserState->currentRule = "chain->scoped_property";
586 CQL_DEBUG_TRACE("BISON::chain->scoped_property\n");
|
587 kumpf 1.19
|
588 dave.sudlik 1.15 chain_state = CQLIDENTIFIER;
589 $$ = _factory.makeObject($1,Predicate);
|
590 karl 1.14 }
|
591 karl 1.13
|
592 karl 1.14 | identifier TOK_LPAR arg_list TOK_RPAR
593 {
|
594 dave.sudlik 1.15 CQL_globalParserState->currentRule = "identifier( arg_list )";
595 CQL_DEBUG_TRACE("BISON::identifier( arg_list )\n");
|
596 kumpf 1.19
|
597 dave.sudlik 1.15 chain_state = CQLFUNCTION;
598 CQLFunction _func(*$1,_arglist);
599 $$ = (CQLPredicate*)(_factory.makeObject(&_func,Predicate));
|
600 venkat.puvvada 1.16 CQL_Arglist_Cleanup();
|
601 karl 1.14 }
|
602 chuck 1.2
|
603 karl 1.14 | chain TOK_DOT scoped_property
604 {
|
605 dave.sudlik 1.15 CQL_globalParserState->currentRule = "chain->chain.scoped_property";
606 CQL_DEBUG_TRACE2(
607 "BISON::chain-> chain TOK_DOT scoped_property : chain_state = %d\n"
608 ,chain_state);
|
609 kumpf 1.19
|
610 karl 1.14 CQLIdentifier *_id;
611 if(chain_state == CQLIDENTIFIER)
612 {
|
613 karl 1.13 _id = ((CQLIdentifier*)(_factory.getObject(
614 $1,Predicate,Identifier)));
615 CQLChainedIdentifier _cid(*_id);
616 _cid.append(*$3);
617 $$ = _factory.makeObject(&_cid,Predicate);
|
618 karl 1.14 }
619 else if(chain_state == CQLCHAINEDIDENTIFIER)
620 {
|
621 karl 1.13 CQLChainedIdentifier *_cid;
622 _cid = ((CQLChainedIdentifier*)(_factory.getObject(
623 $1,Predicate,ChainedIdentifier)));
624 _cid->append(*$3);
625 _factory.setObject(((CQLPredicate*)$1),_cid,ChainedIdentifier);
626 $$ = $1;
|
627 karl 1.14 }
628 else /* error */
629 {
|
630 karl 1.13 String _msg("chain-> chain TOK_DOT scoped_property :"
631 " chain state not CQLIDENTIFIER or CQLCHAINEDIDENTIFIER");
|
632 karl 1.14
|
633 karl 1.13 throw CQLSyntaxErrorException(
|
634 karl 1.14 MessageLoaderParms("CQL.CQL_y.NOT_CHAINID_OR_IDENTIFIER",
635 "Chain state not a CQLIdentifier or a"
636 " CQLChainedIdentifier while parsing rule $0 in"
637 " position $1.",
638 "chain.scoped_property",
639 CQL_globalParserState->currentTokenPos));
640 }
|
641 kumpf 1.19
|
642 karl 1.14 chain_state = CQLCHAINEDIDENTIFIER;
643 }
|
644 chuck 1.2
|
645 karl 1.14 | chain TOK_DOT identifier
646 {
|
647 dave.sudlik 1.15 CQL_globalParserState->currentRule = "chain->chain.identifier";
648 CQL_DEBUG_TRACE2("BISON::chain->chain.identifier : chain_state = %d\n"
649 ,chain_state);
|
650 kumpf 1.19
|
651 karl 1.14 if(chain_state == CQLIDENTIFIER)
652 {
|
653 karl 1.13 CQLIdentifier *_id = ((CQLIdentifier*)(_factory.getObject(
|
654 karl 1.14 $1,Predicate,Identifier)));
|
655 karl 1.13 CQLChainedIdentifier _cid(*_id);
656 _cid.append(*$3);
657 $$ = _factory.makeObject(&_cid,Predicate);
|
658 karl 1.14 }
659 else if(chain_state == CQLCHAINEDIDENTIFIER)
660 {
|
661 kumpf 1.19 CQLChainedIdentifier *_cid =
|
662 karl 1.14 ((CQLChainedIdentifier*)(_factory.getObject(
663 $1,Predicate,ChainedIdentifier)));
|
664 karl 1.13 _cid->append(*$3);
665 _factory.setObject(((CQLPredicate*)$1),_cid,ChainedIdentifier);
666 $$ = $1;
|
667 karl 1.14 }
668 else /* error */
669 {
|
670 karl 1.13 String _msg("chain-> chain TOK_DOT identifier : chain state not"
671 " CQLIDENTIFIER or CQLCHAINEDIDENTIFIER");
|
672 karl 1.14
|
673 karl 1.13 throw CQLSyntaxErrorException(
|
674 karl 1.14 MessageLoaderParms("CQL.CQL_y.NOT_CHAINID_OR_IDENTIFIER",
675 "Chain state not a CQLIdentifier or a CQLChainedId"
676 "Identifier while parsing rule $0 in position $1.",
677 "chain.identifier",
678 CQL_globalParserState->currentTokenPos));
679 }
|
680 karl 1.13 chain_state = CQLCHAINEDIDENTIFIER;
|
681 karl 1.14 }
|
682 chuck 1.2
|
683 karl 1.14 | chain TOK_DOT identifier TOK_HASH literal_string
684 {
|
685 kumpf 1.19 CQL_globalParserState->currentRule =
|
686 dave.sudlik 1.15 "chain->chain.identifier#literal_string";
687 CQL_DEBUG_TRACE2(
688 "BISON::chain->chain.identifier#literal_string : chain_state = %d\n"
689 ,chain_state);
|
690 kumpf 1.19
|
691 karl 1.14 if(chain_state == CQLIDENTIFIER)
692 {
|
693 karl 1.13 CQLIdentifier *_id = ((CQLIdentifier*)(_factory.getObject(
|
694 kumpf 1.19 $1,Predicate,Identifier)));
|
695 karl 1.13 CQLChainedIdentifier _cid(*_id);
696 String tmp($3->getName().getString());
697 tmp.append("#").append(*$5);
698 CQLIdentifier _id1(tmp);
699 _cid.append(_id1);
700 _factory.setObject(((CQLPredicate*)$1),&_cid,ChainedIdentifier);
701 $$ = $1;
|
702 karl 1.14 }
703 else if(chain_state == CQLCHAINEDIDENTIFIER)
704 {
|
705 karl 1.13 CQLChainedIdentifier *_cid = ((CQLChainedIdentifier*)(
706 _factory.getObject($1,Predicate,ChainedIdentifier)));
707 String tmp($3->getName().getString());
708 tmp.append("#").append(*$5);
709 CQLIdentifier _id1(tmp);
710 _cid->append(_id1);
711 _factory.setObject(((CQLPredicate*)$1),_cid,ChainedIdentifier);
712 $$ = $1;
|
713 karl 1.14 }
714 else /* error */
715 {
|
716 karl 1.13 String _msg("chain->chain.identifier#literal_string : chain"
717 " state not CQLIDENTIFIER or CQLCHAINEDIDENTIFIER");
|
718 karl 1.14
|
719 karl 1.13 throw CQLSyntaxErrorException(
720 MessageLoaderParms("CQL.CQL_y.NOT_CHAINID_OR_IDENTIFIER",
721 "Chain state not a CQLIdentifier or a CQLChained"
722 "Identifier while parsing rule $0 in position $1.",
723 "chain.identifier#literal_string",
724 CQL_globalParserState->currentTokenPos) );
|
725 karl 1.14 }
726 chain_state = CQLCHAINEDIDENTIFIER;
727 }
|
728 karl 1.13
|
729 karl 1.14 | chain TOK_LBRKT array_index_list TOK_RBRKT
730 {
|
731 kumpf 1.19 CQL_globalParserState->currentRule =
|
732 dave.sudlik 1.15 "chain->chain[ array_index_list ]";
733 CQL_DEBUG_TRACE2(
734 "BISON::chain->chain[ array_index_list ] : chain_state = %d\n"
735 ,chain_state);
|
736 kumpf 1.19
|
737 karl 1.14 if(chain_state == CQLIDENTIFIER)
738 {
|
739 karl 1.13 CQLIdentifier *_id = ((CQLIdentifier*)
740 (_factory.getObject($1,Predicate,Identifier)));
741 String tmp = _id->getName().getString();
742 tmp.append("[").append(*$3).append("]");
743 CQLIdentifier _id1(tmp);
744 CQLChainedIdentifier _cid(_id1);
745 _factory.setObject(((CQLPredicate*)$1),&_cid,ChainedIdentifier);
|
746 kumpf 1.19 $$ = $1;
|
747 karl 1.14 }
748 else if(chain_state == CQLCHAINEDIDENTIFIER || chain_state == CQLVALUE)
749 {
|
750 karl 1.13 CQLChainedIdentifier *_cid = ((CQLChainedIdentifier*)
751 (_factory.getObject
752 ($1,Predicate,ChainedIdentifier)));
753 CQLIdentifier tmpid = _cid->getLastIdentifier();
754 String tmp = tmpid.getName().getString();
755 tmp.append("[").append(*$3).append("]");
756 CQLIdentifier _id1(tmp);
757 CQLChainedIdentifier _tmpcid(_id1);
|
758 karl 1.14
|
759 karl 1.13 if(_cid->size() == 1)
760 {
|
761 karl 1.14 _cid = &_tmpcid;
|
762 karl 1.13 }
763 else
764 {
|
765 karl 1.14 _cid->append(_id1);
|
766 karl 1.13 }
767 _factory.setObject(((CQLPredicate*)$1),_cid,ChainedIdentifier);
768 $$ = $1;
|
769 karl 1.14 }
770 else /* error */
771 {
|
772 karl 1.13 String _msg("chain->chain[ array_index_list ] : chain state not"
773 " CQLIDENTIFIER or CQLCHAINEDIDENTIFIER or CQLVALUE");
|
774 karl 1.14
|
775 karl 1.13 throw CQLSyntaxErrorException(
776 MessageLoaderParms(
777 "CQL.CQL_y.NOT_CHAINID_OR_IDENTIFIER_OR_VALUE",
778 "Chain state not a CQLIdentifier or a "
779 "CQLChainedIdentifier or a CQLValue while parsing rule"
780 " $0 in position $1.",
781 "chain->chain[ array_index_list ]",
782 CQL_globalParserState->currentTokenPos) );
|
783 chuck 1.2 }
|
784 karl 1.14 }
|
785 chuck 1.2 ;
786
787 concat : chain
|
788 karl 1.14 {
|
789 dave.sudlik 1.15 CQL_globalParserState->currentRule = "concat->chain";
790 CQL_DEBUG_TRACE("BISON::concat->chain\n");
|
791 kumpf 1.19
|
792 karl 1.14 $$ = ((CQLPredicate*)$1);
793 }
|
794 chuck 1.2
|
795 karl 1.14 | concat TOK_DBL_PIPE literal_string
796 {
|
797 kumpf 1.19 CQL_globalParserState->currentRule =
|
798 dave.sudlik 1.15 "concat->concat || literal_string";
799 CQL_DEBUG_TRACE("BISON::concat->concat || literal_string\n");
|
800 kumpf 1.19
|
801 karl 1.14 CQLValue* tmpval = new CQLValue(*$3);
802 _ObjPtr._ptr = tmpval;
803 _ObjPtr.type = Val;
|
804 kumpf 1.19 _ptrs.append(_ObjPtr);
805
|
806 karl 1.14 if((CQLPredicate*)$1->isSimple())
807 {
808 CQLSimplePredicate sp = ((CQLPredicate*)$1)->getSimplePredicate();
809 if(sp.isSimple())
|
810 humberto 1.8 {
|
811 karl 1.14 CQLExpression exp = sp.getLeftExpression();
812 if(exp.isSimple())
813 {
814 CQLTerm* _term = ((CQLTerm*)
815 (_factory.getObject($1, Predicate, Term)));
816 // check for simple literal values
817 Array<CQLFactor> factors = _term->getFactors();
818 for(Uint32 i = 0; i < factors.size(); i++)
819 {
820 if(!factors[i].isSimpleValue())
821 {
822 MessageLoaderParms mparms(
823 "CQL.CQL_y.CONCAT_PRODUCTION_FACTORS_NOT"
824 "_SIMPLE",
825 "The CQLFactors are not simple while"
826 " processing rule $0.",
827 CQL_globalParserState->currentRule);
828 throw CQLSyntaxErrorException(mparms);
829 }
830 else /* !factors[i].isSimpleValue() */
|
831 karl 1.13 {
|
832 karl 1.14 CQLValue val = factors[i].getValue();
833 if(val.getValueType() != CQLValue::String_type)
834 {
835 MessageLoaderParms mparms(
836 "CQL.CQL_y."
837 "CONCAT_PRODUCTION_VALUE_NOT_LITERAL",
838 "The CQLValue is not a string literal while"
839 " processing rule $0.",
|
840 karl 1.13 CQL_globalParserState->currentRule);
|
841 karl 1.14 throw CQLSyntaxErrorException(mparms);
842 }
|
843 karl 1.13 }
|
844 karl 1.14 } // End For factors.size() Loop
845
846 CQLFactor* _fctr2 = ((CQLFactor*)
847 (_factory.makeObject(tmpval, Factor)));
848 _term->appendOperation(concat,*_fctr2);
849 $$ = (CQLPredicate*)(_factory.makeObject
|
850 kumpf 1.19 (_term,Predicate));
|
851 karl 1.14 }
852 else /* exp.isSimple() */
853 {
854 MessageLoaderParms mparms(
|
855 karl 1.13 "CQL.CQL_y.CONCAT_PRODUCTION_NOT_SIMPLE",
856 "The $0 is not simple while processing rule $1.",
|
857 karl 1.14 "CQLExpression",
|
858 karl 1.13 CQL_globalParserState->currentRule);
|
859 karl 1.14 throw CQLSyntaxErrorException(mparms);
860 }
861 }
862 else /*sp.isSimple() */
863 {
864 MessageLoaderParms mparms(
865 "CQL.CQL_y.CONCAT_PRODUCTION_NOT_SIMPLE",
866 "The $0 is not simple while processing rule $1.",
867 "CQLSimplePredicate",
868 CQL_globalParserState->currentRule);
869 throw CQLSyntaxErrorException(mparms);
870 }
871 }
872 else /* end if((CQLPredicate*)$1->isSimple()) */
873 {
874 MessageLoaderParms mparms(
875 "CQL.CQL_y.CONCAT_PRODUCTION_NOT_SIMPLE",
876 "The $0 is not simple while processing rule $1.",
877 "CQLPredicate",
878 CQL_globalParserState->currentRule);
879 throw CQLSyntaxErrorException(mparms);
880 karl 1.14 }
881 }
|
882 chuck 1.2 ;
883
884 factor : concat
|
885 karl 1.14 {
|
886 dave.sudlik 1.15 CQL_globalParserState->currentRule = "factor->concat";
887 CQL_DEBUG_TRACE("BISON::factor->concat\n");
|
888 kumpf 1.19
|
889 karl 1.14 $$ = $1;
|
890 kumpf 1.19 }
|
891 karl 1.14 /*
892 | TOK_PLUS concat
893 {
894 add enum instead of _invert to CQLFactor,has to be either nothing,
895 + or -
896 get the factor and set the optype appropriately
|
897 kumpf 1.19 CQL_globalParserState->currentRule = "concat->TOK_PLUS concat";
|
898 karl 1.14 printf("BISON::factor->TOK_PLUS concat\n");
899 ...
900 $$ = new CQLFactor(*(CQLValue*)$2);
901 }
902 | TOK_MINUS concat
903 {
|
904 kumpf 1.19 get the factor and set the optype appropriately
|
905 karl 1.14 CQL_globalParserState->currentRule = "concat->TOK_MINUS concat";
906 printf("BISON::factor->TOK_MINUS concat\n");
907 ...
908 CQLValue *tmp = (CQLValue*)$2;
909 tmp->invert();
910 $$ = new CQLFactor(*tmp);
911 }
912 */
|
913 chuck 1.2 ;
914
915 term : factor
|
916 karl 1.14 {
|
917 dave.sudlik 1.15 CQL_globalParserState->currentRule = "term->factor";
918 CQL_DEBUG_TRACE("BISON::term->factor\n");
|
919 kumpf 1.19
|
920 karl 1.14 $$ = $1;
921 }
922 /*
923 | term TOK_STAR factor
924 {
|
925 kumpf 1.19 get factor out of $1, get factor out of $3, appendoperation,
926 then construct predicate and forward it
|
927 karl 1.14 printf("BISON::term->term TOK_STAR factor\n");
928 CQL_globalParserState->currentRule = "term->term TOK_STAR factor";
929 $1->appendOperation(mult, *$3);
930 $$ = $1;
931 }
932 | term TOK_DIV factor
933 {
|
934 kumpf 1.19 get factor out of $1, get factor out of $3, appendoperation,
935 then construct predicate and forward it
|
936 karl 1.14 CQL_globalParserState->currentRule = "term->term TOK_DIV factor";
937 printf("BISON::term->term TOK_DIV factor\n");
938 $1->appendOperation(divide, *$3);
939 $$ = $1;
940 }
941 */
|
942 chuck 1.2 ;
943
944 arith : term
|
945 dave.sudlik 1.15 {
946 CQL_globalParserState->currentRule = "arith->term";
947 CQL_DEBUG_TRACE("BISON::arith->term\n");
|
948 kumpf 1.19
|
949 dave.sudlik 1.15 //CQLPredicate* _pred = new CQLPredicate(*$1);
950 // _factory._predicates.append(_pred);
951 $$ = $1;
952 }
|
953 karl 1.14 /***********************8
|
954 karl 1.13 | arith TOK_PLUS term
|
955 karl 1.14 {
|
956 kumpf 1.19 get term out of $1, get term out of $3, appendoperation, then
|
957 karl 1.13 construct predicate and forward it
958 CQL_globalParserState->currentRule = "arith->arith TOK_PLUS term";
959 printf("BISON::arith->arith TOK_PLUS term\n");
960 $1->appendOperation(TERM_ADD, *$3);
961 $$ = $1;
|
962 karl 1.14 }
|
963 karl 1.13 | arith TOK_MINUS term
|
964 karl 1.14 {
|
965 kumpf 1.19 get term out of $1, get term out of $3, append operation, then
966 construct predicate and forward it
|
967 karl 1.13 CQL_globalParserState->currentRule = "arith->arith TOK_MINUS term";
968 printf("BISON::arith->arith TOK_MINUS term\n");
969 $1->appendOperation(TERM_SUBTRACT, *$3);
970 $$ = $1;
|
971 karl 1.14 }
972 ************************/
|
973 karl 1.13 ;
974
975 value_symbol : TOK_HASH literal_string
|
976 karl 1.14 {
|
977 dave.sudlik 1.15 CQL_globalParserState->currentRule = "value_symbol->#literal_string";
978 CQL_DEBUG_TRACE("BISON::value_symbol->#literal_string\n");
|
979 kumpf 1.19
|
980 karl 1.14 String tmp("#");
981 tmp.append(*$2);
982 CQLIdentifier tmpid(tmp);
983 $$ = new CQLValue(tmpid);
984 _ObjPtr._ptr = $$;
985 _ObjPtr.type = Val;
986 _ptrs.append(_ObjPtr);
987 }
|
988 chuck 1.2 ;
989
990 arith_or_value_symbol : arith
|
991 karl 1.14 {
|
992 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arith_or_value_symbol->arith";
993 CQL_DEBUG_TRACE("BISON::arith_or_value_symbol->arith\n");
|
994 kumpf 1.19
|
995 karl 1.14 $$ = $1;
996 }
997 | value_symbol
998 {
999 /* make into predicate */
|
1000 kumpf 1.19 CQL_globalParserState->currentRule =
|
1001 dave.sudlik 1.15 "arith_or_value_symbol->value_symbol";
1002 CQL_DEBUG_TRACE("BISON::arith_or_value_symbol->value_symbol\n");
|
1003 kumpf 1.19
|
1004 karl 1.14 CQLFactor _fctr(*$1);
1005 $$ = (CQLPredicate*)(_factory.makeObject(&_fctr, Predicate));
1006 }
|
1007 karl 1.13 ;
1008
|
1009 kumpf 1.19 comp_op : TOK_EQ
|
1010 karl 1.14 {
|
1011 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_EQ";
1012 CQL_DEBUG_TRACE("BISON::comp_op->TOK_EQ\n");
|
1013 kumpf 1.19
|
1014 dave.sudlik 1.15 $$ = EQ;
|
1015 karl 1.14 }
1016 | TOK_NE
1017 {
|
1018 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_NE";
1019 CQL_DEBUG_TRACE("BISON::comp_op->TOK_NE\n");
1020 $$ = NE;
|
1021 karl 1.14 }
|
1022 kumpf 1.19 | TOK_GT
|
1023 karl 1.14 {
|
1024 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_GT";
1025 CQL_DEBUG_TRACE("BISON::comp_op->TOK_GT\n");
|
1026 kumpf 1.19
|
1027 dave.sudlik 1.15 $$ = GT;
|
1028 karl 1.14 }
1029 | TOK_LT
1030 {
|
1031 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_LT";
1032 CQL_DEBUG_TRACE("BISON::comp_op->TOK_LT\n");
1033 $$ = LT;
|
1034 karl 1.14 }
1035 | TOK_GE
1036 {
|
1037 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_GE";
1038 CQL_DEBUG_TRACE("BISON::comp_op->TOK_GE\n");
1039 $$ = GE;
|
1040 karl 1.14 }
1041 | TOK_LE
1042 {
|
1043 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_LE";
1044 CQL_DEBUG_TRACE("BISON::comp_op->TOK_LE\n");
1045 $$ = LE;
|
1046 karl 1.14 }
|
1047 chuck 1.2 ;
1048
1049 comp : arith
|
1050 karl 1.14 {
|
1051 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp->arith";
1052 CQL_DEBUG_TRACE("BISON::comp->arith\n");
|
1053 kumpf 1.19
|
1054 karl 1.14 $$ = $1;
1055 }
1056 | arith TOK_IS TOK_NOT TOK_NULL
1057 {
|
1058 kumpf 1.19 CQL_globalParserState->currentRule =
|
1059 dave.sudlik 1.15 "comp->arith TOK_IS TOK_NOT TOK_NULL";
1060 CQL_DEBUG_TRACE("BISON::comp->arith TOK_IS TOK_NOT TOK_NULL\n");
|
1061 kumpf 1.19
|
1062 karl 1.14 CQLExpression *_expr =
|
1063 dave.sudlik 1.15 (CQLExpression*)(_factory.getObject($1,Expression));
|
1064 karl 1.14 CQLSimplePredicate _sp(*_expr, IS_NOT_NULL);
1065 _factory.setObject($1,&_sp,SimplePredicate);
1066 $$ = $1;
1067 }
1068 | arith TOK_IS TOK_NULL
1069 {
|
1070 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp->arith TOK_IS TOK_NULL";
1071 CQL_DEBUG_TRACE("BISON::comp->arith TOK_IS TOK_NULL\n");
|
1072 kumpf 1.19
|
1073 karl 1.14 CQLExpression *_expr =
|
1074 dave.sudlik 1.15 (CQLExpression*)(_factory.getObject($1,Expression));
|
1075 karl 1.14 CQLSimplePredicate _sp(*_expr, IS_NULL);
1076 _factory.setObject($1,&_sp,SimplePredicate);
1077 $$ = $1;
1078 }
1079 | arith comp_op arith_or_value_symbol
1080 {
|
1081 kumpf 1.19 CQL_globalParserState->currentRule =
|
1082 dave.sudlik 1.15 "comp->arith comp_op arith_or_value_symbol";
1083 CQL_DEBUG_TRACE("BISON::comp->arith comp_op arith_or_value_symbol\n");
|
1084 kumpf 1.19
|
1085 karl 1.14 if($1->isSimple() && $3->isSimple())
1086 {
|
1087 karl 1.13 CQLExpression* _exp1 = (CQLExpression*)
|
1088 karl 1.14 (_factory.getObject($1,Predicate,Expression));
|
1089 karl 1.13 CQLExpression* _exp2 = (CQLExpression*)
|
1090 karl 1.14 (_factory.getObject($3,Predicate,Expression));
|
1091 karl 1.13 CQLSimplePredicate _sp(*_exp1, *_exp2, $2);
1092 $$ = new CQLPredicate(_sp);
1093 _ObjPtr._ptr = $$;
|
1094 humberto 1.6 _ObjPtr.type = Pred;
1095 _ptrs.append(_ObjPtr);
|
1096 karl 1.14 }
1097 else /* error */
1098 {
1099 String _msg("comp->arith comp_op arith_or_value_symbol : $1 is "
1100 "not simple OR $3 is not simple");
1101 throw CQLSyntaxErrorException(
1102 MessageLoaderParms("CQL.CQL_y.NOT_SIMPLE",
1103 "The CQLSimplePredicate is not simple while parsing "
1104 "rule $0 in position $1.",
1105 "comp->arith comp_op arith_or_value_symbol",
1106 CQL_globalParserState->currentTokenPos) );
1107 }
1108 }
1109 | value_symbol comp_op arith
1110 {
|
1111 kumpf 1.19 CQL_globalParserState->currentRule =
|
1112 dave.sudlik 1.15 "comp->value_symbol comp_op arith";
1113 CQL_DEBUG_TRACE("BISON::comp->value_symbol comp_op arith\n");
|
1114 kumpf 1.19
|
1115 karl 1.14 if($3->isSimple())
1116 {
|
1117 karl 1.13 CQLExpression* _exp1 = (CQLExpression*)
1118 (_factory.makeObject($1, Expression));
1119 CQLExpression* _exp2 = (CQLExpression*)
1120 (_factory.getObject($3,Predicate,Expression));
1121 CQLSimplePredicate _sp(*_exp1, *_exp2, $2);
1122 $$ = new CQLPredicate(_sp);
1123 _ObjPtr._ptr = $$;
|
1124 humberto 1.6 _ObjPtr.type = Pred;
1125 _ptrs.append(_ObjPtr);
|
1126 karl 1.14 }
1127 else /* error */
1128 {
|
1129 karl 1.13 String _msg("comp->value_symbol comp_op arith : $3 is not simple");
1130 throw CQLSyntaxErrorException(
|
1131 karl 1.14 MessageLoaderParms("CQL.CQL_y.NOT_SIMPLE",
1132 "The CQLSimplePredicate is not simple while parsing"
1133 " rule $0 in position $1.",
1134 "comp->value_symbol comp_op arith",
1135 CQL_globalParserState->currentTokenPos) );
|
1136 kumpf 1.19
|
1137 karl 1.14 }
1138 }
1139 | arith TOK_ISA identifier
1140 {
|
1141 kumpf 1.19 /* make sure $1 isSimple(), get its expression, make
1142 simplepred->predicate
|
1143 karl 1.14 */
|
1144 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp->arith _TOK_ISA identifier";
1145 CQL_DEBUG_TRACE("BISON::comp->arith _TOK_ISA identifier\n");
|
1146 kumpf 1.19
|
1147 karl 1.14 CQLExpression *_expr1 = (CQLExpression*)
1148 (_factory.getObject($1,Predicate,Expression));
1149 CQLChainedIdentifier _cid(*$3);
1150 CQLExpression *_expr2 = (CQLExpression*)
1151 (_factory.makeObject(&_cid,Expression));
1152 CQLSimplePredicate _sp(*_expr1, *_expr2, ISA);
1153 _factory.setObject($1,&_sp,SimplePredicate);
1154 $$ = $1;
1155 }
1156 | arith TOK_LIKE literal_string
1157 {
|
1158 kumpf 1.19 CQL_globalParserState->currentRule =
|
1159 dave.sudlik 1.15 "comp->arith TOK_LIKE literal_string";
1160 CQL_DEBUG_TRACE("BISON::comp->arith TOK_LIKE literal_string\n");
|
1161 kumpf 1.19
|
1162 dave.sudlik 1.15 CQLExpression *_expr1 = (CQLExpression*)
|
1163 karl 1.13 (_factory.getObject($1,Predicate,Expression));
|
1164 dave.sudlik 1.15 CQLValue _val(*$3);
1165 CQLExpression *_expr2 = (CQLExpression*)
|
1166 karl 1.13 (_factory.makeObject(&_val,Expression));
|
1167 dave.sudlik 1.15 CQLSimplePredicate _sp(*_expr1, *_expr2, LIKE);
1168 _factory.setObject($1,&_sp,SimplePredicate);
1169 $$ = $1;
|
1170 karl 1.14 }
|
1171 chuck 1.2 ;
1172 expr_factor : comp
|
1173 karl 1.14 {
|
1174 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr_factor->comp";
1175 CQL_DEBUG_TRACE("BISON::expr_factor->comp\n");
|
1176 kumpf 1.19
|
1177 karl 1.14 $$ = $1;
1178 }
1179 | TOK_NOT comp
1180 {
|
1181 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr_factor->TOK_NOT comp";
1182 CQL_DEBUG_TRACE("BISON::expr_factor->TOK_NOT comp\n");
|
1183 kumpf 1.19
|
1184 karl 1.14 $2->setInverted(!($2->getInverted()));
1185 $$ = $2;
1186 }
|
1187 chuck 1.2 ;
1188
1189 expr_term : expr_factor
|
1190 karl 1.14 {
|
1191 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr_term->expr_factor";
1192 CQL_DEBUG_TRACE("BISON::expr_term->expr_factor\n");
|
1193 kumpf 1.19
|
1194 karl 1.14 $$ = $1;
1195 }
1196 | expr_term TOK_AND expr_factor
1197 {
|
1198 kumpf 1.19 CQL_globalParserState->currentRule =
|
1199 dave.sudlik 1.15 "expr_term->expr_term AND expr_factor";
1200 CQL_DEBUG_TRACE("BISON::expr_term->expr_term AND expr_factor\n");
|
1201 kumpf 1.19
|
1202 karl 1.14 $$ = new CQLPredicate();
1203 $$->appendPredicate(*$1);
|
1204 kumpf 1.19 $$->appendPredicate(*$3, AND);
|
1205 karl 1.14 _ObjPtr._ptr = $$;
1206 _ObjPtr.type = Pred;
1207 _ptrs.append(_ObjPtr);
1208 }
|
1209 chuck 1.2 ;
1210
|
1211 kumpf 1.19 expr : expr_term
|
1212 karl 1.14 {
|
1213 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr->expr_term";
1214 CQL_DEBUG_TRACE("BISON::expr->expr_term\n");
|
1215 kumpf 1.19
1216 $$ = $1;
|
1217 karl 1.14 }
1218 | expr TOK_OR expr_term
1219 {
|
1220 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr->expr OR expr_term";
1221 CQL_DEBUG_TRACE("BISON::expr->expr OR expr_term\n");
|
1222 kumpf 1.19
|
1223 karl 1.14 $$ = new CQLPredicate();
1224 $$->appendPredicate(*$1);
1225 $$->appendPredicate(*$3, OR);
1226 _ObjPtr._ptr = $$;
1227 _ObjPtr.type = Pred;
1228 _ptrs.append(_ObjPtr);
1229 }
|
1230 chuck 1.2 ;
1231
1232 arg_list : {;}
|
1233 karl 1.14 /****************
|
1234 karl 1.13 | TOK_STAR
1235 {
|
1236 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arg_list->TOK_STAR";
1237 CQL_DEBUG_TRACE("BISON::arg_list->TOK_STAR\n");
|
1238 kumpf 1.19
|
1239 karl 1.13 CQLIdentifier _id("*");
1240 CQLPredicate* _pred = (CQLPredicate*)
1241 (_factory.makeObject(&_id,Predicate));
|
1242 kumpf 1.19 _arglist.append(*_pred);
1243 since arg_list can loop back on itself,
1244 we need to store away previous solutions
|
1245 karl 1.13 production. We keep track of previous productions
1246 in the _arglist array and later pass that to CQLFunction
1247 as part of chain: identifier TOK_LPAR arg_list TOK_RPAR
|
1248 kumpf 1.19
|
1249 karl 1.13 }
|
1250 karl 1.14 *******************/
1251 | expr
1252 {
|
1253 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arg_list->arg_list_sub->expr";
1254 CQL_DEBUG_TRACE("BISON::arg_list->arg_list_sub->expr\n");
|
1255 kumpf 1.19
|
1256 karl 1.14 _arglist.append(*$1);
1257 /*
1258 since arg_list can loop back on itself,
1259 we need to store away previous solutions
1260 production. We keep track of previous productions
1261 in the _arglist array and later pass that to CQLFunction
1262 as part of chain: identifier TOK_LPAR arg_list TOK_RPAR
1263 */
1264 }
|
1265 karl 1.13 /****************************
1266 | TOK_DISTINCT TOK_STAR
1267 {
|
1268 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arg_list->TOK_DISTINCT TOK_STAR";
1269 CQL_DEBUG_TRACE("BISON::arg_list->TOK_DISTINCT TOK_STAR\n");
|
1270 karl 1.13
1271 CQLIdentifier _id("DISTINCTSTAR");
1272 CQLPredicate* _pred = (CQLPredicate*)
1273 (_factory.makeObject(&_id,Predicate));
1274 _arglist.append(*_pred);
1275 }
1276 | arg_list_sub arg_list_tail
1277 {
|
1278 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list->arg_list_sub arg_list_tail\n");
|
1279 karl 1.13 }
|
1280 chuck 1.2 ;
1281
1282 arg_list_sub : expr
|
1283 karl 1.13 {
|
1284 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list_sub->expr\n");
|
1285 kumpf 1.19
1286 _arlist.append(*$1);
1287 }
|
1288 karl 1.13 | TOK_DISTINCT expr
1289 {
|
1290 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list_sub->TOK_DISTINCT expr\n");
|
1291 kumpf 1.19
|
1292 karl 1.13 String tmp1("TOK_DISTINCT");
1293 CQLIdentifier* _id = (CQLIdentifier*)
1294 (_factory.getObject($1,Predicate,Identifier));
1295 String tmp2(_id->getName().getString());
1296 tmp1.append(tmp2);
1297 CQLIdentifier _id1(tmp1);
1298 }
|
1299 chuck 1.2 ;
1300
1301 arg_list_tail : {;}
|
1302 karl 1.13 | TOK_COMMA arg_list_sub arg_list_tail
1303 {
|
1304 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list_tail->TOK_COMMA arg_list_sub"
|
1305 karl 1.14 " arg_list_tail\n");
|
1306 karl 1.13 }
|
1307 chuck 1.2 ;
|
1308 karl 1.13 *******************/
1309
|
1310 chuck 1.2 from_specifier : class_path
|
1311 karl 1.14 {
|
1312 dave.sudlik 1.15 CQL_globalParserState->currentRule = "from_specifier->class_path";
1313 CQL_DEBUG_TRACE("BISON::from_specifier->class_path\n");
|
1314 kumpf 1.19
|
1315 karl 1.14 CQL_globalParserState->statement->appendClassPath(*$1);
|
1316 kumpf 1.19 }
|
1317 karl 1.14 | class_path TOK_AS identifier
1318 {
|
1319 kumpf 1.19 CQL_globalParserState->currentRule =
|
1320 dave.sudlik 1.15 "from_specifier->class_path TOK_AS identifier";
1321 CQL_DEBUG_TRACE(
1322 "BISON::from_specifier->class_path TOK_AS identifier\n");
|
1323 kumpf 1.19
|
1324 karl 1.14 CQLIdentifier _class(*$1);
1325 String _alias($3->getName().getString());
1326 CQL_globalParserState->statement->insertClassPathAlias(_class,_alias);
1327 CQL_globalParserState->statement->appendClassPath(_class);
1328 }
1329 | class_path identifier
1330 {
|
1331 kumpf 1.19 CQL_globalParserState->currentRule =
|
1332 dave.sudlik 1.15 "from_specifier->class_path identifier";
1333 CQL_DEBUG_TRACE("BISON::from_specifier->class_path identifier\n");
|
1334 kumpf 1.19
|
1335 karl 1.14 CQLIdentifier _class(*$1);
1336 String _alias($2->getName().getString());
1337 CQL_globalParserState->statement->insertClassPathAlias(_class,_alias);
1338 CQL_globalParserState->statement->appendClassPath(_class);
1339 }
|
1340 chuck 1.2 ;
1341
1342 from_criteria : from_specifier
|
1343 karl 1.14 {
|
1344 dave.sudlik 1.15 CQL_globalParserState->currentRule = "from_criteria->from_specifier";
1345 CQL_DEBUG_TRACE("BISON::from_criteria->from_specifier\n");
|
1346 karl 1.14 }
|
1347 karl 1.13 ;
1348
1349 star_expr : TOK_STAR
|
1350 karl 1.14 {
|
1351 dave.sudlik 1.15 CQL_globalParserState->currentRule = "star_expr->TOK_STAR";
1352 CQL_DEBUG_TRACE("BISON::star_expr->TOK_STAR\n");
|
1353 kumpf 1.19
|
1354 karl 1.14 CQLIdentifier _id("*");
1355 $$ = (CQLChainedIdentifier*)
1356 (_factory.makeObject(&_id,ChainedIdentifier));
1357 }
1358 | chain TOK_DOT TOK_STAR
1359 {
|
1360 dave.sudlik 1.15 CQL_globalParserState->currentRule = "star_expr->chain.*";
1361 CQL_DEBUG_TRACE("BISON::star_expr->chain.*\n");
|
1362 kumpf 1.19
|
1363 karl 1.14 CQLChainedIdentifier* _tmp = (CQLChainedIdentifier*)
1364 (_factory.getObject($1,Predicate,ChainedIdentifier));
1365 CQLChainedIdentifier* _cid = new CQLChainedIdentifier(*_tmp);
|
1366 karl 1.13 CQLIdentifier _id("*");
|
1367 karl 1.14 _cid->append(_id);
1368 $$ = _cid;
1369 _ObjPtr._ptr = $$;
1370 _ObjPtr.type = CId;
1371 _ptrs.append(_ObjPtr);
1372 }
|
1373 chuck 1.2 ;
1374
|
1375 kumpf 1.19 selected_entry : expr
|
1376 karl 1.14 {
|
1377 dave.sudlik 1.15 CQL_globalParserState->currentRule = "selected_entry->expr";
1378 CQL_DEBUG_TRACE("BISON::selected_entry->expr\n");
|
1379 kumpf 1.19
|
1380 karl 1.14 if($1->isSimpleValue())
1381 {
|
1382 karl 1.13 CQLChainedIdentifier *_cid = (CQLChainedIdentifier*)
1383 (_factory.getObject($1,Predicate,ChainedIdentifier));
1384 CQL_globalParserState->statement->appendSelectIdentifier(*_cid);
|
1385 karl 1.14 }
1386 else /* errot*/
1387 {
|
1388 karl 1.13 String _msg("selected_entry->expr : $1 is not a simple value");
1389 throw CQLSyntaxErrorException(
1390 MessageLoaderParms("CQL.CQL_y.NOT_SIMPLE_VALUE",
1391 "The CQLPredicate is not a simple value while "
1392 "parsing rule $0 in position $1.",
1393 "selected_entry->expr",
|
1394 kumpf 1.19 CQL_globalParserState->currentTokenPos) );
|
1395 karl 1.14 }
1396 }
1397 | star_expr
1398 {
|
1399 dave.sudlik 1.15 CQL_globalParserState->currentRule = "selected_entry->star_expr";
1400 CQL_DEBUG_TRACE("BISON::selected_entry->star_expr\n");
|
1401 kumpf 1.19
|
1402 karl 1.14 CQL_globalParserState->statement->appendSelectIdentifier(*$1);
1403 }
|
1404 chuck 1.2 ;
1405
1406 select_list : selected_entry select_list_tail
|
1407 karl 1.14 {
|
1408 kumpf 1.19 CQL_globalParserState->currentRule =
|
1409 dave.sudlik 1.15 "select_list->selected_entry select_list_tail";
1410 CQL_DEBUG_TRACE(
1411 "BISON::select_list->selected_entry select_list_tail\n");
|
1412 karl 1.14 }
|
1413 chuck 1.2 ;
1414
1415 select_list_tail : {;} /* empty */
|
1416 karl 1.14
1417 | TOK_COMMA selected_entry select_list_tail
1418 {
|
1419 kumpf 1.19 CQL_globalParserState->currentRule =
|
1420 dave.sudlik 1.15 "select_list_tail->TOK_COMMA selected_entry select_list_tail";
1421 CQL_DEBUG_TRACE(
1422 "BISON::select_list_tail->TOK_COMMA"
1423 " selected_entry select_list_tail\n");
|
1424 karl 1.14 }
|
1425 chuck 1.2 ;
1426
1427 search_condition : expr
|
1428 karl 1.14 {
|
1429 dave.sudlik 1.15 CQL_globalParserState->currentRule = "search_condition->expr";
1430 CQL_DEBUG_TRACE("BISON::search_condition->expr\n");
|
1431 kumpf 1.19
|
1432 karl 1.14 CQL_globalParserState->statement->setPredicate(*$1);
1433 }
|
1434 chuck 1.2 ;
1435
|
1436 humberto 1.6 optional_where : {}
|
1437 karl 1.13
|
1438 karl 1.14 | TOK_WHERE search_condition
1439 {
|
1440 kumpf 1.19 CQL_globalParserState->currentRule =
|
1441 dave.sudlik 1.15 "optional_where->TOK_WHERE search_condition";
1442 CQL_DEBUG_TRACE(
1443 "BISON::optional_where->TOK_WHERE search_condition\n");
|
1444 kumpf 1.19
|
1445 karl 1.14 CQL_globalParserState->statement->setHasWhereClause();
1446 }
|
1447 karl 1.13 ;
1448
|
1449 kumpf 1.19 select_statement : TOK_SELECT select_list TOK_FROM from_criteria optional_where
|
1450 karl 1.14 {
|
1451 dave.sudlik 1.15 CQL_globalParserState->currentRule = "select_statement";
1452 CQL_DEBUG_TRACE("select_statement\n");
|
1453 kumpf 1.19
|
1454 karl 1.14 CQL_Bison_Cleanup();
1455 }
|
1456 kumpf 1.19
|
1457 chuck 1.2 ;
1458
1459 %%
|
1460 karl 1.14 /*int yyerror(char * err){yyclearin; yyerrok;throw Exception(String(err));
1461 return 1;}*/
|