summaryrefslogtreecommitdiffstats
path: root/qlparser/lex.ll
diff options
context:
space:
mode:
Diffstat (limited to 'qlparser/lex.ll')
-rw-r--r--qlparser/lex.ll354
1 files changed, 354 insertions, 0 deletions
diff --git a/qlparser/lex.ll b/qlparser/lex.ll
new file mode 100644
index 0000000..8a1b140
--- /dev/null
+++ b/qlparser/lex.ll
@@ -0,0 +1,354 @@
+%{
+/*
+* 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>.
+*/
+/*************************************************************
+ *
+ * COMMENTS:
+ * - token BY seems unused
+ *
+ ************************************************************/
+
+static const char rcsid[] = "@(#)qlparser, lexer: $Id: oql.l,v 1.64 2005/07/06 22:48:34 rasdev Exp $";
+
+#include "qlparser/qtoperation.hh"
+#include "qlparser/querytree.hh"
+#include "qlparser/qtmddaccess.hh"
+#include "qlparser/qtcomplexdata.hh"
+#include "qlparser/qtiterator.hh"
+#include "qlparser/qtunaryinduce.hh"
+
+std::list<ParseInfo> infoList;
+
+ParseInfo *currInfo=0;
+
+struct QtUpdateSpecElement
+{
+ QtOperation* iterator;
+ QtOperation* domain;
+};
+
+#include "oql.h"
+
+QueryTree* parseQueryTree = NULL;
+char* beginParseString = NULL;
+char* iterParseString = NULL;
+void yyreset();
+
+unsigned int lineNo = 1;
+unsigned int columnNo = 1;
+void llerror( char* s );
+int yyparse( );
+
+int string_yyinput( char* buf, int max_size )
+{
+ int lenParseString = strlen( iterParseString );
+ int bufLength = max_size < lenParseString ? max_size : lenParseString;
+ if( bufLength > 0 )
+ {
+ memcpy( buf, iterParseString, bufLength );
+ iterParseString += bufLength;
+ }
+ return bufLength;
+}
+
+#undef YY_INPUT
+#define YY_INPUT( buff, buffLen, maxSize ) ( buffLen = string_yyinput( buff, maxSize ) )
+
+#define SETTOKEN( TOKEN, TYPE, VALUE ) \
+ yylval.TYPE.value = VALUE; \
+ if(!infoList.empty()) { \
+ currInfo = new ParseInfo(infoList.front()); \
+ infoList.pop_front(); \
+ } \
+ else { \
+ currInfo = new ParseInfo( yytext, lineNo, columnNo ); \
+ } \
+ yylval.TYPE.info = currInfo; \
+ columnNo += yyleng; \
+ parseQueryTree->addDynamicObject( yylval.TYPE.info ); \
+ return TOKEN;
+
+
+#define SETSTRTOKEN( TOKEN, TYPE, VALUE ) \
+ char* temp = strdup(VALUE); \
+ parseQueryTree->addCString( temp ); \
+ yylval.TYPE.value = temp; \
+ if(!infoList.empty()) { \
+ currInfo = new ParseInfo(infoList.front()); \
+ infoList.pop_front(); \
+ } \
+ else { \
+ currInfo = new ParseInfo( yytext, lineNo, columnNo ); \
+ } \
+ yylval.TYPE.info = currInfo; \
+ columnNo += yyleng; \
+ parseQueryTree->addDynamicObject( yylval.TYPE.info ); \
+ return TOKEN;
+
+
+#define SETINTTOKEN( VALUE, NEGATIVE, BYTES ) \
+ yylval.integerToken.negative = NEGATIVE; \
+ yylval.integerToken.bytes = BYTES; \
+ if( NEGATIVE ) \
+ yylval.integerToken.svalue = VALUE; \
+ else \
+ yylval.integerToken.uvalue = (unsigned long)VALUE; \
+ if(!infoList.empty()) { \
+ currInfo = new ParseInfo(infoList.front()); \
+ infoList.pop_front(); \
+ } \
+ else { \
+ currInfo = new ParseInfo( yytext, lineNo, columnNo ); \
+ } \
+ yylval.integerToken.info = currInfo; \
+ columnNo += yyleng; \
+ parseQueryTree->addDynamicObject( yylval.integerToken.info ); \
+ return IntegerLit;
+
+
+#define SETFLTTOKEN( VALUE, BYTES ) \
+ yylval.floatToken.value = VALUE; \
+ yylval.floatToken.bytes = BYTES; \
+ if(!infoList.empty()) { \
+ currInfo = new ParseInfo(infoList.front()); \
+ infoList.pop_front(); \
+ } \
+ else { \
+ currInfo = new ParseInfo(yytext, lineNo, columnNo); \
+ } \
+ yylval.floatToken.info = currInfo; \
+ columnNo += yyleng; \
+ parseQueryTree->addDynamicObject( yylval.floatToken.info ); \
+ return FloatLit;
+
+%}
+
+%option noyywrap
+
+%%
+
+"/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/" {
+ if( !strncmp( yytext, "/*+", 3 ) )
+ {
+ if( strstr( yytext, "opt 0" ) )
+ parseQueryTree->setOptimizationLevel(0);
+ if( strstr( yytext, "opt 1" ) )
+ parseQueryTree->setOptimizationLevel(1);
+ if( strstr( yytext, "opt 2" ) )
+ parseQueryTree->setOptimizationLevel(2);
+ if( strstr( yytext, "opt 3" ) )
+ parseQueryTree->setOptimizationLevel(3);
+ if( strstr( yytext, "opt 4" ) )
+ parseQueryTree->setOptimizationLevel(4);
+ }
+ columnNo += yyleng;
+ }
+"//".* { columnNo += yyleng; }
+"--".* { columnNo += yyleng; }
+
+"[opt 0]" { parseQueryTree->setOptimizationLevel(0); columnNo += yyleng; }
+"[opt 1]" { parseQueryTree->setOptimizationLevel(1); columnNo += yyleng; }
+"[opt 2]" { parseQueryTree->setOptimizationLevel(2); columnNo += yyleng; }
+"[opt 3]" { parseQueryTree->setOptimizationLevel(3); columnNo += yyleng; }
+"[opt 4]" { parseQueryTree->setOptimizationLevel(4); columnNo += yyleng; }
+
+"complex" { SETTOKEN( COMPLEX, commandToken, COMPLEX ) }
+"re" { SETTOKEN( RE, commandToken, RE ) }
+"im" { SETTOKEN( IM, commandToken, IM ) }
+
+"struct" { SETTOKEN( STRCT, commandToken, STRCT ) }
+"fastscale" { SETTOKEN( FASTSCALE, commandToken, FASTSCALE ) }
+"members" { SETTOKEN( MEMBERS, commandToken, MEMBERS ) }
+"add" { SETTOKEN( ADD, commandToken, ADD ) }
+"alter" { SETTOKEN( ALTER, commandToken, ALTER ) }
+"list" { SETTOKEN( LIST, commandToken, LIST ) }
+"select" { SETTOKEN( SELECT, commandToken, SELECT ) }
+"from" { SETTOKEN( FROM, commandToken, FROM ) }
+"where" { SETTOKEN( WHERE, commandToken, WHERE ) }
+"as" { SETTOKEN( AS, commandToken, AS ) }
+"restrict" { SETTOKEN( RESTRICT, commandToken, RESTRICT ) }
+"to" { SETTOKEN( TO, commandToken, TO ) }
+"extend" { SETTOKEN( EXTEND, commandToken, EXTEND ) }
+"by" { SETTOKEN( BY, commandToken, BY ) }
+"project" { SETTOKEN( PROJECT, commandToken, PROJECT ) }
+"at" { SETTOKEN( AT, commandToken, AT ) }
+"dimension" { SETTOKEN( DIMENSION, commandToken, DIMENSION ) }
+"all_cell"|"all_cells" { SETTOKEN( ALL, commandToken, ALL ) }
+"some_cell"|"some_cells" { SETTOKEN( SOME, commandToken, SOME ) }
+"count_cell"|"count_cells" { SETTOKEN( COUNTCELLS, commandToken, COUNTCELLS ) }
+"add_cell"|"add_cells" { SETTOKEN( ADDCELLS, commandToken, ADDCELLS ) }
+"avg_cell"|"avg_cells" { SETTOKEN( AVGCELLS, commandToken, AVGCELLS ) }
+"min_cell"|"min_cells" { SETTOKEN( MINCELLS, commandToken, MINCELLS ) }
+"max_cell"|"max_cells" { SETTOKEN( MAXCELLS, commandToken, MAXCELLS ) }
+"sdom" { SETTOKEN( SDOM, commandToken, SDOM ) }
+"over" { SETTOKEN( OVER, commandToken, OVER ) }
+"overlay" { SETTOKEN( OVERLAY, commandToken, OVERLAY ) }
+"using" { SETTOKEN( USING, commandToken, USING ) }
+"lo" { SETTOKEN( LO, commandToken, LO ) }
+"hi" { SETTOKEN( HI, commandToken, HI ) }
+
+"insert" { SETTOKEN( INSERT, commandToken, INSERT ) }
+"into" { SETTOKEN( INTO, commandToken, INTO ) }
+"values" { SETTOKEN( VALUES, commandToken, VALUES ) }
+"delete" { SETTOKEN( DELETE, commandToken, DELETE ) }
+"drop" { SETTOKEN( DROP, commandToken, DROP ) }
+"create" { SETTOKEN( CREATE, commandToken, CREATE ) }
+"collection" { SETTOKEN( COLLECTION, commandToken, COLLECTION ) }
+
+"update" { SETTOKEN( UPDATE, commandToken, UPDATE ) }
+"set" { SETTOKEN( SET, commandToken, SET ) }
+"assign" { SETTOKEN( ASSIGN, commandToken, ASSIGN ) }
+"in" { SETTOKEN( IN, commandToken, IN ) }
+"marray" { SETTOKEN( MARRAY, commandToken, MARRAY ) }
+"condense" { SETTOKEN( CONDENSE, commandToken, CONDENSE ) }
+
+"oid" { SETTOKEN( OID, commandToken, OID ) }
+"shift" { SETTOKEN( SHIFT, commandToken, SHIFT ) }
+"scale" { SETTOKEN( SCALE, commandToken, SCALE ) }
+
+"." { SETTOKEN( DOT, commandToken, DOT ) }
+"," { SETTOKEN( COMMA, commandToken, COMMA ) }
+"is" { SETTOKEN( IS, commandToken, IS ) }
+"not" { SETTOKEN( NOT, commandToken, NOT ) }
+"sqrt" { SETTOKEN( SQRT, commandToken, SQRT ) }
+
+"tiff" { SETTOKEN( TIFF, commandToken, TIFF ) }
+"bmp" { SETTOKEN( BMP, commandToken, BMP ) }
+"hdf" { SETTOKEN( HDF, commandToken, HDF ) }
+"jpeg" { SETTOKEN( JPEG, commandToken, JPEG ) }
+"csv" { SETTOKEN( CSV, commandToken, CSV ) }
+"png" { SETTOKEN( PNG, commandToken, PNG ) }
+"vff" { SETTOKEN( VFF, commandToken, VFF ) }
+"tor" { SETTOKEN( TOR, commandToken, TOR ) }
+"dem" { SETTOKEN( DEM, commandToken, DEM ) }
+
+"inv_tiff" { SETTOKEN( INV_TIFF, commandToken, INV_TIFF ) }
+"inv_bmp" { SETTOKEN( INV_BMP, commandToken, INV_BMP ) }
+"inv_hdf" { SETTOKEN( INV_HDF, commandToken, INV_HDF ) }
+"inv_jpeg" { SETTOKEN( INV_JPEG, commandToken, INV_JPEG ) }
+"inv_csv" { SETTOKEN( INV_CSV, commandToken, INV_CSV ) }
+"inv_png" { SETTOKEN( INV_PNG, commandToken, INV_PNG ) }
+"inv_vff" { SETTOKEN( INV_VFF, commandToken, INV_VFF ) }
+"inv_tor" { SETTOKEN( INV_TOR, commandToken, INV_TOR ) }
+"inv_dem" { SETTOKEN( INV_DEM, commandToken, INV_DEM ) }
+
+"abs" { SETTOKEN( ABS, commandToken, ABS ) }
+"exp" { SETTOKEN( EXP, commandToken, EXP ) }
+"log" { SETTOKEN( LOG, commandToken, LOG ) }
+"ln" { SETTOKEN( LN, commandToken, LN ) }
+"sin" { SETTOKEN( SIN, commandToken, SIN ) }
+"cos" { SETTOKEN( COS, commandToken, COS ) }
+"tan" { SETTOKEN( TAN, commandToken, TAN ) }
+"sinh" { SETTOKEN( SINH, commandToken, SINH ) }
+"cosh" { SETTOKEN( COSH, commandToken, COSH ) }
+"tanh" { SETTOKEN( TANH, commandToken, TANH ) }
+"arcsin" { SETTOKEN( ARCSIN, commandToken, ARCSIN ) }
+"arccos" { SETTOKEN( ARCCOS, commandToken, ARCCOS ) }
+"arctan" { SETTOKEN( ARCTAN, commandToken, ARCTAN ) }
+
+"unsigned" { SETTOKEN( TUNSIG, typeToken, TUNSIG) }
+"bool" { SETTOKEN( TBOOL, typeToken, TBOOL) }
+"char" { SETTOKEN( TCHAR, typeToken, TCHAR) }
+"octet" { SETTOKEN( TOCTET, typeToken, TOCTET) }
+"short" { SETTOKEN( TSHORT, typeToken, TSHORT) }
+"ushort" { SETTOKEN( TUSHORT, typeToken, TUSHORT) }
+"long" { SETTOKEN( TLONG, typeToken, TLONG) }
+"ulong" { SETTOKEN( TULONG, typeToken, TULONG) }
+"float" { SETTOKEN( TFLOAT, typeToken, TFLOAT) }
+"double" { SETTOKEN( TDOUBLE, typeToken, TDOUBLE) }
+
+"bit" { SETTOKEN( BIT, commandToken, BIT ) }
+"and" { SETTOKEN( AND, commandToken, AND ) }
+"or" { SETTOKEN( OR, commandToken, OR ) }
+"xor" { SETTOKEN( XOR, commandToken, XOR ) }
+"+" { SETTOKEN( PLUS, commandToken, PLUS ) }
+"-" { SETTOKEN( MINUS, commandToken, MINUS ) }
+"*" { SETTOKEN( MULT, commandToken, MULT ) }
+"/" { SETTOKEN( DIV, commandToken, DIV ) }
+"=" { SETTOKEN( EQUAL, commandToken, EQUAL ) }
+"<" { SETTOKEN( LESS, commandToken, LESS ) }
+">" { SETTOKEN( GREATER, commandToken, GREATER ) }
+"<=" { SETTOKEN( LESSEQUAL, commandToken, LESSEQUAL ) }
+">=" { SETTOKEN( GREATEREQUAL, commandToken, GREATEREQUAL ) }
+"<>" { SETTOKEN( NOTEQUAL, commandToken, NOTEQUAL ) }
+"!=" { SETTOKEN( NOTEQUAL, commandToken, NOTEQUAL ) }
+":" { SETTOKEN( COLON, commandToken, COLON ) }
+";" { SETTOKEN( SEMICOLON, commandToken, SEMICOLON ) }
+"[" { SETTOKEN( LEPAR, commandToken, LEPAR ) }
+"]" { SETTOKEN( REPAR, commandToken, REPAR ) }
+"(" { SETTOKEN( LRPAR, commandToken, LRPAR ) }
+")" { SETTOKEN( RRPAR, commandToken, RRPAR ) }
+"{" { SETTOKEN( LCPAR, commandToken, LCPAR ) }
+"}" { SETTOKEN( RCPAR, commandToken, RCPAR ) }
+#MDD[0-9]+# { SETTOKEN( MDDPARAM, commandToken, atoi(&(yytext[1])) ) }
+$[0-9]+ { llerror("unresolved query parameter"); columnNo++; }
+
+"true"|"false"|"TRUE"|"FALSE" { SETTOKEN( BooleanLit, booleanToken, yytext[0] == 't' || yytext[0] == 'T') }
+[a-zA-Z_][a-zA-Z0-9_]* { SETSTRTOKEN( Identifier, identifierToken, yytext ) }
+"'"[^']"'" { SETTOKEN( CharacterLit, characterToken, yytext[1] ) }
+\"([^"]|\\["\n])*\" {
+ yytext[strlen(yytext)-1] = '\0';
+ SETSTRTOKEN( StringLit, stringToken, &(yytext[1]) )
+ }
+
+0x[0-f]+[cC] { SETINTTOKEN( strtoul( yytext, (char**)NULL, 16 ), 0, 1 ) }
+0x[0-f]+"us"|"US" { SETINTTOKEN( strtoul( yytext, (char**)NULL, 16 ), 0, 2 ) }
+0x[0-f]+"ul"|"UL" { SETINTTOKEN( strtoul( yytext, (char**)NULL, 16 ), 0, 4 ) }
+-?0x[0-f]+[oO] { SETINTTOKEN( strtol ( yytext, (char**)NULL, 16 ), 1, 1 ) }
+-?0x[0-f]+[sS] { SETINTTOKEN( strtol ( yytext, (char**)NULL, 16 ), 1, 2 ) }
+-?0x[0-f]+[lL]? { SETINTTOKEN( strtol ( yytext, (char**)NULL, 16 ), 1, 4 ) }
+
+[0-9]+[cC] { SETINTTOKEN( strtoul( yytext, (char**)NULL, 10 ), 0, 1 ) }
+[0-9]+"us"|"US" { SETINTTOKEN( strtoul( yytext, (char**)NULL, 10 ), 0, 2 ) }
+[0-9]+"ul"|"UL" { SETINTTOKEN( strtoul( yytext, (char**)NULL, 10 ), 0, 4 ) }
+-?[0-9]+[oO] { SETINTTOKEN( strtol ( yytext, (char**)NULL, 10 ), 1, 1 ) }
+-?[0-9]+[sS] { SETINTTOKEN( strtol ( yytext, (char**)NULL, 10 ), 1, 2 ) }
+-?[0-9]+[lL]? { SETINTTOKEN( strtol ( yytext, (char**)NULL, 10 ), 1, 4 ) }
+
+-?([0-9]+|([0-9]+(\.[0-9]+)?)([eE][-+]?[0-9]+)?)[dD] { SETFLTTOKEN( strtod( yytext, (char**)NULL ), 8 ) }
+-?([0-9]+|([0-9]+(\.[0-9]+)?)([eE][-+]?[0-9]+)?)[fF]? { SETFLTTOKEN( strtod( yytext, (char**)NULL ), 4 ) }
+
+[ ]+ { columnNo += yyleng; }
+\t { columnNo += 3; }
+\r { }
+\n { columnNo = 1; lineNo++; }
+. { SETTOKEN(UNKNOWN, commandToken, UNKNOWN ) }
+
+%%
+
+void yyreset()
+{
+ // Reset the input buffer of the scanner so that the next call of yylex() invokes
+ // YY_INPUT to fill the buffer with new data.
+ if ( YY_CURRENT_BUFFER )
+ yy_flush_buffer( YY_CURRENT_BUFFER );
+ lineNo = 1;
+ columnNo = 1;
+ currInfo = 0;
+}
+
+
+void llerror( char* s )
+{
+ RMInit::logOut << "Lex error: line " << lineNo << ", " << s << " at " << yytext << std::endl;
+}