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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2