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

   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;}*/

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2