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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2