diff options
Diffstat (limited to 'qlparser/oql.yy')
-rw-r--r-- | qlparser/oql.yy | 2185 |
1 files changed, 2185 insertions, 0 deletions
diff --git a/qlparser/oql.yy b/qlparser/oql.yy new file mode 100644 index 0000000..006ed88 --- /dev/null +++ b/qlparser/oql.yy @@ -0,0 +1,2185 @@ +%{ +/* +* This file is part of rasdaman community. +* +* Rasdaman community is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see <http://www.rasdaman.org> +* or contact Peter Baumann via <baumann@rasdaman.com>. +*/ +/************************************************************* + * + * + * PURPOSE: + * Grammar for RasQL + * + * + * COMMENTS: + * - token BY unused + * + ************************************************************/ + +static const char rcsid[] = "@(#)qlparser, yacc parser: $Header: /home/rasdev/CVS-repository/rasdaman/qlparser/oql.y,v 1.95 2006/01/03 00:21:40 rasdev Exp $"; + +#include "qlparser/qtconversion.hh" +#include "qlparser/qtmarrayop.hh" +#include "qlparser/qtcondense.hh" +#include "qlparser/qtbinaryinduce2.hh" +#include "qlparser/qtbinaryfunc.hh" +#include "qlparser/qtoid.hh" +#include "qlparser/qtcondenseop.hh" +#include "qlparser/qtstringdata.hh" +#include "qlparser/qtconst.hh" +#include "qlparser/qtintervalop.hh" +#include "qlparser/qtmintervalop.hh" +#include "qlparser/qtunaryfunc.hh" +#include "qlparser/qtupdate.hh" +#include "qlparser/qtinsert.hh" +#include "qlparser/qtdelete.hh" +#include "qlparser/qtjoiniterator.hh" +#include "qlparser/qtselectioniterator.hh" +#include "qlparser/qtoperationiterator.hh" +#include "qlparser/qtcommand.hh" +#include "qlparser/qtunaryinduce.hh" +#include "qlparser/qtiterator.hh" +#include "qlparser/qtcomplexdata.hh" +#include "qlparser/qtmddaccess.hh" +#include "qlparser/querytree.hh" +#include "servercomm/servercomm.hh" + +extern ServerComm::ClientTblElt* currentClientTblElt; +extern ParseInfo *currInfo; + +void yyerror( char* s ); + +extern int yylex(); +extern unsigned int lineNo; +extern unsigned int columnNo; +extern char* yytext; + +//defined in oql.l +extern QueryTree* parseQueryTree; + +ParseInfo* parseError = NULL; + +struct QtUpdateSpecElement +{ + QtOperation* iterator; + QtOperation* domain; +}; + +#define FREESTACK( ARG ) \ + parseQueryTree->removeDynamicObject( ARG.info ); \ + delete ARG.info; \ + ARG.info=NULL; + +// simple context dependancy for marray +#define YYPARSE_PARAM mflag +#define MF_IN_CONTEXT (void *)1 +#define MF_NO_CONTEXT (void *)0 + +%} + +// definition section + +%union { + + struct { + bool value; + ParseInfo* info; + } booleanToken; + + struct { + char value; + ParseInfo* info; + } characterToken; + + struct { + unsigned short negative; // 1 = signed value, 0 = unsigned value + r_Long svalue; // stores the signed value -> negative = 1 + r_ULong uvalue; // stores the unsigned value -> negative = 0; + unsigned short bytes; // stores the length in bytes (1,2,3,4) + ParseInfo* info; + } integerToken; + + struct { + double value; + unsigned short bytes; // stores the length in bytes (4,8) + ParseInfo* info; + } floatToken; + + struct { + char* value; + ParseInfo* info; + } stringToken; + + struct { + int value; + ParseInfo* info; + } typeToken; + + + struct { + int value; + ParseInfo* info; + } commandToken; + + struct { + char* value; + ParseInfo* info; + } identifierToken; + +//-------------------------------------------------- + QtMarrayOp2::mddIntervalType * mddIntervalType; + QtMarrayOp2::mddIntervalListType * mddIntervalListType; +//--------------------------------------------------- + + r_Sinterval* Sinterval; + + QtNode* qtNodeValue; + QtOperation* qtOperationValue; + QtUnaryOperation* qtUnaryOperationValue; + QtDomainOperation* qtDomainValue; + QtMDDAccess* qtMDDAccessValue; + + QtData* qtDataValue; + QtScalarData* qtScalarDataValue; + QtAtomicData* qtAtomicDataValue; + QtComplexData* qtComplexDataValue; + + QtIterator::QtONCStreamList* qtONCStreamListValue; + QtComplexData::QtScalarDataList* qtScalarDataListValue; + QtNode::QtOperationList* qtOperationListValue; + + QtUpdateSpecElement qtUpdateSpecElement; + + Ops::OpType operationValue; + int dummyValue; + + struct { + QtCast::cast_types qtCastType; + ParseInfo *info; + } castTypes; + +} + +%token <identifierToken> Identifier +%token <booleanToken> BooleanLit +%token <characterToken> CharacterLit +%token <integerToken> IntegerLit +%token <floatToken> FloatLit +%token <stringToken> StringLit +%token <typeToken> TUNSIG TBOOL TOCTET TCHAR TSHORT TUSHORT TLONG TULONG TFLOAT TDOUBLE +%token <commandToken> SELECT FROM WHERE AS RESTRICT TO EXTEND BY PROJECT AT DIMENSION ALL SOME + COUNTCELLS ADDCELLS AVGCELLS MINCELLS MAXCELLS SDOM OVER USING LO HI UPDATE + SET ASSIGN MARRAY CONDENSE IN DOT COMMA IS NOT AND OR XOR PLUS MINUS MULT + DIV EQUAL LESS GREATER LESSEQUAL GREATEREQUAL NOTEQUAL COLON SEMICOLON LEPAR + REPAR LRPAR RRPAR LCPAR RCPAR INSERT INTO VALUES DELETE DROP CREATE COLLECTION + MDDPARAM OID SHIFT SCALE SQRT ABS EXP LOG LN SIN COS TAN SINH COSH TANH ARCSIN + ARCCOS ARCTAN OVERLAY BIT UNKNOWN FASTSCALE MEMBERS ADD ALTER LIST + STRCT COMPLEX RE IM TIFF BMP HDF CSV JPEG PNG VFF TOR DEM INV_TIFF INV_BMP INV_HDF + INV_JPEG INV_PNG INV_VFF INV_CSV INV_TOR INV_DEM + +%left COLON VALUES USING WHERE +%left OVERLAY +%left OR XOR +%left AND +%left NOT +%left IS +%left EQUAL LESS GREATER LESSEQUAL GREATEREQUAL NOTEQUAL +%left PLUS MINUS +%left MULT DIV +%left UNARYOP BIT +%left DOT LEPAR SDOM + +// The LEPAR precedence is for the trimming operation. Context dependent +// precedence would be better in that case but it did not work. + +%type <qtUpdateSpecElement> updateSpec +%type <qtMDDAccessValue> iteratedCollection +%type <qtONCStreamListValue> collectionList +%type <qtUnaryOperationValue> reduceIdent structSelection trimExp +%type <qtOperationValue> mddExp inductionExp generalExp resultList reduceExp functionExp spatialOp + integerExp mintervalExp intervalExp condenseExp variable +%type <qtOperationListValue> spatialOpList spatialOpList2 +%type <integerToken> intLitExp +%type <operationValue> condenseOpLit +%type <castTypes> castType +%type <dummyValue> qlfile query selectExp createExp insertExp deleteExp updateExp dropExp +%type <identifierToken> namedCollection collectionIterator typeName attributeIdent pyrName + marrayVariable condenseVariable + +// literal data +%type <qtDataValue> generalLit mddLit oidLit +%type <qtScalarDataValue> scalarLit +%type <qtAtomicDataValue> atomicLit +%type <qtComplexDataValue> complexLit +%type <qtScalarDataListValue> scalarLitList dimensionLitList + +// marray2 with multiple intervals +%type <mddIntervalListType> ivList +%type <mddIntervalType> iv marray_head + +%% // rules section +/*-------------------------------------------------------------------- + * Grammar starts here + *-------------------------------------------------------------------- + */ + +qlfile: query + { + // clear all symbols in table at the end of parsing + QueryTree::symtab.wipe(); + }; + +query: createExp + | dropExp + | selectExp + | updateExp + | insertExp + | deleteExp; + + +createExp: CREATE COLLECTION namedCollection typeName + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + FREESTACK($4) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create the command node + QtCommand* commandNode = new QtCommand( QtCommand::QT_CREATE_COLLECTION, $3.value, $4.value ); + commandNode->setParseInfo( *($1.info) ); + + // set insert node as root of the Query Tree + parseQueryTree->setRoot( commandNode ); + + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + FREESTACK($4) + }; + +dropExp: DROP COLLECTION namedCollection + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create the command node + QtCommand* commandNode = new QtCommand( QtCommand::QT_DROP_COLLECTION, $3.value ); + commandNode->setParseInfo( *($1.info) ); + + // set insert node as root of the Query Tree + parseQueryTree->setRoot( commandNode ); + + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + }; + +selectExp: SELECT resultList FROM collectionList WHERE generalExp + { + try { + accessControl.wantToRead(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $1.info->getToken().c_str(), + $1.info->getLineNo(), $1.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($3) + FREESTACK($5) + QueryTree::symtab.wipe(); + YYABORT; + } + + for( QtIterator::QtONCStreamList::iterator iter=$4->begin(); iter!=$4->end(); iter++ ) + parseQueryTree->removeDynamicObject( *iter ); + + // create a JoinIterator + QtJoinIterator* ji = new QtJoinIterator(); + ji->setStreamInputs( $4 ); + parseQueryTree->removeDynamicObject( $4 ); + + // create a QtONCStreamList and add the Join Iterator + QtIterator::QtONCStreamList* inputListS = new QtIterator::QtONCStreamList(1); + (*inputListS)[0] = ji; + + // create a SelectionIterator + QtSelectionIterator* si = new QtSelectionIterator(); + si->setStreamInputs( inputListS ); + si->setParseInfo( *($5.info) ); + si->setConditionTree( $6 ); + parseQueryTree->removeDynamicObject( $6 ); + + // create a QtONCStreamList and add the Selection Iterator + QtIterator::QtONCStreamList* inputListO = new QtIterator::QtONCStreamList(1); + (*inputListO)[0] = si; + + // create a OperationIterator and set its inputs + QtOperationIterator* oi = new QtOperationIterator(); + oi->setStreamInputs( inputListO ); + oi->setParseInfo( *($1.info) ); + oi->setOperationTree( $2 ); + parseQueryTree->removeDynamicObject( $2 ); + + // set the OperationIterator as root of the Query Tree + parseQueryTree->setRoot( oi ); + + FREESTACK($1) + FREESTACK($3) + FREESTACK($5) + } + | SELECT resultList FROM collectionList + { + try { + accessControl.wantToRead(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $1.info->getToken().c_str(), + $1.info->getLineNo(), $1.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($3) + QueryTree::symtab.wipe(); + YYABORT; + } + + for( QtIterator::QtONCStreamList::iterator iter=$4->begin(); iter!=$4->end(); iter++ ) + parseQueryTree->removeDynamicObject( *iter ); + + // create a JoinIterator + QtJoinIterator* ji = new QtJoinIterator(); + ji->setStreamInputs( $4 ); + parseQueryTree->removeDynamicObject( $4 ); + + // create a QtONCStreamList and add the Join Iterator + QtIterator::QtONCStreamList* inputList = new QtIterator::QtONCStreamList(1); + (*inputList)[0] = ji; + + // create a OperationIterator and set its inputs + QtOperationIterator* oi = new QtOperationIterator(); + oi->setStreamInputs( inputList ); + oi->setParseInfo( *($1.info) ); + oi->setOperationTree( $2 ); + parseQueryTree->removeDynamicObject( $2 ); + + // set the OperationIterator as root of the Query Tree + parseQueryTree->setRoot( oi ); + + FREESTACK($1) + FREESTACK($3) + }; + +updateExp: UPDATE iteratedCollection SET updateSpec ASSIGN generalExp WHERE generalExp + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $1.info->getToken().c_str(), + $1.info->getLineNo(), $1.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($3) + FREESTACK($5) + FREESTACK($7) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create a QtONCStreamList and add the QtAccess object of collection Spec + QtIterator::QtONCStreamList* streamList = new QtIterator::QtONCStreamList(1); + (*streamList)[0] = $2; + parseQueryTree->removeDynamicObject( $2 ); + + // create a SelectionIterator + QtSelectionIterator* si = new QtSelectionIterator(); + si->setStreamInputs( streamList ); + si->setConditionTree( $8 ); + si->setParseInfo( *($7.info) ); + parseQueryTree->removeDynamicObject( $8 ); + + // create an update node + QtUpdate* update = new QtUpdate( $4.iterator, $4.domain, $6 ); + update->setStreamInput( si ); + update->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $4.iterator ); + parseQueryTree->removeDynamicObject( $4.domain ); + parseQueryTree->removeDynamicObject( $6 ); + + // set the update node as root of the Query Tree + parseQueryTree->setRoot( update ); + + FREESTACK($1) + FREESTACK($3) + FREESTACK($5) + FREESTACK($7) + } + | UPDATE iteratedCollection SET updateSpec ASSIGN generalExp + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $1.info->getToken().c_str(), + $1.info->getLineNo(), $1.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($3) + FREESTACK($5) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create an update node + QtUpdate* update = new QtUpdate( $4.iterator, $4.domain, $6 ); + update->setStreamInput( $2 ); + update->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $2 ); + parseQueryTree->removeDynamicObject( $4.iterator ); + parseQueryTree->removeDynamicObject( $4.domain ); + parseQueryTree->removeDynamicObject( $6 ); + + // set the update node as root of the Query Tree + parseQueryTree->setRoot( update ); + + FREESTACK($1) + FREESTACK($3) + FREESTACK($5) + }; + +insertExp: INSERT INTO namedCollection VALUES generalExp + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + FREESTACK($4) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create an update node + QtInsert* insert = new QtInsert( $3.value, $5 ); + insert->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $5 ); + + // set insert node as root of the Query Tree + parseQueryTree->setRoot( insert ); + + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + FREESTACK($4) + }; + +deleteExp: DELETE FROM iteratedCollection WHERE generalExp + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create a QtONCStreamList and add the QtAccess object of collection Spec + QtIterator::QtONCStreamList* streamList = new QtIterator::QtONCStreamList(1); + (*streamList)[0] = $3; + parseQueryTree->removeDynamicObject( $3 ); + + // create a SelectionIterator + QtSelectionIterator* si = new QtSelectionIterator(); + si->setStreamInputs( streamList ); + si->setConditionTree( $5 ); + si->setParseInfo( *($4.info) ); + parseQueryTree->removeDynamicObject( $5 ); + + // create delete node + QtDelete* delNode = new QtDelete(); + delNode->setStreamInput( si ); + delNode->setParseInfo( *($1.info) ); + + // set insert node as root of the Query Tree + parseQueryTree->setRoot( delNode ); + + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } +/* // doesn't work yet, somewhere later the server crashes -- PB 2006-jan-03 + | DELETE FROM iteratedCollection + { + try { + accessControl.wantToWrite(); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 803, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + QueryTree::symtab.wipe(); + YYABORT; + } + + // create delete node + QtDelete* delNode = new QtDelete(); + delNode->setStreamInput( $3 ); + delNode->setParseInfo( *($1.info) ); + + // set insert node as root of the Query Tree + parseQueryTree->setRoot( delNode ); + + FREESTACK($1) + FREESTACK($2) + } +*/ + ; + +updateSpec: variable + { + $$.iterator = $1; + $$.domain = 0; + } + | variable mintervalExp + { + $$.iterator = $1; + $$.domain = $2; + }; + +resultList: resultList COMMA generalExp + { + $$ = $3; + FREESTACK($2) + } + | generalExp + { + $$ = $1; + }; + +generalExp: mddExp { $$ = $1; } + | trimExp { $$ = $1; } + | reduceExp { $$ = $1; } + | inductionExp { $$ = $1; } + | functionExp { $$ = $1; } + | integerExp { $$ = $1; } + | condenseExp { $$ = $1; } + | variable { $$ = $1; } + | mintervalExp { $$ = $1; } + | intervalExp { $$ = $1; } + | generalLit + { + $$ = new QtConst( $1 ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->addDynamicObject( $$ ); + }; + +integerExp: generalExp DOT LO + { + $$ = new QtIntervalLoOp( $1 ); + $$->setParseInfo( *($3.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + FREESTACK($3) + } + | generalExp DOT HI + { + $$ = new QtIntervalHiOp( $1 ); + $$->setParseInfo( *($3.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + FREESTACK($3) + }; + +mintervalExp: LEPAR spatialOpList REPAR + { + if (($2->size() > 1) || + ($2->size() == 1 && (*$2)[0]->getNodeType() == QtNode::QT_INTERVALOP)) + { + // Check if the list consists of integers only and + // create a point operation in this case. + int isPoint = 1; + QtNode::QtOperationList::iterator iter; + + for( iter=$2->begin(); iter!=$2->end(); ++iter ) + isPoint &= (*iter)->getNodeType() != QtNode::QT_INTERVALOP; + + for( iter=$2->begin(); iter!=$2->end(); ++iter ) + parseQueryTree->removeDynamicObject( *iter ); + + if( isPoint ) + $$ = new QtPointOp( $2 ); + else + $$ = new QtMintervalOp( $2 ); + + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + } + else + if ($2->size() == 1) + { + // take the single element + $$ = (*$2)[0]; + (*$2)[0] = 0; + delete $2; + } + else + { + RMInit::logOut << "MINTERVAL error: empty expression between brackets encountered!" << std::endl; + // save the parse error info and stop the parser + if ( parseError ) + delete parseError; + // TODO: Define an error number for this one!!!! 312 is not correct. + parseError = new ParseInfo( 312, $1.info->getToken().c_str(), + $1.info->getLineNo(), + $1.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($3) + QueryTree::symtab.wipe(); + YYABORT; + } + FREESTACK($1) + FREESTACK($3) + } + | SDOM LRPAR collectionIterator RRPAR + { + QtVariable* var = new QtVariable( $3.value ); + var->setParseInfo( *($3.info) ); + $$ = new QtSDom( var ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + FREESTACK($4) + }; + +spatialOpList: + { + $$ = new QtNode::QtOperationList(); + } + | spatialOpList2 + { + $$ = $1; + }; + +spatialOpList2: spatialOpList2 COMMA spatialOp + { + $1->push_back( $3 ); + $$ = $1; + FREESTACK($2) + } + | spatialOp + { + $$ = new QtNode::QtOperationList(1); + (*$$)[0] = $1; + }; + +spatialOp: generalExp { $$ = $1; }; + +intervalExp: generalExp COLON generalExp + { + $$ = new QtIntervalOp( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | MULT COLON generalExp + { + QtConst* const1 = new QtConst( new QtStringData("*") ); + const1->setParseInfo( *($1.info) ); + $$ = new QtIntervalOp( const1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + } + | generalExp COLON MULT + { + QtConst* const1 = new QtConst( new QtStringData("*") ); + const1->setParseInfo( *($3.info) ); + $$ = new QtIntervalOp( $1, const1 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + FREESTACK($3) + } + | MULT COLON MULT + { + QtConst* const1 = new QtConst( new QtStringData("*") ); + const1->setParseInfo( *($1.info) ); + QtConst* const2 = new QtConst( new QtStringData("*") ); + const2->setParseInfo( *($3.info) ); + $$ = new QtIntervalOp( const1, const2 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + }; + +condenseExp: CONDENSE condenseOpLit OVER condenseVariable IN generalExp WHERE generalExp USING generalExp + { + $$ = new QtCondenseOp( $2, $4.value, $6, $10, $8 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $6 ); + parseQueryTree->removeDynamicObject( $8 ); + parseQueryTree->removeDynamicObject( $10 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($3) + FREESTACK($4) + FREESTACK($5) + FREESTACK($7) + FREESTACK($9) + } + | CONDENSE condenseOpLit OVER condenseVariable IN generalExp USING generalExp + { + $$ = new QtCondenseOp( $2, $4.value, $6, $8 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $6 ); + parseQueryTree->removeDynamicObject( $8 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($3) + FREESTACK($4) + FREESTACK($5) + FREESTACK($7) + }; + +condenseOpLit: PLUS + { + $$ = Ops::OP_PLUS; + FREESTACK($1) + } + | MINUS + { + $$ = Ops::OP_MINUS; + FREESTACK($1) + } + | MULT + { + $$ = Ops::OP_MULT; + FREESTACK($1) + } + | DIV + { + $$ = Ops::OP_DIV; + FREESTACK($1) + } + | AND + { + $$ = Ops::OP_AND; + FREESTACK($1) + } + | OR + { + $$ = Ops::OP_OR; + FREESTACK($1) + }; + +functionExp: OID LRPAR collectionIterator RRPAR + { + QtVariable* var = new QtVariable( $3.value ); + var->setParseInfo( *($3.info) ); + $$ = new QtOId( var ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + FREESTACK($4) + } + | SHIFT LRPAR generalExp COMMA generalExp RRPAR + { + $$ = new QtShift( $3, $5 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->removeDynamicObject( $5 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + // added -- PB 2005-jun-18 + | EXTEND LRPAR generalExp COMMA generalExp RRPAR + { + $$ = new QtExtend( $3, $5 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->removeDynamicObject( $5 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | SCALE LRPAR generalExp COMMA generalExp RRPAR + { + $$ = new QtScale( $3, $5 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->removeDynamicObject( $5 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | BIT LRPAR generalExp COMMA generalExp RRPAR + { + $$ = new QtBit( $3, $5 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->removeDynamicObject( $5 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | TIFF LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOTIFF, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | TIFF LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOTIFF ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | BMP LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOBMP, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | BMP LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOBMP ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | HDF LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOHDF, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | HDF LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOHDF ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | CSV LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOCSV, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | CSV LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOCSV ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | JPEG LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOJPEG, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | JPEG LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOJPEG ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | PNG LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOPNG, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | PNG LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOPNG ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | VFF LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOVFF, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | VFF LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOVFF ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | TOR LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOTOR, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | TOR LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TOTOR ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | DEM LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TODEM, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | DEM LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_TODEM ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_TIFF LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMTIFF, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_TIFF LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMTIFF ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_BMP LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMBMP, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_BMP LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMBMP ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_HDF LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMHDF, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_HDF LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMHDF ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_CSV LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMCSV, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_CSV LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMCSV ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_JPEG LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMJPEG, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_JPEG LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMJPEG ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_PNG LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMPNG, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_PNG LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMPNG ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_VFF LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMVFF, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_VFF LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMVFF ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_TOR LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMTOR, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_TOR LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMTOR ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | INV_DEM LRPAR generalExp COMMA StringLit RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMDEM, $5.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + } + | INV_DEM LRPAR generalExp RRPAR + { + $$ = new QtConversion( $3, QtConversion::QT_FROMDEM ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + }; + + +structSelection: DOT attributeIdent + { + $$ = new QtDot( $2.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + } + | DOT intLitExp + { + if( $2.negative ) + if( $2.svalue < 0 ) + yyerror("non negative integer expected"); + else + $$ = new QtDot( (unsigned int)$2.svalue ); + else + $$ = new QtDot( (unsigned int)$2.uvalue ); + parseQueryTree->addDynamicObject( $$ ); + $$->setParseInfo( *($1.info) ); + FREESTACK($1) + FREESTACK($2) + }; + +inductionExp: SQRT LRPAR generalExp RRPAR + { + $$ = new QtSqrt( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | ABS LRPAR generalExp RRPAR + { + $$ = new QtAbs( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | EXP LRPAR generalExp RRPAR + { + $$ = new QtExp( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | LOG LRPAR generalExp RRPAR + { + $$ = new QtLog( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | LN LRPAR generalExp RRPAR + { + $$ = new QtLn( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | SIN LRPAR generalExp RRPAR + { + $$ = new QtSin( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | COS LRPAR generalExp RRPAR + { + $$ = new QtCos( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | TAN LRPAR generalExp RRPAR + { + $$ = new QtTan( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | SINH LRPAR generalExp RRPAR + { + $$ = new QtSinh( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | COSH LRPAR generalExp RRPAR + { + $$ = new QtCosh( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | TANH LRPAR generalExp RRPAR + { + $$ = new QtTanh( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | ARCSIN LRPAR generalExp RRPAR + { + $$ = new QtArcsin( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | ARCCOS LRPAR generalExp RRPAR + { + $$ = new QtArccos( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | ARCTAN LRPAR generalExp RRPAR + { + $$ = new QtArctan( $3 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + } + | generalExp DOT RE + { + $$ = new QtRealPartOp( $1 ); + $$->setParseInfo( *($3.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + FREESTACK($3) + } + | generalExp DOT IM + { + $$ = new QtImaginarPartOp( $1 ); + $$->setParseInfo( *($3.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + FREESTACK($3) + } + | NOT generalExp + { + $$ = new QtNot( $2 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->removeDynamicObject( $2 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | generalExp OVERLAY generalExp + { + $$ = new QtOverlay ( $3, $1 ); + $$->setParseInfo( *($2.info) ); + FREESTACK($2) + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + } + | generalExp IS generalExp + { + $$ = new QtIs ( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp AND generalExp + { + $$ = new QtAnd( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp OR generalExp + { + $$ = new QtOr ( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp XOR generalExp + { + $$ = new QtXor( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp PLUS generalExp + { + $$ = new QtPlus ( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp MINUS generalExp + { + $$ = new QtMinus( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp MULT generalExp + { + $$ = new QtMult ( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp DIV generalExp + { + $$ = new QtDiv ( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp EQUAL generalExp + { + $$ = new QtEqual( $1, $3 ); + $$->setParseInfo( *($2.info) ); + FREESTACK($2) + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + } + | generalExp LESS generalExp + { + $$ = new QtLess( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp GREATER generalExp + { + $$ = new QtLess( $3, $1 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp LESSEQUAL generalExp + { + $$ = new QtLessEqual( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp GREATEREQUAL generalExp + { + $$ = new QtLessEqual( $3, $1 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | generalExp NOTEQUAL generalExp + { + $$ = new QtNotEqual ( $1, $3 ); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | PLUS generalExp %prec UNARYOP + { + $$ = $2; + FREESTACK($1) + } + | MINUS generalExp %prec UNARYOP + { + $$ = new QtMult( $2, new QtConst( new QtAtomicData( (r_Long)-1, 1 ) ) ); + parseQueryTree->removeDynamicObject( $2 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | LRPAR castType RRPAR generalExp %prec UNARYOP + { + $$ = new QtCast($4, $2.qtCastType); + $$->setParseInfo( *($2.info) ); + parseQueryTree->removeDynamicObject($4); + parseQueryTree->addDynamicObject($$); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + } + | LRPAR generalExp RRPAR + { + $$ = $2; + FREESTACK($1) + FREESTACK($3) + } + | generalExp structSelection + { + $2->setInput($1); + $$ = $2; + parseQueryTree->removeDynamicObject( $1 ); + }; + +castType: TBOOL { $$.info = $1.info; $$.qtCastType = QtCast::t_bool; } + | TCHAR { $$.info = $1.info; $$.qtCastType = QtCast::t_char; } + | TOCTET { $$.info = $1.info; $$.qtCastType = QtCast::t_octet; } + | TSHORT { $$.info = $1.info; $$.qtCastType = QtCast::t_short; } + | TUSHORT { $$.info = $1.info; $$.qtCastType = QtCast::t_ushort; } + | TLONG { $$.info = $1.info; $$.qtCastType = QtCast::t_long; } + | TULONG { $$.info = $1.info; $$.qtCastType = QtCast::t_ulong; } + | TFLOAT { $$.info = $1.info; $$.qtCastType = QtCast::t_float; } + | TDOUBLE { $$.info = $1.info; $$.qtCastType = QtCast::t_double; } + | TUNSIG TSHORT { $$.info = $1.info; $$.qtCastType = QtCast::t_ushort; } + | TUNSIG TLONG { $$.info = $1.info; $$.qtCastType = QtCast::t_ulong; }; + +collectionList: collectionList COMMA iteratedCollection + { + // add the QtMDDAccess object and give back the list + $1->push_back($3); + $$ = $1; + FREESTACK($2) + } + | iteratedCollection + { + // create a new list and add the QtMDDAccess object + $$ = new QtIterator::QtONCStreamList(); + $$->push_back($1); + parseQueryTree->addDynamicObject( $$ ); + }; + +iteratedCollection: namedCollection AS collectionIterator + { + $$ = new QtMDDAccess( $1.value, $3.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + } + | namedCollection collectionIterator + { + $$ = new QtMDDAccess( $1.value, $2.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + } + | namedCollection + { + $$ = new QtMDDAccess( $1.value, $1.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + }; + +variable: Identifier + { + $$ = new QtVariable( $1.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + }; + +namedCollection: Identifier; + +collectionIterator: Identifier; + +pyrName: Identifier; + +attributeIdent: Identifier; + +typeName: Identifier; + +marrayVariable: Identifier; + +condenseVariable: Identifier; + +reduceExp: reduceIdent LRPAR generalExp RRPAR + { + $1->setInput( $3 ); + $$ = $1; + parseQueryTree->removeDynamicObject( $3 ); + FREESTACK($2) + FREESTACK($4) + }; + +reduceIdent: ALL + { + $$ = new QtAll(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | SOME + { + $$ = new QtSome(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | COUNTCELLS + { + $$ = new QtCountCells(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | ADDCELLS + { + $$ = new QtAddCells(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | AVGCELLS + { + $$ = new QtAvgCells(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | MINCELLS + { + $$ = new QtMinCells(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | MAXCELLS + { + $$ = new QtMaxCells(); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + }; + +intLitExp: IntegerLit { $$ = $1; }; + +generalLit: scalarLit { $$ = $1; } + | mddLit { $$ = $1; } + | StringLit + { + $$ = new QtStringData( std::string($1.value) ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | oidLit { $$ = $1; }; + +oidLit: LESS StringLit GREATER + { + r_OId oid; + try { + oid = r_OId( $2.value ); + } + catch(...) { + // save the parse error info and stop the parser + if ( parseError ) delete parseError; + parseError = new ParseInfo( 303, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + QueryTree::symtab.wipe(); + YYABORT; + } + + // test if database match the current one + int mismatch = oid.get_base_name() == 0; + + if( !mismatch ) { + // check for question mark + char* baseName = strdup( oid.get_base_name() ); + char* end = strchr( baseName, '?' ); + if( end ) + *end = '\0'; + mismatch = strcmp( baseName, currentClientTblElt->database.getName() ) !=0; + free( baseName ); + baseName = 0; + } + + if( mismatch ) { + // save the parse error info and stop the parser + if( parseError ) delete parseError; + parseError = new ParseInfo( 386, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + QueryTree::symtab.wipe(); + YYABORT; + } + + // take the local oid + $$ = new QtAtomicData( oid.get_local_oid(), 8 ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($3) + }; + +mddLit: LESS mintervalExp dimensionLitList GREATER + { + // create a QtMDD object representing the literal + try { + $$ = new QtMDD( $2, $3 ); + } + catch( ParseInfo& obj ) { + delete $3; + + // save the parse error info and stop the parser + if( parseError ) delete parseError; + parseError = new ParseInfo( obj.getErrorNo(), $1.info->getToken().c_str(), + $1.info->getLineNo(), $1.info->getColumnNo() ); + FREESTACK($1) + FREESTACK($4) + QueryTree::symtab.wipe(); + YYABORT; + } + $$->setParseInfo( *($1.info) ); + + for( std::list<QtScalarData*>::iterator iter=$3->begin(); iter!=$3->end(); iter++ ) { + delete *iter; + parseQueryTree->removeDynamicObject( *iter ); + } + + delete $2; + delete $3; + parseQueryTree->removeDynamicObject( $2 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($4) + } + | MDDPARAM + { + try { + $$ = new QtMDD( $1.value ); + } + catch( ParseInfo& obj ) { + // save the parse error info and stop the parser + if( parseError ) delete parseError; + parseError = new ParseInfo( obj.getErrorNo(), $1.info->getToken().c_str(), + $1.info->getLineNo(), $1.info->getColumnNo() ); + FREESTACK($1) + QueryTree::symtab.wipe(); + YYABORT; + } + parseQueryTree->addDynamicObject( $$ ); + $$->setParseInfo( *($1.info) ); + FREESTACK($1) + }; + +dimensionLitList: dimensionLitList SEMICOLON scalarLitList + { + // concatenate the lists + $1->splice( $1->end(), *$3 ); + $$ = $1; + delete $3; + FREESTACK($2) + } + | scalarLitList + { + // simply take the list + $$ = $1; + }; + +scalarLit: complexLit + { + $$ = $1; + } + | atomicLit + { + $$ = $1; + }; + +atomicLit: BooleanLit + { + $$ = new QtAtomicData( $1.value ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | IntegerLit + { + if( $1.negative ) + $$ = new QtAtomicData( $1.svalue, $1.bytes ); + else + $$ = new QtAtomicData( $1.uvalue, $1.bytes ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | FloatLit + { + $$ = new QtAtomicData( $1.value, $1.bytes ); + $$->setParseInfo( *($1.info) ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + } + | COMPLEX LRPAR FloatLit COMMA FloatLit RRPAR + { + // this should construct a complex type + // for both float and double cell type + if($3.bytes + $5.bytes == 2 * sizeof(float) || $3.bytes + $5.bytes == 2 * sizeof(double)) + $$ = new QtAtomicData($3.value, $5.value, $3.bytes + $5.bytes); + else { + if(parseError) delete parseError; + parseError = new ParseInfo(311, $2.info->getToken().c_str(), + $2.info->getLineNo(), $2.info->getColumnNo()); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + QueryTree::symtab.wipe(); + YYABORT; + } + $$->setParseInfo(*($3.info)); + parseQueryTree->addDynamicObject($$); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + FREESTACK($6) + }; + +complexLit: LCPAR scalarLitList RCPAR + { + for( std::list<QtScalarData*>::iterator iter=$2->begin(); iter!=$2->end(); iter++ ) + parseQueryTree->removeDynamicObject( *iter ); + $$ = new QtComplexData( $2 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($3) + } + | STRCT LCPAR scalarLitList RCPAR + { + for( std::list<QtScalarData*>::iterator iter=$3->begin(); iter!=$3->end(); iter++ ) + parseQueryTree->removeDynamicObject( *iter ); + $$ = new QtComplexData( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($1) + FREESTACK($2) + FREESTACK($4) + }; + +scalarLitList: scalarLitList COMMA scalarLit + { + // add the literal element and give back the list + $1->push_back($3); + $$ = $1; + FREESTACK($2) + } + | scalarLit + { + // create a new list and add the literal element + $$ = new QtComplexData::QtScalarDataList(); + $$->push_back($1); + }; + + + + +trimExp: generalExp mintervalExp + { + QtDomainOperation *dop = new QtDomainOperation( $2 ); + dop->setInput( $1 ); // e.g. variable name + parseQueryTree->removeDynamicObject( $1 ); + parseQueryTree->removeDynamicObject( $2 ); + parseQueryTree->addDynamicObject( dop ); + $$ = dop; + if (mflag == MF_IN_CONTEXT) + parseQueryTree->addDomainObject( dop ); + }; + +marray_head: + MARRAY + { + mflag = MF_IN_CONTEXT; + QueryTree::symtab.initScope(); + } + iv + { + $$ = $3; + $$->parseInfo = *($1.info); + FREESTACK($1) + }; + +mddExp: marray_head VALUES generalExp + { + // create a new list and add the element + QtMarrayOp2::mddIntervalListType *dlist = new QtMarrayOp2::mddIntervalListType(); + dlist->push_back(*($1)); + + // concatenate intervals and variable names, then do a domain rewrite + QtMarrayOp2 *qma = new QtMarrayOp2( dlist, $3 ); + qma->setOldMarray(true); + qma->rewriteVars( ); + + char *stra = strdup( $1->variable.c_str() ); + $$ = new QtMarrayOp( stra, $1->tree, qma->getInput()); + parseQueryTree->addCString(stra); + + QueryTree::symtab.exitScope(); + mflag = MF_NO_CONTEXT; + + // release memory + while (!(dlist->empty())) + { + dlist->erase(dlist->begin()); + } + delete dlist; + delete qma; + delete $1; + parseQueryTree->removeDynamicObject( $3 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + } + | marray_head COMMA ivList VALUES generalExp + { + // create a new list and add the element + QtMarrayOp2::mddIntervalListType *dlist = new QtMarrayOp2::mddIntervalListType(); + dlist->push_back(*($1)); + + // concatenate the lists + dlist->insert( + dlist->end(), + $3->begin(), + $3->end() + ); + + // concatenate intervals and variable names, then do a domain rewrite + QtMarrayOp2 *qma = new QtMarrayOp2( dlist, $5 ); + qma->setOldMarray(false); + qma->rewriteVars( ); + if (!(qma->concatenateIntervals())) + { + // TODO: change error code! + // save the parse error info and stop the parser + if ( parseError ) + delete parseError; + parseError = new ParseInfo( 313, ($1->parseInfo).getToken().c_str(), + ($1->parseInfo).getLineNo(), + ($1->parseInfo).getColumnNo() ); + QueryTree::symtab.exitScope(); + mflag = MF_NO_CONTEXT; + + // release memory + while (!(dlist->empty())) + { + dlist->erase(dlist->begin()); + } + delete dlist; + delete qma; + delete $1; + parseQueryTree->removeDynamicObject( $5 ); + FREESTACK($2) + FREESTACK($4) + YYABORT; + } + + r_Minterval *dinterval = new r_Minterval(qma->greatDomain); + std::string *dvariable = new std::string(qma->greatIterator); + parseQueryTree->rewriteDomainObjects(dinterval, dvariable, dlist); + + // initialize old good QtMarray with the translated data + QtMintervalData *mddIntervalData = new QtMintervalData(*dinterval); + $$ = new QtMarrayOp( dvariable->c_str(), new QtConst(mddIntervalData), qma->getInput()); +// $$->setParseInfo( *($1.info) ); + + QueryTree::symtab.exitScope(); + mflag = MF_NO_CONTEXT; + + // release memory + while (!(dlist->empty())) + { + dlist->erase(dlist->begin()); + } + delete dlist; + delete qma; + delete $1; + parseQueryTree->removeDynamicObject( $5 ); + parseQueryTree->addDynamicObject( $$ ); + FREESTACK($2) + FREESTACK($4) + }; + +ivList: ivList COMMA iv + { + // add the element and give back the list + $1->push_back(*($3)); + $$ = $1; + delete $3; + FREESTACK($2) + } + | iv + { + // create a new list and add the element + $$ = new QtMarrayOp2::mddIntervalListType(); + $$->push_back(*($1)); + delete $1; + }; + +iv: marrayVariable IN generalExp + { + if (!QueryTree::symtab.putSymbol($1.value, 1)) // instead of 1 put the dimensionality + { + // save the parse error info and stop the parser + if ( parseError ) + delete parseError; + parseError = new ParseInfo( 312, $1.info->getToken().c_str(), + $1.info->getLineNo(), + $1.info->getColumnNo() ); + parseQueryTree->removeDynamicObject( $3 ); + FREESTACK($2) + QueryTree::symtab.wipe(); + YYABORT; + } + $$ = new QtMarrayOp2::mddIntervalType(); + $$->variable = $1.value; + $$->tree = $3; + $$->parseInfo = *($1.info); + parseQueryTree->removeDynamicObject( $3 ); + FREESTACK($2); + }; + +/*-------------------------------------------------------------------- + * Grammar ends here + *-------------------------------------------------------------------- + */ +%% // C code section + +void yyerror( char* /*s*/ ) { + if( !parseError ) { + + if( yytext[0] == '\0' ) { + // unexpected end of query + parseError = new ParseInfo( 308, yytext, lineNo, columnNo - strlen(yytext) ); + } + else { + // general parse error + parseError = new ParseInfo( 300, yytext, lineNo, columnNo - strlen(yytext) ); + } + } +} |