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 CQLPredicate* _pred = (CQLPredicate*)$1;
751 CQLChainedIdentifier *_cid = ((CQLChainedIdentifier*)
752 (_factory.getObject
753 ($1,Predicate,ChainedIdentifier)));
754 CQLIdentifier tmpid = _cid->getLastIdentifier();
755 String tmp = tmpid.getName().getString();
756 tmp.append("[").append(*$3).append("]");
757 CQLIdentifier _id1(tmp);
758 CQLChainedIdentifier _tmpcid(_id1);
|
759 karl 1.14
|
760 karl 1.13 if(_cid->size() == 1)
761 {
|
762 karl 1.14 _cid = &_tmpcid;
|
763 karl 1.13 }
764 else
765 {
|
766 karl 1.14 _cid->append(_id1);
|
767 karl 1.13 }
768 _factory.setObject(((CQLPredicate*)$1),_cid,ChainedIdentifier);
769 $$ = $1;
|
770 karl 1.14 }
771 else /* error */
772 {
|
773 karl 1.13 String _msg("chain->chain[ array_index_list ] : chain state not"
774 " CQLIDENTIFIER or CQLCHAINEDIDENTIFIER or CQLVALUE");
|
775 karl 1.14
|
776 karl 1.13 throw CQLSyntaxErrorException(
777 MessageLoaderParms(
778 "CQL.CQL_y.NOT_CHAINID_OR_IDENTIFIER_OR_VALUE",
779 "Chain state not a CQLIdentifier or a "
780 "CQLChainedIdentifier or a CQLValue while parsing rule"
781 " $0 in position $1.",
782 "chain->chain[ array_index_list ]",
783 CQL_globalParserState->currentTokenPos) );
|
784 chuck 1.2 }
|
785 karl 1.14 }
|
786 chuck 1.2 ;
787
788 concat : chain
|
789 karl 1.14 {
|
790 dave.sudlik 1.15 CQL_globalParserState->currentRule = "concat->chain";
791 CQL_DEBUG_TRACE("BISON::concat->chain\n");
|
792 kumpf 1.19
|
793 karl 1.14 $$ = ((CQLPredicate*)$1);
794 }
|
795 chuck 1.2
|
796 karl 1.14 | concat TOK_DBL_PIPE literal_string
797 {
|
798 kumpf 1.19 CQL_globalParserState->currentRule =
|
799 dave.sudlik 1.15 "concat->concat || literal_string";
800 CQL_DEBUG_TRACE("BISON::concat->concat || literal_string\n");
|
801 kumpf 1.19
|
802 karl 1.14 CQLValue* tmpval = new CQLValue(*$3);
803 _ObjPtr._ptr = tmpval;
804 _ObjPtr.type = Val;
|
805 kumpf 1.19 _ptrs.append(_ObjPtr);
806
|
807 karl 1.14 if((CQLPredicate*)$1->isSimple())
808 {
809 CQLSimplePredicate sp = ((CQLPredicate*)$1)->getSimplePredicate();
810 if(sp.isSimple())
|
811 humberto 1.8 {
|
812 karl 1.14 CQLExpression exp = sp.getLeftExpression();
813 if(exp.isSimple())
814 {
815 CQLTerm* _term = ((CQLTerm*)
816 (_factory.getObject($1, Predicate, Term)));
817 // check for simple literal values
818 Array<CQLFactor> factors = _term->getFactors();
819 for(Uint32 i = 0; i < factors.size(); i++)
820 {
821 if(!factors[i].isSimpleValue())
822 {
823 MessageLoaderParms mparms(
824 "CQL.CQL_y.CONCAT_PRODUCTION_FACTORS_NOT"
825 "_SIMPLE",
826 "The CQLFactors are not simple while"
827 " processing rule $0.",
828 CQL_globalParserState->currentRule);
829 throw CQLSyntaxErrorException(mparms);
830 }
831 else /* !factors[i].isSimpleValue() */
|
832 karl 1.13 {
|
833 karl 1.14 CQLValue val = factors[i].getValue();
834 if(val.getValueType() != CQLValue::String_type)
835 {
836 MessageLoaderParms mparms(
837 "CQL.CQL_y."
838 "CONCAT_PRODUCTION_VALUE_NOT_LITERAL",
839 "The CQLValue is not a string literal while"
840 " processing rule $0.",
|
841 karl 1.13 CQL_globalParserState->currentRule);
|
842 karl 1.14 throw CQLSyntaxErrorException(mparms);
843 }
|
844 karl 1.13 }
|
845 karl 1.14 } // End For factors.size() Loop
846
847 CQLFactor* _fctr2 = ((CQLFactor*)
848 (_factory.makeObject(tmpval, Factor)));
849 _term->appendOperation(concat,*_fctr2);
850 $$ = (CQLPredicate*)(_factory.makeObject
|
851 kumpf 1.19 (_term,Predicate));
|
852 karl 1.14 }
853 else /* exp.isSimple() */
854 {
855 MessageLoaderParms mparms(
|
856 karl 1.13 "CQL.CQL_y.CONCAT_PRODUCTION_NOT_SIMPLE",
857 "The $0 is not simple while processing rule $1.",
|
858 karl 1.14 "CQLExpression",
|
859 karl 1.13 CQL_globalParserState->currentRule);
|
860 karl 1.14 throw CQLSyntaxErrorException(mparms);
861 }
862 }
863 else /*sp.isSimple() */
864 {
865 MessageLoaderParms mparms(
866 "CQL.CQL_y.CONCAT_PRODUCTION_NOT_SIMPLE",
867 "The $0 is not simple while processing rule $1.",
868 "CQLSimplePredicate",
869 CQL_globalParserState->currentRule);
870 throw CQLSyntaxErrorException(mparms);
871 }
872 }
873 else /* end if((CQLPredicate*)$1->isSimple()) */
874 {
875 MessageLoaderParms mparms(
876 "CQL.CQL_y.CONCAT_PRODUCTION_NOT_SIMPLE",
877 "The $0 is not simple while processing rule $1.",
878 "CQLPredicate",
879 CQL_globalParserState->currentRule);
880 throw CQLSyntaxErrorException(mparms);
881 karl 1.14 }
882 }
|
883 chuck 1.2 ;
884
885 factor : concat
|
886 karl 1.14 {
|
887 dave.sudlik 1.15 CQL_globalParserState->currentRule = "factor->concat";
888 CQL_DEBUG_TRACE("BISON::factor->concat\n");
|
889 kumpf 1.19
|
890 karl 1.14 $$ = $1;
|
891 kumpf 1.19 }
|
892 karl 1.14 /*
893 | TOK_PLUS concat
894 {
895 add enum instead of _invert to CQLFactor,has to be either nothing,
896 + or -
897 get the factor and set the optype appropriately
|
898 kumpf 1.19 CQL_globalParserState->currentRule = "concat->TOK_PLUS concat";
|
899 karl 1.14 printf("BISON::factor->TOK_PLUS concat\n");
900 ...
901 $$ = new CQLFactor(*(CQLValue*)$2);
902 }
903 | TOK_MINUS concat
904 {
|
905 kumpf 1.19 get the factor and set the optype appropriately
|
906 karl 1.14 CQL_globalParserState->currentRule = "concat->TOK_MINUS concat";
907 printf("BISON::factor->TOK_MINUS concat\n");
908 ...
909 CQLValue *tmp = (CQLValue*)$2;
910 tmp->invert();
911 $$ = new CQLFactor(*tmp);
912 }
913 */
|
914 chuck 1.2 ;
915
916 term : factor
|
917 karl 1.14 {
|
918 dave.sudlik 1.15 CQL_globalParserState->currentRule = "term->factor";
919 CQL_DEBUG_TRACE("BISON::term->factor\n");
|
920 kumpf 1.19
|
921 karl 1.14 $$ = $1;
922 }
923 /*
924 | term TOK_STAR factor
925 {
|
926 kumpf 1.19 get factor out of $1, get factor out of $3, appendoperation,
927 then construct predicate and forward it
|
928 karl 1.14 printf("BISON::term->term TOK_STAR factor\n");
929 CQL_globalParserState->currentRule = "term->term TOK_STAR factor";
930 $1->appendOperation(mult, *$3);
931 $$ = $1;
932 }
933 | term TOK_DIV factor
934 {
|
935 kumpf 1.19 get factor out of $1, get factor out of $3, appendoperation,
936 then construct predicate and forward it
|
937 karl 1.14 CQL_globalParserState->currentRule = "term->term TOK_DIV factor";
938 printf("BISON::term->term TOK_DIV factor\n");
939 $1->appendOperation(divide, *$3);
940 $$ = $1;
941 }
942 */
|
943 chuck 1.2 ;
944
945 arith : term
|
946 dave.sudlik 1.15 {
947 CQL_globalParserState->currentRule = "arith->term";
948 CQL_DEBUG_TRACE("BISON::arith->term\n");
|
949 kumpf 1.19
|
950 dave.sudlik 1.15 //CQLPredicate* _pred = new CQLPredicate(*$1);
951 // _factory._predicates.append(_pred);
952 $$ = $1;
953 }
|
954 karl 1.14 /***********************8
|
955 karl 1.13 | arith TOK_PLUS term
|
956 karl 1.14 {
|
957 kumpf 1.19 get term out of $1, get term out of $3, appendoperation, then
|
958 karl 1.13 construct predicate and forward it
959 CQL_globalParserState->currentRule = "arith->arith TOK_PLUS term";
960 printf("BISON::arith->arith TOK_PLUS term\n");
961 $1->appendOperation(TERM_ADD, *$3);
962 $$ = $1;
|
963 karl 1.14 }
|
964 karl 1.13 | arith TOK_MINUS term
|
965 karl 1.14 {
|
966 kumpf 1.19 get term out of $1, get term out of $3, append operation, then
967 construct predicate and forward it
|
968 karl 1.13 CQL_globalParserState->currentRule = "arith->arith TOK_MINUS term";
969 printf("BISON::arith->arith TOK_MINUS term\n");
970 $1->appendOperation(TERM_SUBTRACT, *$3);
971 $$ = $1;
|
972 karl 1.14 }
973 ************************/
|
974 karl 1.13 ;
975
976 value_symbol : TOK_HASH literal_string
|
977 karl 1.14 {
|
978 dave.sudlik 1.15 CQL_globalParserState->currentRule = "value_symbol->#literal_string";
979 CQL_DEBUG_TRACE("BISON::value_symbol->#literal_string\n");
|
980 kumpf 1.19
|
981 karl 1.14 String tmp("#");
982 tmp.append(*$2);
983 CQLIdentifier tmpid(tmp);
984 $$ = new CQLValue(tmpid);
985 _ObjPtr._ptr = $$;
986 _ObjPtr.type = Val;
987 _ptrs.append(_ObjPtr);
988 }
|
989 chuck 1.2 ;
990
991 arith_or_value_symbol : arith
|
992 karl 1.14 {
|
993 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arith_or_value_symbol->arith";
994 CQL_DEBUG_TRACE("BISON::arith_or_value_symbol->arith\n");
|
995 kumpf 1.19
|
996 karl 1.14 $$ = $1;
997 }
998 | value_symbol
999 {
1000 /* make into predicate */
|
1001 kumpf 1.19 CQL_globalParserState->currentRule =
|
1002 dave.sudlik 1.15 "arith_or_value_symbol->value_symbol";
1003 CQL_DEBUG_TRACE("BISON::arith_or_value_symbol->value_symbol\n");
|
1004 kumpf 1.19
|
1005 karl 1.14 CQLFactor _fctr(*$1);
1006 $$ = (CQLPredicate*)(_factory.makeObject(&_fctr, Predicate));
1007 }
|
1008 karl 1.13 ;
1009
|
1010 kumpf 1.19 comp_op : TOK_EQ
|
1011 karl 1.14 {
|
1012 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_EQ";
1013 CQL_DEBUG_TRACE("BISON::comp_op->TOK_EQ\n");
|
1014 kumpf 1.19
|
1015 dave.sudlik 1.15 $$ = EQ;
|
1016 karl 1.14 }
1017 | TOK_NE
1018 {
|
1019 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_NE";
1020 CQL_DEBUG_TRACE("BISON::comp_op->TOK_NE\n");
1021 $$ = NE;
|
1022 karl 1.14 }
|
1023 kumpf 1.19 | TOK_GT
|
1024 karl 1.14 {
|
1025 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_GT";
1026 CQL_DEBUG_TRACE("BISON::comp_op->TOK_GT\n");
|
1027 kumpf 1.19
|
1028 dave.sudlik 1.15 $$ = GT;
|
1029 karl 1.14 }
1030 | TOK_LT
1031 {
|
1032 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_LT";
1033 CQL_DEBUG_TRACE("BISON::comp_op->TOK_LT\n");
1034 $$ = LT;
|
1035 karl 1.14 }
1036 | TOK_GE
1037 {
|
1038 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_GE";
1039 CQL_DEBUG_TRACE("BISON::comp_op->TOK_GE\n");
1040 $$ = GE;
|
1041 karl 1.14 }
1042 | TOK_LE
1043 {
|
1044 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp_op->TOK_LE";
1045 CQL_DEBUG_TRACE("BISON::comp_op->TOK_LE\n");
1046 $$ = LE;
|
1047 karl 1.14 }
|
1048 chuck 1.2 ;
1049
1050 comp : arith
|
1051 karl 1.14 {
|
1052 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp->arith";
1053 CQL_DEBUG_TRACE("BISON::comp->arith\n");
|
1054 kumpf 1.19
|
1055 karl 1.14 $$ = $1;
1056 }
1057 | arith TOK_IS TOK_NOT TOK_NULL
1058 {
|
1059 kumpf 1.19 CQL_globalParserState->currentRule =
|
1060 dave.sudlik 1.15 "comp->arith TOK_IS TOK_NOT TOK_NULL";
1061 CQL_DEBUG_TRACE("BISON::comp->arith TOK_IS TOK_NOT TOK_NULL\n");
|
1062 kumpf 1.19
|
1063 karl 1.14 CQLExpression *_expr =
|
1064 dave.sudlik 1.15 (CQLExpression*)(_factory.getObject($1,Expression));
|
1065 karl 1.14 CQLSimplePredicate _sp(*_expr, IS_NOT_NULL);
1066 _factory.setObject($1,&_sp,SimplePredicate);
1067 $$ = $1;
1068 }
1069 | arith TOK_IS TOK_NULL
1070 {
|
1071 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp->arith TOK_IS TOK_NULL";
1072 CQL_DEBUG_TRACE("BISON::comp->arith TOK_IS TOK_NULL\n");
|
1073 kumpf 1.19
|
1074 karl 1.14 CQLExpression *_expr =
|
1075 dave.sudlik 1.15 (CQLExpression*)(_factory.getObject($1,Expression));
|
1076 karl 1.14 CQLSimplePredicate _sp(*_expr, IS_NULL);
1077 _factory.setObject($1,&_sp,SimplePredicate);
1078 $$ = $1;
1079 }
1080 | arith comp_op arith_or_value_symbol
1081 {
|
1082 kumpf 1.19 CQL_globalParserState->currentRule =
|
1083 dave.sudlik 1.15 "comp->arith comp_op arith_or_value_symbol";
1084 CQL_DEBUG_TRACE("BISON::comp->arith comp_op arith_or_value_symbol\n");
|
1085 kumpf 1.19
|
1086 karl 1.14 if($1->isSimple() && $3->isSimple())
1087 {
|
1088 karl 1.13 CQLExpression* _exp1 = (CQLExpression*)
|
1089 karl 1.14 (_factory.getObject($1,Predicate,Expression));
|
1090 karl 1.13 CQLExpression* _exp2 = (CQLExpression*)
|
1091 karl 1.14 (_factory.getObject($3,Predicate,Expression));
|
1092 karl 1.13 CQLSimplePredicate _sp(*_exp1, *_exp2, $2);
1093 $$ = new CQLPredicate(_sp);
1094 _ObjPtr._ptr = $$;
|
1095 humberto 1.6 _ObjPtr.type = Pred;
1096 _ptrs.append(_ObjPtr);
|
1097 karl 1.14 }
1098 else /* error */
1099 {
1100 String _msg("comp->arith comp_op arith_or_value_symbol : $1 is "
1101 "not simple OR $3 is not simple");
1102 throw CQLSyntaxErrorException(
1103 MessageLoaderParms("CQL.CQL_y.NOT_SIMPLE",
1104 "The CQLSimplePredicate is not simple while parsing "
1105 "rule $0 in position $1.",
1106 "comp->arith comp_op arith_or_value_symbol",
1107 CQL_globalParserState->currentTokenPos) );
1108 }
1109 }
1110 | value_symbol comp_op arith
1111 {
|
1112 kumpf 1.19 CQL_globalParserState->currentRule =
|
1113 dave.sudlik 1.15 "comp->value_symbol comp_op arith";
1114 CQL_DEBUG_TRACE("BISON::comp->value_symbol comp_op arith\n");
|
1115 kumpf 1.19
|
1116 karl 1.14 if($3->isSimple())
1117 {
|
1118 karl 1.13 CQLExpression* _exp1 = (CQLExpression*)
1119 (_factory.makeObject($1, Expression));
1120 CQLExpression* _exp2 = (CQLExpression*)
1121 (_factory.getObject($3,Predicate,Expression));
1122 CQLSimplePredicate _sp(*_exp1, *_exp2, $2);
1123 $$ = new CQLPredicate(_sp);
1124 _ObjPtr._ptr = $$;
|
1125 humberto 1.6 _ObjPtr.type = Pred;
1126 _ptrs.append(_ObjPtr);
|
1127 karl 1.14 }
1128 else /* error */
1129 {
|
1130 karl 1.13 String _msg("comp->value_symbol comp_op arith : $3 is not simple");
1131 throw CQLSyntaxErrorException(
|
1132 karl 1.14 MessageLoaderParms("CQL.CQL_y.NOT_SIMPLE",
1133 "The CQLSimplePredicate is not simple while parsing"
1134 " rule $0 in position $1.",
1135 "comp->value_symbol comp_op arith",
1136 CQL_globalParserState->currentTokenPos) );
|
1137 kumpf 1.19
|
1138 karl 1.14 }
1139 }
1140 | arith TOK_ISA identifier
1141 {
|
1142 kumpf 1.19 /* make sure $1 isSimple(), get its expression, make
1143 simplepred->predicate
|
1144 karl 1.14 */
|
1145 dave.sudlik 1.15 CQL_globalParserState->currentRule = "comp->arith _TOK_ISA identifier";
1146 CQL_DEBUG_TRACE("BISON::comp->arith _TOK_ISA identifier\n");
|
1147 kumpf 1.19
|
1148 karl 1.14 CQLExpression *_expr1 = (CQLExpression*)
1149 (_factory.getObject($1,Predicate,Expression));
1150 CQLChainedIdentifier _cid(*$3);
1151 CQLExpression *_expr2 = (CQLExpression*)
1152 (_factory.makeObject(&_cid,Expression));
1153 CQLSimplePredicate _sp(*_expr1, *_expr2, ISA);
1154 _factory.setObject($1,&_sp,SimplePredicate);
1155 $$ = $1;
1156 }
1157 | arith TOK_LIKE literal_string
1158 {
|
1159 kumpf 1.19 CQL_globalParserState->currentRule =
|
1160 dave.sudlik 1.15 "comp->arith TOK_LIKE literal_string";
1161 CQL_DEBUG_TRACE("BISON::comp->arith TOK_LIKE literal_string\n");
|
1162 kumpf 1.19
|
1163 dave.sudlik 1.15 CQLExpression *_expr1 = (CQLExpression*)
|
1164 karl 1.13 (_factory.getObject($1,Predicate,Expression));
|
1165 dave.sudlik 1.15 CQLValue _val(*$3);
1166 CQLExpression *_expr2 = (CQLExpression*)
|
1167 karl 1.13 (_factory.makeObject(&_val,Expression));
|
1168 dave.sudlik 1.15 CQLSimplePredicate _sp(*_expr1, *_expr2, LIKE);
1169 _factory.setObject($1,&_sp,SimplePredicate);
1170 $$ = $1;
|
1171 karl 1.14 }
|
1172 chuck 1.2 ;
1173 expr_factor : comp
|
1174 karl 1.14 {
|
1175 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr_factor->comp";
1176 CQL_DEBUG_TRACE("BISON::expr_factor->comp\n");
|
1177 kumpf 1.19
|
1178 karl 1.14 $$ = $1;
1179 }
1180 | TOK_NOT comp
1181 {
|
1182 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr_factor->TOK_NOT comp";
1183 CQL_DEBUG_TRACE("BISON::expr_factor->TOK_NOT comp\n");
|
1184 kumpf 1.19
|
1185 karl 1.14 $2->setInverted(!($2->getInverted()));
1186 $$ = $2;
1187 }
|
1188 chuck 1.2 ;
1189
1190 expr_term : expr_factor
|
1191 karl 1.14 {
|
1192 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr_term->expr_factor";
1193 CQL_DEBUG_TRACE("BISON::expr_term->expr_factor\n");
|
1194 kumpf 1.19
|
1195 karl 1.14 $$ = $1;
1196 }
1197 | expr_term TOK_AND expr_factor
1198 {
|
1199 kumpf 1.19 CQL_globalParserState->currentRule =
|
1200 dave.sudlik 1.15 "expr_term->expr_term AND expr_factor";
1201 CQL_DEBUG_TRACE("BISON::expr_term->expr_term AND expr_factor\n");
|
1202 kumpf 1.19
|
1203 karl 1.14 $$ = new CQLPredicate();
1204 $$->appendPredicate(*$1);
|
1205 kumpf 1.19 $$->appendPredicate(*$3, AND);
|
1206 karl 1.14 _ObjPtr._ptr = $$;
1207 _ObjPtr.type = Pred;
1208 _ptrs.append(_ObjPtr);
1209 }
|
1210 chuck 1.2 ;
1211
|
1212 kumpf 1.19 expr : expr_term
|
1213 karl 1.14 {
|
1214 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr->expr_term";
1215 CQL_DEBUG_TRACE("BISON::expr->expr_term\n");
|
1216 kumpf 1.19
1217 $$ = $1;
|
1218 karl 1.14 }
1219 | expr TOK_OR expr_term
1220 {
|
1221 dave.sudlik 1.15 CQL_globalParserState->currentRule = "expr->expr OR expr_term";
1222 CQL_DEBUG_TRACE("BISON::expr->expr OR expr_term\n");
|
1223 kumpf 1.19
|
1224 karl 1.14 $$ = new CQLPredicate();
1225 $$->appendPredicate(*$1);
1226 $$->appendPredicate(*$3, OR);
1227 _ObjPtr._ptr = $$;
1228 _ObjPtr.type = Pred;
1229 _ptrs.append(_ObjPtr);
1230 }
|
1231 chuck 1.2 ;
1232
1233 arg_list : {;}
|
1234 karl 1.14 /****************
|
1235 karl 1.13 | TOK_STAR
1236 {
|
1237 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arg_list->TOK_STAR";
1238 CQL_DEBUG_TRACE("BISON::arg_list->TOK_STAR\n");
|
1239 kumpf 1.19
|
1240 karl 1.13 CQLIdentifier _id("*");
1241 CQLPredicate* _pred = (CQLPredicate*)
1242 (_factory.makeObject(&_id,Predicate));
|
1243 kumpf 1.19 _arglist.append(*_pred);
1244 since arg_list can loop back on itself,
1245 we need to store away previous solutions
|
1246 karl 1.13 production. We keep track of previous productions
1247 in the _arglist array and later pass that to CQLFunction
1248 as part of chain: identifier TOK_LPAR arg_list TOK_RPAR
|
1249 kumpf 1.19
|
1250 karl 1.13 }
|
1251 karl 1.14 *******************/
1252 | expr
1253 {
|
1254 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arg_list->arg_list_sub->expr";
1255 CQL_DEBUG_TRACE("BISON::arg_list->arg_list_sub->expr\n");
|
1256 kumpf 1.19
|
1257 karl 1.14 _arglist.append(*$1);
1258 /*
1259 since arg_list can loop back on itself,
1260 we need to store away previous solutions
1261 production. We keep track of previous productions
1262 in the _arglist array and later pass that to CQLFunction
1263 as part of chain: identifier TOK_LPAR arg_list TOK_RPAR
1264 */
1265 }
|
1266 karl 1.13 /****************************
1267 | TOK_DISTINCT TOK_STAR
1268 {
|
1269 dave.sudlik 1.15 CQL_globalParserState->currentRule = "arg_list->TOK_DISTINCT TOK_STAR";
1270 CQL_DEBUG_TRACE("BISON::arg_list->TOK_DISTINCT TOK_STAR\n");
|
1271 karl 1.13
1272 CQLIdentifier _id("DISTINCTSTAR");
1273 CQLPredicate* _pred = (CQLPredicate*)
1274 (_factory.makeObject(&_id,Predicate));
1275 _arglist.append(*_pred);
1276 }
1277 | arg_list_sub arg_list_tail
1278 {
|
1279 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list->arg_list_sub arg_list_tail\n");
|
1280 karl 1.13 }
|
1281 chuck 1.2 ;
1282
1283 arg_list_sub : expr
|
1284 karl 1.13 {
|
1285 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list_sub->expr\n");
|
1286 kumpf 1.19
1287 _arlist.append(*$1);
1288 }
|
1289 karl 1.13 | TOK_DISTINCT expr
1290 {
|
1291 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list_sub->TOK_DISTINCT expr\n");
|
1292 kumpf 1.19
|
1293 karl 1.13 String tmp1("TOK_DISTINCT");
1294 CQLIdentifier* _id = (CQLIdentifier*)
1295 (_factory.getObject($1,Predicate,Identifier));
1296 String tmp2(_id->getName().getString());
1297 tmp1.append(tmp2);
1298 CQLIdentifier _id1(tmp1);
1299 }
|
1300 chuck 1.2 ;
1301
1302 arg_list_tail : {;}
|
1303 karl 1.13 | TOK_COMMA arg_list_sub arg_list_tail
1304 {
|
1305 dave.sudlik 1.15 CQL_DEBUG_TRACE("BISON::arg_list_tail->TOK_COMMA arg_list_sub"
|
1306 karl 1.14 " arg_list_tail\n");
|
1307 karl 1.13 }
|
1308 chuck 1.2 ;
|
1309 karl 1.13 *******************/
1310
|
1311 chuck 1.2 from_specifier : class_path
|
1312 karl 1.14 {
|
1313 dave.sudlik 1.15 CQL_globalParserState->currentRule = "from_specifier->class_path";
1314 CQL_DEBUG_TRACE("BISON::from_specifier->class_path\n");
|
1315 kumpf 1.19
|
1316 karl 1.14 CQL_globalParserState->statement->appendClassPath(*$1);
|
1317 kumpf 1.19 }
|
1318 karl 1.14 | class_path TOK_AS identifier
1319 {
|
1320 kumpf 1.19 CQL_globalParserState->currentRule =
|
1321 dave.sudlik 1.15 "from_specifier->class_path TOK_AS identifier";
1322 CQL_DEBUG_TRACE(
1323 "BISON::from_specifier->class_path TOK_AS identifier\n");
|
1324 kumpf 1.19
|
1325 karl 1.14 CQLIdentifier _class(*$1);
1326 String _alias($3->getName().getString());
1327 CQL_globalParserState->statement->insertClassPathAlias(_class,_alias);
1328 CQL_globalParserState->statement->appendClassPath(_class);
1329 }
1330 | class_path identifier
1331 {
|
1332 kumpf 1.19 CQL_globalParserState->currentRule =
|
1333 dave.sudlik 1.15 "from_specifier->class_path identifier";
1334 CQL_DEBUG_TRACE("BISON::from_specifier->class_path identifier\n");
|
1335 kumpf 1.19
|
1336 karl 1.14 CQLIdentifier _class(*$1);
1337 String _alias($2->getName().getString());
1338 CQL_globalParserState->statement->insertClassPathAlias(_class,_alias);
1339 CQL_globalParserState->statement->appendClassPath(_class);
1340 }
|
1341 chuck 1.2 ;
1342
1343 from_criteria : from_specifier
|
1344 karl 1.14 {
|
1345 dave.sudlik 1.15 CQL_globalParserState->currentRule = "from_criteria->from_specifier";
1346 CQL_DEBUG_TRACE("BISON::from_criteria->from_specifier\n");
|
1347 karl 1.14 }
|
1348 karl 1.13 ;
1349
1350 star_expr : TOK_STAR
|
1351 karl 1.14 {
|
1352 dave.sudlik 1.15 CQL_globalParserState->currentRule = "star_expr->TOK_STAR";
1353 CQL_DEBUG_TRACE("BISON::star_expr->TOK_STAR\n");
|
1354 kumpf 1.19
|
1355 karl 1.14 CQLIdentifier _id("*");
1356 $$ = (CQLChainedIdentifier*)
1357 (_factory.makeObject(&_id,ChainedIdentifier));
1358 }
1359 | chain TOK_DOT TOK_STAR
1360 {
|
1361 dave.sudlik 1.15 CQL_globalParserState->currentRule = "star_expr->chain.*";
1362 CQL_DEBUG_TRACE("BISON::star_expr->chain.*\n");
|
1363 kumpf 1.19
|
1364 karl 1.14 CQLChainedIdentifier* _tmp = (CQLChainedIdentifier*)
1365 (_factory.getObject($1,Predicate,ChainedIdentifier));
1366 CQLChainedIdentifier* _cid = new CQLChainedIdentifier(*_tmp);
|
1367 karl 1.13 CQLIdentifier _id("*");
|
1368 karl 1.14 _cid->append(_id);
1369 $$ = _cid;
1370 _ObjPtr._ptr = $$;
1371 _ObjPtr.type = CId;
1372 _ptrs.append(_ObjPtr);
1373 }
|
1374 chuck 1.2 ;
1375
|
1376 kumpf 1.19 selected_entry : expr
|
1377 karl 1.14 {
|
1378 dave.sudlik 1.15 CQL_globalParserState->currentRule = "selected_entry->expr";
1379 CQL_DEBUG_TRACE("BISON::selected_entry->expr\n");
|
1380 kumpf 1.19
|
1381 karl 1.14 if($1->isSimpleValue())
1382 {
|
1383 karl 1.13 CQLChainedIdentifier *_cid = (CQLChainedIdentifier*)
1384 (_factory.getObject($1,Predicate,ChainedIdentifier));
1385 CQL_globalParserState->statement->appendSelectIdentifier(*_cid);
|
1386 karl 1.14 }
1387 else /* errot*/
1388 {
|
1389 karl 1.13 String _msg("selected_entry->expr : $1 is not a simple value");
1390 throw CQLSyntaxErrorException(
1391 MessageLoaderParms("CQL.CQL_y.NOT_SIMPLE_VALUE",
1392 "The CQLPredicate is not a simple value while "
1393 "parsing rule $0 in position $1.",
1394 "selected_entry->expr",
|
1395 kumpf 1.19 CQL_globalParserState->currentTokenPos) );
|
1396 karl 1.14 }
1397 }
1398 | star_expr
1399 {
|
1400 dave.sudlik 1.15 CQL_globalParserState->currentRule = "selected_entry->star_expr";
1401 CQL_DEBUG_TRACE("BISON::selected_entry->star_expr\n");
|
1402 kumpf 1.19
|
1403 karl 1.14 CQL_globalParserState->statement->appendSelectIdentifier(*$1);
1404 }
|
1405 chuck 1.2 ;
1406
1407 select_list : selected_entry select_list_tail
|
1408 karl 1.14 {
|
1409 kumpf 1.19 CQL_globalParserState->currentRule =
|
1410 dave.sudlik 1.15 "select_list->selected_entry select_list_tail";
1411 CQL_DEBUG_TRACE(
1412 "BISON::select_list->selected_entry select_list_tail\n");
|
1413 karl 1.14 }
|
1414 chuck 1.2 ;
1415
1416 select_list_tail : {;} /* empty */
|
1417 karl 1.14
1418 | TOK_COMMA selected_entry select_list_tail
1419 {
|
1420 kumpf 1.19 CQL_globalParserState->currentRule =
|
1421 dave.sudlik 1.15 "select_list_tail->TOK_COMMA selected_entry select_list_tail";
1422 CQL_DEBUG_TRACE(
1423 "BISON::select_list_tail->TOK_COMMA"
1424 " selected_entry select_list_tail\n");
|
1425 karl 1.14 }
|
1426 chuck 1.2 ;
1427
1428 search_condition : expr
|
1429 karl 1.14 {
|
1430 dave.sudlik 1.15 CQL_globalParserState->currentRule = "search_condition->expr";
1431 CQL_DEBUG_TRACE("BISON::search_condition->expr\n");
|
1432 kumpf 1.19
|
1433 karl 1.14 CQL_globalParserState->statement->setPredicate(*$1);
1434 }
|
1435 chuck 1.2 ;
1436
|
1437 humberto 1.6 optional_where : {}
|
1438 karl 1.13
|
1439 karl 1.14 | TOK_WHERE search_condition
1440 {
|
1441 kumpf 1.19 CQL_globalParserState->currentRule =
|
1442 dave.sudlik 1.15 "optional_where->TOK_WHERE search_condition";
1443 CQL_DEBUG_TRACE(
1444 "BISON::optional_where->TOK_WHERE search_condition\n");
|
1445 kumpf 1.19
|
1446 karl 1.14 CQL_globalParserState->statement->setHasWhereClause();
1447 }
|
1448 karl 1.13 ;
1449
|
1450 kumpf 1.19 select_statement : TOK_SELECT select_list TOK_FROM from_criteria optional_where
|
1451 karl 1.14 {
|
1452 dave.sudlik 1.15 CQL_globalParserState->currentRule = "select_statement";
1453 CQL_DEBUG_TRACE("select_statement\n");
|
1454 kumpf 1.19
|
1455 karl 1.14 CQL_Bison_Cleanup();
1456 }
|
1457 kumpf 1.19
|
1458 chuck 1.2 ;
1459
1460 %%
|
1461 karl 1.14 /*int yyerror(char * err){yyclearin; yyerrok;throw Exception(String(err));
1462 return 1;}*/
|