#line 2 "SqlLexer_gen.cpp"

#line 4 "SqlLexer_gen.cpp"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 39
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

/* First, we deal with  platform-specific or compiler-specific issues. */

/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L

/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
 * if you want the limit (max/min) macros for int types. 
 */
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif

#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t; 
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;

/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN               (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN              (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN              (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX               (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX              (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX              (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX              (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX             (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX             (4294967295U)
#endif

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

#ifdef __cplusplus

/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST

#else	/* ! __cplusplus */

/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)

#define YY_USE_CONST

#endif	/* defined (__STDC__) */
#endif	/* ! __cplusplus */

#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif

/* Returned upon end-of-file. */
#define YY_NULL 0

/* Promotes a possibly negative, possibly signed char to an unsigned
 * integer for use as an array index.  If the signed char is negative,
 * we want to instead treat it as an 8-bit unsigned char, hence the
 * double cast.
 */
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)

/* An opaque pointer. */
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif

/* For convenience, these vars (plus the bison vars far below)
   are macros in the reentrant scanner. */
#define yyin yyg->yyin_r
#define yyout yyg->yyout_r
#define yyextra yyg->yyextra_r
#define yyleng yyg->yyleng_r
#define yytext yyg->yytext_r
#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
#define yy_flex_debug yyg->yy_flex_debug_r

/* Enter a start condition.  This macro really ought to take a parameter,
 * but we do it the disgusting crufty way forced on us by the ()-less
 * definition of BEGIN.
 */
#define BEGIN yyg->yy_start = 1 + 2 *

/* Translate the current start state into a value that can be later handed
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
 * compatibility.
 */
#define YY_START ((yyg->yy_start - 1) / 2)
#define YYSTATE YY_START

/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)

/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE quickstep_yyrestart(yyin ,yyscanner )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#endif

/* The state buf must be large enough to hold one state per character in the main buffer.
 */
#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))

#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2

    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
     *       access to the local variable yy_act. Since yyless() is a macro, it would break
     *       existing scanners that call yyless() from OUTSIDE quickstep_yylex. 
     *       One obvious solution it to make yy_act a global. I tried that, and saw
     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
     *       normally declared as a register variable-- so it is not worth it.
     */
    #define  YY_LESS_LINENO(n) \
            do { \
                int yyl;\
                for ( yyl = n; yyl < yyleng; ++yyl )\
                    if ( yytext[yyl] == '\n' )\
                        --yylineno;\
            }while(0)
    #define YY_LINENO_REWIND_TO(dst) \
            do {\
                const char *p;\
                for ( p = yy_cp-1; p >= (dst); --p)\
                    if ( *p == '\n' )\
                        --yylineno;\
            }while(0)
    
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		*yy_cp = yyg->yy_hold_char; \
		YY_RESTORE_YY_MORE_OFFSET \
		yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
		} \
	while ( 0 )

#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
	{
	FILE *yy_input_file;

	char *yy_ch_buf;		/* input buffer */
	char *yy_buf_pos;		/* current position in input buffer */

	/* Size of input buffer in bytes, not including room for EOB
	 * characters.
	 */
	yy_size_t yy_buf_size;

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	yy_size_t yy_n_chars;

	/* Whether we "own" the buffer - i.e., we know we created it,
	 * and can realloc() it to grow it, and should free() it to
	 * delete it.
	 */
	int yy_is_our_buffer;

	/* Whether this is an "interactive" input source; if so, and
	 * if we're using stdio for input, then we want to use getc()
	 * instead of fread(), to make sure we stop fetching input after
	 * each newline.
	 */
	int yy_is_interactive;

	/* Whether we're considered to be at the beginning of a line.
	 * If so, '^' rules will be active on the next match, otherwise
	 * not.
	 */
	int yy_at_bol;

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */
    
	/* Whether to try to fill the input buffer when we reach the
	 * end of it.
	 */
	int yy_fill_buffer;

	int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via quickstep_yyrestart()), so that the user can continue scanning by
	 * just pointing yyin at a new input file.
	 */
#define YY_BUFFER_EOF_PENDING 2

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

/* We provide macros for accessing buffer states in case in the
 * future we want to put the buffer states in a more general
 * "scanner state".
 *
 * Returns the top of the stack, or NULL.
 */
#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
                          : NULL)

/* Same as previous macro, but useful when we know that the buffer stack is not
 * NULL or when we need an lvalue. For internal use only.
 */
#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]

void quickstep_yyrestart (FILE *input_file ,yyscan_t yyscanner );
void quickstep_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
YY_BUFFER_STATE quickstep_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
void quickstep_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void quickstep_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void quickstep_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
void quickstep_yypop_buffer_state (yyscan_t yyscanner );

static void quickstep_yyensure_buffer_stack (yyscan_t yyscanner );
static void quickstep_yy_load_buffer_state (yyscan_t yyscanner );
static void quickstep_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );

#define YY_FLUSH_BUFFER quickstep_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

YY_BUFFER_STATE quickstep_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE quickstep_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE quickstep_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );

void *quickstep_yyalloc (yy_size_t ,yyscan_t yyscanner );
void *quickstep_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
void quickstep_yyfree (void * ,yyscan_t yyscanner );

#define yy_new_buffer quickstep_yy_create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        quickstep_yyensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}

#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        quickstep_yyensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}

#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

#define quickstep_yywrap(yyscanner) 1
#define YY_SKIP_YYWRAP

typedef unsigned char YY_CHAR;

typedef int yy_state_type;

#define yytext_ptr yytext_r

static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
static int yy_get_next_buffer (yyscan_t yyscanner );
static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
	yyg->yytext_ptr = yy_bp; \
	yyleng = (size_t) (yy_cp - yy_bp); \
	yyg->yy_hold_char = *yy_cp; \
	*yy_cp = '\0'; \
	yyg->yy_c_buf_p = yy_cp;

#define YY_NUM_RULES 134
#define YY_END_OF_BUFFER 135
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
	{
	flex_int32_t yy_verify;
	flex_int32_t yy_nxt;
	};
static yyconst flex_int16_t yy_accept[498] =
    {   0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  135,    2,    2,  133,  133,  132,  131,  133,
      110,  106,  109,  106,  106,  129,  102,   99,  103,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  107,    4,    5,    5,    3,  125,  125,
      122,  126,  126,  120,  127,  127,  124,    1,  132,  100,
      130,  129,  129,  129,    0,  104,  101,  105,  128,  128,
      128,  128,   10,  128,  128,  128,   20,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  108,  128,  128,  128,

      128,  128,  128,  128,  128,  128,  128,   56,  128,  128,
      128,  128,  128,  128,  128,  128,  128,   68,   69,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,    4,    5,    3,  125,  121,  126,  119,  119,  111,
      113,  114,  115,  116,  117,  118,  119,  127,  123,  130,
      129,    0,  129,    6,    7,  128,    9,   11,  128,  128,
       15,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,

       52,  128,   58,  128,  128,  128,  128,  128,   64,  128,
       67,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,   84,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  111,  113,
      112,  128,  128,  128,  128,  128,  128,   21,  128,  128,
      128,   26,  128,  128,   28,  128,  128,  128,  128,   34,
      128,  128,   38,  128,  128,  128,  128,  128,   44,   45,
      128,   47,  128,  128,  128,  128,  128,   55,   57,   59,
       60,   61,  128,   63,   65,  128,  128,  128,  128,  128,
       76,  128,   78,  128,  128,  128,  128,  128,  128,  128,

       87,   89,  128,  128,  128,  128,  128,  128,  128,   97,
      128,  111,  112,    8,  128,  128,  128,  128,  128,  128,
       23,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,   40,   41,   42,  128,   46,  128,
       49,   50,  128,  128,  128,   62,   66,   70,   71,  128,
      128,  128,   77,  128,  128,   81,  128,  128,  128,   86,
      128,  128,  128,  128,   93,  128,  128,   96,  128,  128,
      128,   14,  128,  128,  128,  128,   24,  128,   27,  128,
      128,  128,  128,   32,  128,  128,  128,   37,  128,  128,
       48,   51,  128,  128,  128,  128,  128,  128,   80,  128,

       83,  128,  128,  128,   91,   92,   94,  128,  128,  128,
       13,  128,  128,  128,  128,  128,   19,  128,   30,   31,
      128,  128,  128,  128,   43,   53,  128,  128,   74,   75,
      128,  128,  128,  128,  128,   95,  128,  128,  128,  128,
      128,  128,  128,   29,  128,  128,   36,  128,   54,  128,
      128,  128,   85,  128,  128,  128,   12,  128,  128,  128,
       22,  128,   33,  128,  128,   72,  128,  128,   88,  128,
       98,  128,  128,  128,   25,   35,  128,   73,   79,  128,
      128,  128,   17,   18,  128,  128,   90,  128,  128,  128,
      128,  128,   82,  128,   39,   16,    0

    } ;

static yyconst flex_int32_t yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    5,    6,    1,    1,    7,    1,    8,    7,
        7,    7,    9,    7,   10,   11,    7,   12,   12,   12,
       12,   12,   12,   12,   12,   13,   13,   14,    7,   15,
       16,   17,    1,    1,   18,   19,   20,   21,   22,   23,
       24,   25,   26,   27,   28,   29,   30,   31,   32,   33,
       34,   35,   36,   37,   38,   39,   40,   41,   42,   43,
       44,   45,   44,    1,   46,    1,   47,   48,   49,   50,

       51,   52,   53,   54,   55,   56,   57,   58,   59,   60,
       61,   62,   63,   64,   65,   66,   67,   68,   69,   70,
       71,   43,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static yyconst flex_int32_t yy_meta[72] =
    {   0,
        1,    1,    2,    1,    1,    3,    1,    4,    1,    5,
        5,    6,    6,    5,    1,    1,    1,    7,    7,    7,
        7,    7,    7,    8,    8,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
        8,    8,    8,    1,    9,   10,    7,    7,    7,    7,
        7,    7,    8,    8,    8,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
        8
    } ;

static yyconst flex_int16_t yy_base[513] =
    {   0,
        0,    1,   46,    0,  117,  163,    2,    3,  128,  132,
        6,   10,  197, 1128, 1128,    0, 1128,   13, 1128,  177,
     1128, 1128, 1128,  178,    6,  130,    4, 1128,  142,  124,
      161,  160,  204,  121,  251,   92,  112,  163,  114,  125,
      209,    0,  173,  214,  182,  153,  253,  231,  258,  182,
      220,  237,  221, 1128,  152,    4,   19,    0,    0,    0,
      143,    0,    0,  322,    0,    0,  144,    0,   22, 1128,
        0,  289,  307,  320,   18, 1128, 1128, 1128,    0,  237,
      270,  267,  274,  258,  313,  278,    0,  325,  315,  305,
      319,  312,  332,  315,  316,  328, 1128,  342,  335,  330,

      337,  350,  355,  366,  364,  363,  382,    0,  374,  359,
      368,  382,  378,  376,  372,  381,  388,    0,  391,  378,
      382,  385,  395,  396,  392,  435,  402,  387,  425,  425,
      426,  427,  422,  428,  437,  443,  439,  438,  444,  431,
      451,  142,   29,    0,    0, 1128,    0, 1128, 1128,   22,
       24, 1128, 1128, 1128, 1128, 1128,    0,    0, 1128,    0,
      458,   26,   28,    0,    0,  453,    0,  454,  437,  452,
        0,  479,  444,  461,  446,  449,  458,  483,  466,  490,
      489,  498,  495,  498,  482,  501,  489,  505,  488,  489,
      508,  505,  501,  504,  496,  510,  510,  515,  516,  517,

      537,  511,    0,  506,  520,  536,  535,  546,    0,  544,
        0,  552,  553,  539,  557,  548,  542,  556,  552,  560,
      561,  559,   93,  563,    0,  560,  562,  570,  571,  565,
      561,  578,  566,  562,  581,  580,  591,  582,   30,  125,
        0,  584,  596,  606,  600,  604,  603,  616,  607,  606,
      600,    0,  601,  604,  603,  611,  604,  606,  617,  627,
      624,  622,    0,  619,  631,  617,  618,  632,    0,    0,
      626,    0,  642,  633,  640,  642,  661,    0,    0,    0,
        0,    0,  649,    0,  653,  655,  656,  666,  671,  676,
        0,  673,    0,  662,  657,  662,  679,  681,  676,  685,

      672,    0,  687,  672,  674,  688,  691,  691,  695,    0,
      701,  136, 1128,    0,  711,  711,  698,  711,  720,  728,
        0,  718,  715,  729,  730,  727,  736,  726,  734,  731,
      727,  728,  741,  743,    0,    0,    0,  742,    0,  743,
        0,    0,  731,  747,  731,    0,    0,    0,    0,  734,
      743,  740,    0,  767,  757,    0,  769,  756,  775,    0,
      765,  769,  784,  785,    0,  772,  791,    0,  778,  785,
      781,    0,  778,  796,  789,  779,    0,  799,    0,  799,
      793,  795,  788,    0,  789,  806,  808,    0,   82,  798,
        0,    0,  797,  815,  821,  811,  807,  820,    0,  830,

        0,  829,  845,  846,    0,    0,    0,  830,  835,  836,
        0,  836,  839,  841,  849,  846,    0,  851,    0,    0,
      852,  849,  842,  845,    0,    0,  853,  851,    0,    0,
      864,  859,  849,  857,  860,    0,  854,  881,  873,  874,
      872,  882,  887,    0,  886,  891,    0,  886,    0,  893,
      903,  896,    0,  894,  895,  904,    0,  908,  902,  910,
        0,  896,    0,  913,  904,  904,  905,  916,    0,  914,
        0,  909,  923,  913,    0,    0,  923,    0,    0,  926,
      942,  928,    0,    0,  936,  953,    0,  950,  955,  945,
      959,  946,    0,  947,    0,    0, 1128, 1012, 1022, 1032,

     1042, 1052, 1056, 1059, 1065, 1073, 1083, 1093, 1103, 1113,
     1118, 1120
    } ;

static yyconst flex_int16_t yy_def[513] =
    {   0,
      498,  498,  497,    3,  499,  499,  500,  500,  501,  501,
      502,  502,  497,  497,  497,  503,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  497,  497,  497,  497,  505,  506,  506,
      497,  507,  507,  508,  509,  509,  497,  503,  497,  497,
      510,  497,  497,  497,  497,  497,  497,  497,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  497,  504,  504,  504,

      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  497,  497,  505,  506,  497,  507,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  511,  509,  497,  510,
      497,  497,  497,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,

      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  497,  497,
      512,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,

      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  497,  497,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,

      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,  504,  504,  504,  504,
      504,  504,  504,  504,  504,  504,    0,  497,  497,  497,

      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497
    } ;

static yyconst flex_int16_t yy_nxt[1200] =
    {   0,
      497,  497,   15,   15,   60,   60,  143,  143,   66,   61,
       61,   67,   66,  497,   69,   67,   69,   72,   72,   76,
       77,  143,  143,   69,  497,   69,  162,  162,  497,  163,
      163,  143,  143,  239,  240,  240,  240,  163,  163,  163,
      163,  312,  240,  497,   16,   16,   17,   18,   19,   18,
       20,   21,   22,   23,   22,   24,   25,   26,   26,   17,
       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
       37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
       47,   48,   49,   50,   51,   52,   42,   53,   42,   54,
       17,   17,   30,   31,   32,   33,   34,   35,   36,   37,

       38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
       48,   49,   50,   51,   52,   42,   53,   17,   55,   56,
       57,   17,   17,   17,   17,   17,  105,  424,   97,  106,
       63,   17,   17,   17,   63,   61,  240,  240,  297,   61,
       73,   74,   74,  142,   80,  109,  110,  240,  240,  159,
      146,   75,   81,  142,   82,  105,   98,   78,  106,   83,
       17,   17,   17,   17,   55,   56,   57,   17,   17,   17,
       17,   17,   64,   80,  109,  110,   64,   17,   17,   17,
       75,   81,   84,   82,   88,   98,   85,   71,   83,   86,
      124,   89,   70,  107,   90,   91,  497,  497,  108,  121,

      497,  497,   87,  122,  115,  497,   17,   17,   17,  497,
      116,   84,  135,   88,  136,   85,  123,  137,   86,  124,
       89,   92,  107,   90,   91,   93,  111,  108,  121,   94,
      112,   87,  122,  115,  113,   95,  117,  138,   96,  116,
      114,  135,  141,  136,  118,  123,  137,  497,  119,  497,
       92,  120,  129,  497,   93,  111,  497,  164,   94,  112,
      130,  139,  140,  113,   95,  117,  138,   96,   99,  114,
      125,  141,  497,  118,  126,  131,  100,  119,  127,  101,
      120,  129,  102,  132,  128,  103,  164,  167,  104,  130,
      139,  140,  133,  168,  169,  134,  497,   99,  165,  125,

       72,   72,  497,  126,  131,  100,  166,  127,  101,  172,
       75,  102,  132,  128,  103,  497,  167,  104,  161,  161,
      497,  133,  168,  169,  134,  149,  178,  165,   75,  497,
       73,   74,   74,  150,  151,  166,  170,  179,  172,   75,
      152,   75,  173,  175,  153,  176,  174,  177,  180,  171,
      185,  181,  154,  186,  182,  178,  155,   75,  156,  187,
      183,  188,  157,  189,  190,  170,  179,  184,  191,  152,
       75,  173,  175,  153,  176,  174,  177,  180,  171,  185,
      181,  154,  186,  182,  192,  155,  193,  156,  187,  183,
      188,  157,  189,  190,  194,  195,  184,  191,  196,  202,

      203,  197,  198,  204,  205,  206,  208,  207,  209,  210,
      211,  212,  199,  192,  213,  193,  214,  200,  201,  215,
      216,  217,  218,  194,  195,  222,  223,  196,  202,  203,
      197,  198,  204,  205,  206,  208,  207,  209,  210,  211,
      212,  199,  226,  213,  227,  214,  200,  201,  215,  216,
      217,  218,  219,  224,  222,  223,  228,  220,  221,  229,
      230,  225,  231,  232,  233,  236,  234,  237,  238,  161,
      161,  226,  235,  227,  242,  243,  244,  245,  248,   75,
      249,  219,  224,  250,  251,  228,  220,  221,  229,  230,
      225,  231,  232,  233,  236,  234,  237,  238,  246,  252,

      253,  235,  254,  242,  243,  244,  245,  248,   75,  249,
      247,  255,  250,  251,  256,  257,  258,  260,  261,  262,
      259,  263,  264,  265,  266,  267,  268,  246,  252,  253,
      269,  254,  270,  271,  272,  273,  274,  275,  276,  247,
      255,  279,  280,  256,  257,  258,  260,  261,  262,  259,
      263,  264,  265,  266,  267,  268,  281,  282,  277,  269,
      283,  270,  271,  272,  273,  274,  275,  276,  278,  284,
      279,  280,  285,  286,  287,  288,  289,  290,  291,  292,
      293,  294,  295,  296,  298,  281,  282,  277,  299,  283,
      300,  301,  302,  303,  304,  305,  306,  278,  284,  307,

      308,  285,  286,  287,  288,  289,  290,  291,  292,  293,
      294,  295,  296,  298,  309,  310,  311,  299,  314,  300,
      301,  302,  303,  304,  305,  306,  315,  316,  307,  308,
      317,  318,  319,  320,  321,  322,  323,  324,  325,  326,
      327,  328,  329,  309,  310,  311,  330,  314,  331,  332,
      333,  334,  335,  336,  337,  315,  316,  338,  339,  317,
      318,  319,  320,  321,  322,  323,  324,  325,  326,  327,
      328,  329,  340,  341,  342,  330,  343,  331,  332,  333,
      334,  335,  336,  337,  344,  346,  338,  339,  347,  348,
      349,  350,  351,  352,  353,  345,  354,  355,  356,  357,

      358,  340,  341,  342,  359,  343,  360,  361,  362,  363,
      364,  365,  366,  344,  346,  367,  368,  347,  348,  349,
      350,  351,  352,  353,  345,  354,  355,  356,  357,  358,
      369,  370,  371,  359,  372,  360,  361,  362,  363,  364,
      365,  366,  375,  373,  367,  368,  374,  376,  377,  378,
      379,  380,  381,  382,  383,  384,  385,  386,  387,  369,
      370,  371,  388,  372,  389,  390,  391,  392,  393,  394,
      395,  375,  373,  396,  397,  374,  376,  377,  378,  379,
      380,  381,  382,  383,  384,  385,  386,  387,  398,  399,
      400,  388,  401,  389,  390,  391,  392,  393,  394,  395,

      402,  403,  396,  397,  404,  405,  406,  407,  408,  409,
      410,  411,  412,  413,  414,  415,  416,  398,  399,  400,
      417,  401,  418,  419,  420,  421,  422,  423,  425,  402,
      403,  426,  427,  404,  405,  406,  407,  408,  409,  410,
      411,  412,  413,  414,  415,  416,  428,  429,  430,  417,
      431,  418,  419,  420,  421,  422,  423,  425,  432,  433,
      426,  427,  434,  435,  436,  437,  438,  439,  440,  441,
      442,  443,  444,  445,  446,  428,  429,  430,  447,  431,
      448,  449,  450,  451,  452,  453,  454,  432,  433,  455,
      456,  434,  435,  436,  437,  438,  439,  440,  441,  442,

      443,  444,  445,  446,  457,  458,  459,  447,  460,  448,
      449,  450,  451,  452,  453,  454,  461,  462,  455,  456,
      463,  464,  465,  466,  467,  468,  469,  470,  471,  472,
      473,  474,  475,  457,  458,  459,  476,  460,  477,  478,
      479,  480,  481,  482,  483,  461,  462,  484,  485,  463,
      464,  465,  466,  467,  468,  469,  470,  471,  472,  473,
      474,  475,  486,  487,  488,  476,  489,  477,  478,  479,
      480,  481,  482,  483,  490,  491,  484,  485,  492,  493,
      494,  495,  496,  497,  497,  497,  497,  497,  497,  497,
      497,  486,  487,  488,  497,  489,  497,  497,  497,  497,

      497,  497,  497,  490,  491,  497,  497,  492,  493,  494,
      495,  496,   14,   14,   14,   14,   14,   14,   14,   14,
       14,   14,   58,   58,   58,   58,   58,   58,   58,   58,
       58,   58,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   62,   62,   62,   62,   62,   62,   62,   62,
       62,   62,   65,   65,   65,   65,   65,   65,   65,   65,
       65,   65,   68,   68,   79,   79,   79,  497,   79,  144,
      144,  144,  144,  145,  145,  145,  497,  145,  145,  145,
      145,  145,  145,  147,  147,  147,  497,  147,  147,  147,
      147,  497,  147,  148,  148,  148,  148,  148,  148,  148,

      148,  148,  148,  158,  158,  497,  158,  158,  158,  158,
      158,  158,  158,  160,  497,  160,  160,  160,  160,  160,
      160,  160,  160,  241,  241,  313,  313,   13,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497

    } ;

static yyconst flex_int16_t yy_chk[1200] =
    {   0,
        0,    0,    1,    2,    7,    8,   56,   56,   11,    7,
        8,   11,   12,    0,   18,   12,   18,   25,   25,   27,
       27,   57,   57,   69,    0,   69,   75,   75,    0,   75,
       75,  143,  143,  150,  150,  151,  151,  162,  162,  163,
      163,  239,  239,    0,    1,    2,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,

        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    5,    5,    5,
        5,    5,    5,    5,    5,    5,   36,  389,   34,   37,
        9,    5,    5,    5,   10,    9,  240,  240,  223,   10,
       26,   26,   26,  142,   30,   39,   40,  312,  312,   67,
       61,   26,   30,   55,   30,   36,   34,   29,   37,   30,
        5,    5,    5,    6,    6,    6,    6,    6,    6,    6,
        6,    6,    9,   30,   39,   40,   10,    6,    6,    6,
       26,   30,   31,   30,   32,   34,   31,   24,   30,   31,
       46,   32,   20,   38,   32,   32,   13,    0,   38,   45,

        0,    0,   31,   45,   43,    0,    6,    6,    6,    0,
       43,   31,   50,   32,   50,   31,   45,   50,   31,   46,
       32,   33,   38,   32,   32,   33,   41,   38,   45,   33,
       41,   31,   45,   43,   41,   33,   44,   51,   33,   43,
       41,   50,   53,   50,   44,   45,   50,    0,   44,    0,
       33,   44,   48,    0,   33,   41,    0,   80,   33,   41,
       48,   52,   52,   41,   33,   44,   51,   33,   35,   41,
       47,   53,    0,   44,   47,   49,   35,   44,   47,   35,
       44,   48,   35,   49,   47,   35,   80,   82,   35,   48,
       52,   52,   49,   83,   84,   49,    0,   35,   81,   47,

       72,   72,    0,   47,   49,   35,   81,   47,   35,   86,
       72,   35,   49,   47,   35,    0,   82,   35,   73,   73,
        0,   49,   83,   84,   49,   64,   90,   81,   73,    0,
       74,   74,   74,   64,   64,   81,   85,   91,   86,   72,
       64,   74,   88,   89,   64,   89,   88,   89,   92,   85,
       94,   93,   64,   95,   93,   90,   64,   73,   64,   96,
       93,   98,   64,   99,  100,   85,   91,   93,  101,   64,
       74,   88,   89,   64,   89,   88,   89,   92,   85,   94,
       93,   64,   95,   93,  102,   64,  103,   64,   96,   93,
       98,   64,   99,  100,  104,  105,   93,  101,  106,  109,

      110,  106,  107,  111,  112,  113,  114,  113,  115,  116,
      117,  119,  107,  102,  120,  103,  121,  107,  107,  122,
      123,  124,  125,  104,  105,  127,  128,  106,  109,  110,
      106,  107,  111,  112,  113,  114,  113,  115,  116,  117,
      119,  107,  130,  120,  131,  121,  107,  107,  122,  123,
      124,  125,  126,  129,  127,  128,  132,  126,  126,  133,
      134,  129,  135,  136,  137,  139,  138,  140,  141,  161,
      161,  130,  138,  131,  166,  168,  169,  170,  173,  161,
      174,  126,  129,  175,  176,  132,  126,  126,  133,  134,
      129,  135,  136,  137,  139,  138,  140,  141,  172,  177,

      178,  138,  179,  166,  168,  169,  170,  173,  161,  174,
      172,  180,  175,  176,  181,  182,  183,  184,  185,  186,
      183,  187,  188,  189,  190,  191,  192,  172,  177,  178,
      193,  179,  194,  195,  196,  197,  198,  199,  200,  172,
      180,  202,  204,  181,  182,  183,  184,  185,  186,  183,
      187,  188,  189,  190,  191,  192,  205,  206,  201,  193,
      207,  194,  195,  196,  197,  198,  199,  200,  201,  208,
      202,  204,  210,  212,  213,  214,  215,  216,  217,  218,
      219,  220,  221,  222,  224,  205,  206,  201,  226,  207,
      227,  228,  229,  230,  231,  232,  233,  201,  208,  234,

      235,  210,  212,  213,  214,  215,  216,  217,  218,  219,
      220,  221,  222,  224,  236,  237,  238,  226,  242,  227,
      228,  229,  230,  231,  232,  233,  243,  244,  234,  235,
      245,  246,  247,  248,  249,  250,  251,  253,  254,  255,
      256,  257,  258,  236,  237,  238,  259,  242,  260,  261,
      262,  264,  265,  266,  267,  243,  244,  268,  271,  245,
      246,  247,  248,  249,  250,  251,  253,  254,  255,  256,
      257,  258,  273,  274,  275,  259,  276,  260,  261,  262,
      264,  265,  266,  267,  277,  283,  268,  271,  285,  286,
      287,  288,  289,  290,  292,  277,  294,  295,  296,  297,

      298,  273,  274,  275,  299,  276,  300,  301,  303,  304,
      305,  306,  307,  277,  283,  308,  309,  285,  286,  287,
      288,  289,  290,  292,  277,  294,  295,  296,  297,  298,
      311,  315,  316,  299,  317,  300,  301,  303,  304,  305,
      306,  307,  319,  318,  308,  309,  318,  320,  322,  323,
      324,  325,  326,  327,  328,  329,  330,  331,  332,  311,
      315,  316,  333,  317,  334,  338,  340,  343,  344,  345,
      350,  319,  318,  351,  352,  318,  320,  322,  323,  324,
      325,  326,  327,  328,  329,  330,  331,  332,  354,  355,
      357,  333,  358,  334,  338,  340,  343,  344,  345,  350,

      359,  361,  351,  352,  362,  363,  364,  366,  367,  369,
      370,  371,  373,  374,  375,  376,  378,  354,  355,  357,
      380,  358,  381,  382,  383,  385,  386,  387,  390,  359,
      361,  393,  394,  362,  363,  364,  366,  367,  369,  370,
      371,  373,  374,  375,  376,  378,  395,  396,  397,  380,
      398,  381,  382,  383,  385,  386,  387,  390,  400,  402,
      393,  394,  403,  404,  408,  409,  410,  412,  413,  414,
      415,  416,  418,  421,  422,  395,  396,  397,  423,  398,
      424,  427,  428,  431,  432,  433,  434,  400,  402,  435,
      437,  403,  404,  408,  409,  410,  412,  413,  414,  415,

      416,  418,  421,  422,  438,  439,  440,  423,  441,  424,
      427,  428,  431,  432,  433,  434,  442,  443,  435,  437,
      445,  446,  448,  450,  451,  452,  454,  455,  456,  458,
      459,  460,  462,  438,  439,  440,  464,  441,  465,  466,
      467,  468,  470,  472,  473,  442,  443,  474,  477,  445,
      446,  448,  450,  451,  452,  454,  455,  456,  458,  459,
      460,  462,  480,  481,  482,  464,  485,  465,  466,  467,
      468,  470,  472,  473,  486,  488,  474,  477,  489,  490,
      491,  492,  494,    0,    0,    0,    0,    0,    0,    0,
        0,  480,  481,  482,    0,  485,    0,    0,    0,    0,

        0,    0,    0,  486,  488,    0,    0,  489,  490,  491,
      492,  494,  498,  498,  498,  498,  498,  498,  498,  498,
      498,  498,  499,  499,  499,  499,  499,  499,  499,  499,
      499,  499,  500,  500,  500,  500,  500,  500,  500,  500,
      500,  500,  501,  501,  501,  501,  501,  501,  501,  501,
      501,  501,  502,  502,  502,  502,  502,  502,  502,  502,
      502,  502,  503,  503,  504,  504,  504,    0,  504,  505,
      505,  505,  505,  506,  506,  506,    0,  506,  506,  506,
      506,  506,  506,  507,  507,  507,    0,  507,  507,  507,
      507,    0,  507,  508,  508,  508,  508,  508,  508,  508,

      508,  508,  508,  509,  509,    0,  509,  509,  509,  509,
      509,  509,  509,  510,    0,  510,  510,  510,  510,  510,
      510,  510,  510,  511,  511,  512,  512,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497,  497,
      497,  497,  497,  497,  497,  497,  497,  497,  497

    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[135] =
    {   0,
0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0,     };

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
#line 1 "../SqlLexer.lpp"
/**
 *   Copyright 2011-2015 Quickstep Technologies LLC.
 *   Copyright 2015 Pivotal Software, Inc.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 **/
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
#line 27 "../SqlLexer.lpp"
#include <cstdio>
#include <string>
#include <vector>

#include "parser/ParseLiteralValue.hpp"
#include "utility/PtrList.hpp"
#include "utility/PtrVector.hpp"

namespace quickstep {

class BinaryOperation;
class Comparison;
class ParseAssignment;
class ParseAttribute;
class ParseAttributeDefinition;
class ParseBlockProperties;
class ParseColumnConstraint;
class ParseCommand;
struct ParseCopyFromParams;
class ParseDataType;
class ParseExpression;
class ParseFunctionCall;
class ParseGroupBy;
class ParseHaving;
class ParseKeyIntegerValue;
class ParseKeyStringValue;
class ParseKeyStringList;
class ParseKeyValue;
class ParseLimit;
class ParseOrderBy;
class ParseOrderByItem;
class ParsePartitionClause;
class ParsePredicate;
class ParseSample;
class ParseScalarLiteral;
class ParseSelect;
class ParseSelectionClause;
class ParseSelectionItem;
class ParseSelectionItemScalar;
class ParseSelectionList;
class ParseSimpleTableReference;
class ParseStringKeyLiteralValues;
class ParseStatement;
class ParseStatementCopyFrom;
class ParseStatementCreateTable;
class ParseStatementDelete;
class ParseStatementDropTable;
class ParseStatementInsert;
class ParseStatementInsertTuple;
class ParseStatementInsertSelection;
class ParseStatementSelect;
class ParseStatementQuit;
class ParseStatementUpdate;
class ParseSubqueryExpression;
class ParseSubqueryTableReference;
class ParseTableReference;
class ParseTableReferenceSignature;
class Type;
class UnaryOperation;

}  // namespace quickstep

#include "parser/ParseString.hpp"
#include "parser/SqlParser_gen.hpp"
#include "parser/ParserUtil.hpp"

#define YY_USER_ACTION                                    \
  {                                                       \
    yylloc->first_line = yylineno;                        \
    yylloc->first_column = yycolumn;                      \
    yycolumn += yyleng;                                   \
  }

/* FIXME(chasseur, qzeng): Add support for hexadecimal literals. */
/**
 * These patterns are based on the SQL-2011 standard for syntax of numeric
 * literals (Part 2, Section 5.3 of the standard).
 **/





#line 1001 "SqlLexer_gen.cpp"

#define INITIAL 0
#define CONDITION_SQL 1
#define CONDITION_COMMAND 2
#define CONDITION_STRING_SINGLE_QUOTED 3
#define CONDITION_STRING_SINGLE_QUOTED_ESCAPED 4
#define CONDITION_STRING_DOUBLE_QUOTED 5

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user's section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
#include <unistd.h>
#endif

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

/* Holds the entire state of the reentrant scanner. */
struct yyguts_t
    {

    /* User-defined. Not touched by flex. */
    YY_EXTRA_TYPE yyextra_r;

    /* The rest are the same as the globals declared in the non-reentrant scanner. */
    FILE *yyin_r, *yyout_r;
    size_t yy_buffer_stack_top; /**< index of top of stack. */
    size_t yy_buffer_stack_max; /**< capacity of stack. */
    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
    char yy_hold_char;
    yy_size_t yy_n_chars;
    yy_size_t yyleng_r;
    char *yy_c_buf_p;
    int yy_init;
    int yy_start;
    int yy_did_buffer_switch_on_eof;
    int yy_start_stack_ptr;
    int yy_start_stack_depth;
    int *yy_start_stack;
    yy_state_type yy_last_accepting_state;
    char* yy_last_accepting_cpos;

    int yylineno_r;
    int yy_flex_debug_r;

    char *yytext_r;
    int yy_more_flag;
    int yy_more_len;

    YYSTYPE * yylval_r;

    YYLTYPE * yylloc_r;

    }; /* end struct yyguts_t */

static int yy_init_globals (yyscan_t yyscanner );

    /* This must go here because YYSTYPE and YYLTYPE are included
     * from bison output in section 1.*/
    #    define yylval yyg->yylval_r
    
    #    define yylloc yyg->yylloc_r
    
int quickstep_yylex_init (yyscan_t* scanner);

int quickstep_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);

/* Accessor methods to globals.
   These are made visible to non-reentrant scanners for convenience. */

int quickstep_yylex_destroy (yyscan_t yyscanner );

int quickstep_yyget_debug (yyscan_t yyscanner );

void quickstep_yyset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE quickstep_yyget_extra (yyscan_t yyscanner );

void quickstep_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *quickstep_yyget_in (yyscan_t yyscanner );

void quickstep_yyset_in  (FILE * in_str ,yyscan_t yyscanner );

FILE *quickstep_yyget_out (yyscan_t yyscanner );

void quickstep_yyset_out  (FILE * out_str ,yyscan_t yyscanner );

yy_size_t quickstep_yyget_leng (yyscan_t yyscanner );

char *quickstep_yyget_text (yyscan_t yyscanner );

int quickstep_yyget_lineno (yyscan_t yyscanner );

void quickstep_yyset_lineno (int line_number ,yyscan_t yyscanner );

int quickstep_yyget_column  (yyscan_t yyscanner );

void quickstep_yyset_column (int column_no ,yyscan_t yyscanner );

YYSTYPE * quickstep_yyget_lval (yyscan_t yyscanner );

void quickstep_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );

       YYLTYPE *quickstep_yyget_lloc (yyscan_t yyscanner );
    
        void quickstep_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
    
/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int quickstep_yywrap (yyscan_t yyscanner );
#else
extern int quickstep_yywrap (yyscan_t yyscanner );
#endif
#endif

#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
#endif

#ifndef YY_NO_INPUT

#ifdef __cplusplus
static int yyinput (yyscan_t yyscanner );
#else
static int input (yyscan_t yyscanner );
#endif

#endif

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif

/* Copy whatever the last rule matched to the standard output. */
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
 * we now use fwrite().
 */
#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
#endif

/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		size_t n; \
		for ( n = 0; n < max_size && \
			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
			buf[n] = (char) c; \
		if ( c == '\n' ) \
			buf[n++] = (char) c; \
		if ( c == EOF && ferror( yyin ) ) \
			YY_FATAL_ERROR( "input in flex scanner failed" ); \
		result = n; \
		} \
	else \
		{ \
		errno=0; \
		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(yyin); \
			} \
		}\
\

#endif

/* No semi-colon after return; correct usage is to write "yyterminate();" -
 * we don't want an extra ';' after the "return" because that will cause
 * some compilers to complain about unreachable statements.
 */
#ifndef yyterminate
#define yyterminate() return YY_NULL
#endif

/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif

/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
#endif

/* end tables serialization structures and prototypes */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1

extern int quickstep_yylex \
               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);

#define YY_DECL int quickstep_yylex \
               (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
#endif /* !YY_DECL */

/* Code executed at the beginning of each rule, after yytext and yyleng
 * have been set up.
 */
#ifndef YY_USER_ACTION
#define YY_USER_ACTION
#endif

/* Code executed at the end of each rule. */
#ifndef YY_BREAK
#define YY_BREAK break;
#endif

#define YY_RULE_SETUP \
	YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
	yy_state_type yy_current_state;
	char *yy_cp, *yy_bp;
	int yy_act;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

    yylval = yylval_param;

    yylloc = yylloc_param;

	if ( !yyg->yy_init )
		{
		yyg->yy_init = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

		if ( ! yyg->yy_start )
			yyg->yy_start = 1;	/* first start state */

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

		if ( ! YY_CURRENT_BUFFER ) {
			quickstep_yyensure_buffer_stack (yyscanner);
			YY_CURRENT_BUFFER_LVALUE =
				quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
		}

		quickstep_yy_load_buffer_state(yyscanner );
		}

	{
#line 123 "../SqlLexer.lpp"


#line 1283 "SqlLexer_gen.cpp"

	while ( 1 )		/* loops until end-of-file is reached */
		{
		yy_cp = yyg->yy_c_buf_p;

		/* Support of yytext. */
		*yy_cp = yyg->yy_hold_char;

		/* yy_bp points to the position in yy_ch_buf of the start of
		 * the current run.
		 */
		yy_bp = yy_cp;

		yy_current_state = yyg->yy_start;
yy_match:
		do
			{
			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
			if ( yy_accept[yy_current_state] )
				{
				yyg->yy_last_accepting_state = yy_current_state;
				yyg->yy_last_accepting_cpos = yy_cp;
				}
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 498 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 497 );
		yy_cp = yyg->yy_last_accepting_cpos;
		yy_current_state = yyg->yy_last_accepting_state;

yy_find_action:
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
			{
			yy_size_t yyl;
			for ( yyl = 0; yyl < yyleng; ++yyl )
				if ( yytext[yyl] == '\n' )
					   
    do{ yylineno++;
        yycolumn=0;
    }while(0)
;
			}

do_action:	/* This label is used only to access EOF actions. */

		switch ( yy_act )
	{ /* beginning of action switch */
			case 0: /* must back up */
			/* undo the effects of YY_DO_BEFORE_ACTION */
			*yy_cp = yyg->yy_hold_char;
			yy_cp = yyg->yy_last_accepting_cpos;
			yy_current_state = yyg->yy_last_accepting_state;
			goto yy_find_action;

case 1:
YY_RULE_SETUP
#line 126 "../SqlLexer.lpp"
{
    /* A forward slash character represents a system command. */
    BEGIN(CONDITION_COMMAND);
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_COMMAND;
  }
	YY_BREAK
case 2:
/* rule 2 can match eol */
YY_RULE_SETUP
#line 134 "../SqlLexer.lpp"
{
    /* This is a SQL command. Place the char back and process normally. */
    yyless(0);
    yycolumn--;
    BEGIN(CONDITION_SQL);
  }
	YY_BREAK


case 3:
YY_RULE_SETUP
#line 143 "../SqlLexer.lpp"
{
    /* This is a command argument. */
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_COMMAND;
  }
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 150 "../SqlLexer.lpp"
{
    /* Ignore whitespace. */
  }
	YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
#line 154 "../SqlLexer.lpp"
{
    /* Newline reverts the lexer to the initial state. */
    yycolumn = 0;
    BEGIN(INITIAL);
    return '\n';
  }
	YY_BREAK


case 6:
YY_RULE_SETUP
#line 163 "../SqlLexer.lpp"
return TOKEN_ADD;
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 164 "../SqlLexer.lpp"
return TOKEN_ALL;
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 165 "../SqlLexer.lpp"
return TOKEN_ALTER;
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 166 "../SqlLexer.lpp"
return TOKEN_AND;
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 167 "../SqlLexer.lpp"
return TOKEN_AS;
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 168 "../SqlLexer.lpp"
return TOKEN_ASC;
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 169 "../SqlLexer.lpp"
return TOKEN_ASC;
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 170 "../SqlLexer.lpp"
return TOKEN_BETWEEN;
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 171 "../SqlLexer.lpp"
return TOKEN_BIGINT;
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 172 "../SqlLexer.lpp"
return TOKEN_BIT;
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 173 "../SqlLexer.lpp"
return TOKEN_BLOCKPROPERTIES;
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 174 "../SqlLexer.lpp"
return TOKEN_BLOCKSAMPLE;
	YY_BREAK
case 18:
YY_RULE_SETUP
#line 175 "../SqlLexer.lpp"
return TOKEN_BLOOM_FILTER;
	YY_BREAK
case 19:
YY_RULE_SETUP
#line 176 "../SqlLexer.lpp"
return TOKEN_CSB_TREE;
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 177 "../SqlLexer.lpp"
return TOKEN_BY;
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 178 "../SqlLexer.lpp"
return TOKEN_CHARACTER;
	YY_BREAK
case 22:
YY_RULE_SETUP
#line 179 "../SqlLexer.lpp"
return TOKEN_CHARACTER;
	YY_BREAK
case 23:
YY_RULE_SETUP
#line 180 "../SqlLexer.lpp"
return TOKEN_CHECK;
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 181 "../SqlLexer.lpp"
return TOKEN_COLUMN;
	YY_BREAK
case 25:
YY_RULE_SETUP
#line 182 "../SqlLexer.lpp"
return TOKEN_CONSTRAINT;
	YY_BREAK
case 26:
YY_RULE_SETUP
#line 183 "../SqlLexer.lpp"
return TOKEN_COPY;
	YY_BREAK
case 27:
YY_RULE_SETUP
#line 184 "../SqlLexer.lpp"
return TOKEN_CREATE;
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 185 "../SqlLexer.lpp"
return TOKEN_DATE;
	YY_BREAK
case 29:
YY_RULE_SETUP
#line 186 "../SqlLexer.lpp"
return TOKEN_DATETIME;
	YY_BREAK
case 30:
YY_RULE_SETUP
#line 187 "../SqlLexer.lpp"
return TOKEN_DECIMAL;
	YY_BREAK
case 31:
YY_RULE_SETUP
#line 188 "../SqlLexer.lpp"
return TOKEN_DEFAULT;
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 189 "../SqlLexer.lpp"
return TOKEN_DELETE;
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 190 "../SqlLexer.lpp"
return TOKEN_DELIMITER;
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 191 "../SqlLexer.lpp"
return TOKEN_DESC;
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 192 "../SqlLexer.lpp"
return TOKEN_DESC;
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 193 "../SqlLexer.lpp"
return TOKEN_DISTINCT;
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 194 "../SqlLexer.lpp"
return TOKEN_DOUBLE;
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 195 "../SqlLexer.lpp"
return TOKEN_DROP;
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 196 "../SqlLexer.lpp"
return TOKEN_ESCAPE_STRINGS;
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 197 "../SqlLexer.lpp"
return TOKEN_FALSE;
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 198 "../SqlLexer.lpp"
return TOKEN_FIRST;
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 199 "../SqlLexer.lpp"
return TOKEN_FLOAT;
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 200 "../SqlLexer.lpp"
return TOKEN_FOREIGN;
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 201 "../SqlLexer.lpp"
return TOKEN_FROM;
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 202 "../SqlLexer.lpp"
return TOKEN_FULL;
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 203 "../SqlLexer.lpp"
return TOKEN_GROUP;
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 204 "../SqlLexer.lpp"
return TOKEN_HASH;
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 205 "../SqlLexer.lpp"
return TOKEN_HAVING;
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 206 "../SqlLexer.lpp"
return TOKEN_INDEX;
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 207 "../SqlLexer.lpp"
return TOKEN_INNER;
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 208 "../SqlLexer.lpp"
return TOKEN_INSERT;
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 209 "../SqlLexer.lpp"
return TOKEN_INTEGER;
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 210 "../SqlLexer.lpp"
return TOKEN_INTEGER;
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 211 "../SqlLexer.lpp"
return TOKEN_INTERVAL;
	YY_BREAK
case 55:
YY_RULE_SETUP
#line 212 "../SqlLexer.lpp"
return TOKEN_INTO;
	YY_BREAK
case 56:
YY_RULE_SETUP
#line 213 "../SqlLexer.lpp"
return TOKEN_IS;
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 214 "../SqlLexer.lpp"
return TOKEN_JOIN;
	YY_BREAK
case 58:
YY_RULE_SETUP
#line 215 "../SqlLexer.lpp"
return TOKEN_KEY;
	YY_BREAK
case 59:
YY_RULE_SETUP
#line 216 "../SqlLexer.lpp"
return TOKEN_LAST;
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 217 "../SqlLexer.lpp"
return TOKEN_LEFT;
	YY_BREAK
case 61:
YY_RULE_SETUP
#line 218 "../SqlLexer.lpp"
return TOKEN_LIKE;
	YY_BREAK
case 62:
YY_RULE_SETUP
#line 219 "../SqlLexer.lpp"
return TOKEN_LIMIT;
	YY_BREAK
case 63:
YY_RULE_SETUP
#line 220 "../SqlLexer.lpp"
return TOKEN_LONG;
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 221 "../SqlLexer.lpp"
return TOKEN_NOT;
	YY_BREAK
case 65:
YY_RULE_SETUP
#line 222 "../SqlLexer.lpp"
return TOKEN_NULL;
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 223 "../SqlLexer.lpp"
return TOKEN_NULLS;
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 224 "../SqlLexer.lpp"
return TOKEN_OFF;
	YY_BREAK
case 68:
YY_RULE_SETUP
#line 225 "../SqlLexer.lpp"
return TOKEN_ON;
	YY_BREAK
case 69:
YY_RULE_SETUP
#line 226 "../SqlLexer.lpp"
return TOKEN_OR;
	YY_BREAK
case 70:
YY_RULE_SETUP
#line 227 "../SqlLexer.lpp"
return TOKEN_ORDER;
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 228 "../SqlLexer.lpp"
return TOKEN_OUTER;
	YY_BREAK
case 72:
YY_RULE_SETUP
#line 229 "../SqlLexer.lpp"
return TOKEN_PARTITION;
	YY_BREAK
case 73:
YY_RULE_SETUP
#line 230 "../SqlLexer.lpp"
return TOKEN_PARTITIONS;
	YY_BREAK
case 74:
YY_RULE_SETUP
#line 231 "../SqlLexer.lpp"
return TOKEN_PERCENT;
	YY_BREAK
case 75:
YY_RULE_SETUP
#line 232 "../SqlLexer.lpp"
return TOKEN_PRIMARY;
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 233 "../SqlLexer.lpp"
return TOKEN_QUIT;
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 234 "../SqlLexer.lpp"
return TOKEN_RANGE;
	YY_BREAK
case 78:
YY_RULE_SETUP
#line 235 "../SqlLexer.lpp"
return TOKEN_REAL;
	YY_BREAK
case 79:
YY_RULE_SETUP
#line 236 "../SqlLexer.lpp"
return TOKEN_REFERENCES;
	YY_BREAK
case 80:
YY_RULE_SETUP
#line 237 "../SqlLexer.lpp"
return TOKEN_REGEXP;
	YY_BREAK
case 81:
YY_RULE_SETUP
#line 238 "../SqlLexer.lpp"
return TOKEN_RIGHT;
	YY_BREAK
case 82:
YY_RULE_SETUP
#line 239 "../SqlLexer.lpp"
return TOKEN_ROW_DELIMITER;
	YY_BREAK
case 83:
YY_RULE_SETUP
#line 240 "../SqlLexer.lpp"
return TOKEN_SELECT;
	YY_BREAK
case 84:
YY_RULE_SETUP
#line 241 "../SqlLexer.lpp"
return TOKEN_SET;
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 242 "../SqlLexer.lpp"
return TOKEN_SMALLINT;
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 243 "../SqlLexer.lpp"
return TOKEN_TABLE;
	YY_BREAK
case 87:
YY_RULE_SETUP
#line 244 "../SqlLexer.lpp"
return TOKEN_TIME;
	YY_BREAK
case 88:
YY_RULE_SETUP
#line 245 "../SqlLexer.lpp"
return TOKEN_TIMESTAMP;
	YY_BREAK
case 89:
YY_RULE_SETUP
#line 246 "../SqlLexer.lpp"
return TOKEN_TRUE;
	YY_BREAK
case 90:
YY_RULE_SETUP
#line 247 "../SqlLexer.lpp"
return TOKEN_TUPLESAMPLE;
	YY_BREAK
case 91:
YY_RULE_SETUP
#line 248 "../SqlLexer.lpp"
return TOKEN_UNIQUE;
	YY_BREAK
case 92:
YY_RULE_SETUP
#line 249 "../SqlLexer.lpp"
return TOKEN_UPDATE;
	YY_BREAK
case 93:
YY_RULE_SETUP
#line 250 "../SqlLexer.lpp"
return TOKEN_USING;
	YY_BREAK
case 94:
YY_RULE_SETUP
#line 251 "../SqlLexer.lpp"
return TOKEN_VALUES;
	YY_BREAK
case 95:
YY_RULE_SETUP
#line 252 "../SqlLexer.lpp"
return TOKEN_VARCHAR;
	YY_BREAK
case 96:
YY_RULE_SETUP
#line 253 "../SqlLexer.lpp"
return TOKEN_WHERE;
	YY_BREAK
case 97:
YY_RULE_SETUP
#line 254 "../SqlLexer.lpp"
return TOKEN_WITH;
	YY_BREAK
case 98:
YY_RULE_SETUP
#line 255 "../SqlLexer.lpp"
return TOKEN_YEARMONTH;
	YY_BREAK
case 99:
YY_RULE_SETUP
#line 257 "../SqlLexer.lpp"
return TOKEN_EQ;
	YY_BREAK
case 100:
YY_RULE_SETUP
#line 258 "../SqlLexer.lpp"
return TOKEN_NEQ;
	YY_BREAK
case 101:
YY_RULE_SETUP
#line 259 "../SqlLexer.lpp"
return TOKEN_NEQ;
	YY_BREAK
case 102:
YY_RULE_SETUP
#line 260 "../SqlLexer.lpp"
return TOKEN_LT;
	YY_BREAK
case 103:
YY_RULE_SETUP
#line 261 "../SqlLexer.lpp"
return TOKEN_GT;
	YY_BREAK
case 104:
YY_RULE_SETUP
#line 262 "../SqlLexer.lpp"
return TOKEN_LEQ;
	YY_BREAK
case 105:
YY_RULE_SETUP
#line 263 "../SqlLexer.lpp"
return TOKEN_GEQ;
	YY_BREAK
case 106:
YY_RULE_SETUP
#line 265 "../SqlLexer.lpp"
return yytext[0];
	YY_BREAK
case 107:
YY_RULE_SETUP
#line 266 "../SqlLexer.lpp"
return yytext[0];
	YY_BREAK
/**
    * Quoted strings. Prefacing a string with an 'e' or 'E' causes escape
    * sequences to be processed (as in PostgreSQL).
    **/
case 108:
YY_RULE_SETUP
#line 272 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_SINGLE_QUOTED_ESCAPED);
  }
	YY_BREAK
case 109:
YY_RULE_SETUP
#line 277 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_SINGLE_QUOTED);
  }
	YY_BREAK
case 110:
YY_RULE_SETUP
#line 282 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_DOUBLE_QUOTED);
  }
	YY_BREAK
/* CONDITION_SQL */
/* Catch an unterminated string. */

case YY_STATE_EOF(CONDITION_STRING_SINGLE_QUOTED):
case YY_STATE_EOF(CONDITION_STRING_SINGLE_QUOTED_ESCAPED):
case YY_STATE_EOF(CONDITION_STRING_DOUBLE_QUOTED):
#line 291 "../SqlLexer.lpp"
{
    delete yylval->string_value_;
    BEGIN(INITIAL);
    quickstep_yyerror(NULL, yyscanner, NULL, "unterminated string");
    return TOKEN_LEX_ERROR;
  }
	YY_BREAK

/* Process escape sequences. */

case 111:
YY_RULE_SETUP
#line 301 "../SqlLexer.lpp"
{
    /* Octal code */
    unsigned int code;
    std::sscanf(yytext + 1, "%o", &code);
    if (code > 0xff) {
      delete yylval->string_value_;
      BEGIN(INITIAL);
      quickstep_yyerror(NULL, yyscanner, NULL, "octal escape sequence out of 1-byte range");
      return TOKEN_LEX_ERROR;
    }
    yylval->string_value_->push_back(code);
  }
	YY_BREAK
case 112:
YY_RULE_SETUP
#line 313 "../SqlLexer.lpp"
{
    /* Hexadecimal code */
    unsigned int code;
    std::sscanf(yytext + 2, "%x", &code);
    yylval->string_value_->push_back(code);
  }
	YY_BREAK
case 113:
YY_RULE_SETUP
#line 319 "../SqlLexer.lpp"
{
    /* A numeric escape sequence that isn't correctly specified. */
    delete yylval->string_value_;
    BEGIN(INITIAL);
    quickstep_yyerror(NULL, yyscanner, NULL, "bad numeric escape sequence (must be octal or hex)");
    return TOKEN_LEX_ERROR;
  }
	YY_BREAK
case 114:
YY_RULE_SETUP
#line 326 "../SqlLexer.lpp"
{
    /* Backspace */
    yylval->string_value_->push_back('\b');
  }
	YY_BREAK
case 115:
YY_RULE_SETUP
#line 330 "../SqlLexer.lpp"
{
    /* Form-feed */
    yylval->string_value_->push_back('\f');
  }
	YY_BREAK
case 116:
YY_RULE_SETUP
#line 334 "../SqlLexer.lpp"
{
    /* Newline */
    yylval->string_value_->push_back('\n');
  }
	YY_BREAK
case 117:
YY_RULE_SETUP
#line 338 "../SqlLexer.lpp"
{
    /* Carriage-return */
    yylval->string_value_->push_back('\r');
  }
	YY_BREAK
case 118:
YY_RULE_SETUP
#line 342 "../SqlLexer.lpp"
{
    /* Horizontal Tab */
    yylval->string_value_->push_back('\t');
  }
	YY_BREAK
case 119:
/* rule 119 can match eol */
YY_RULE_SETUP
#line 346 "../SqlLexer.lpp"
{
    /* Any other character (including actual newline or carriage return) */
    yylval->string_value_->push_back(yytext[1]);
  }
	YY_BREAK
case 120:
YY_RULE_SETUP
#line 350 "../SqlLexer.lpp"
{
    /* This should only be encountered right before an EOF. */
    delete yylval->string_value_;
    BEGIN(INITIAL);
    quickstep_yyerror(NULL, yyscanner, NULL, "unfinished escape sequence");
    return TOKEN_LEX_ERROR;
  }
	YY_BREAK


case 121:
YY_RULE_SETUP
#line 360 "../SqlLexer.lpp"
{
    /* Two quotes in a row become a single quote (this is specified by the SQL standard). */
    yylval->string_value_->push_back('\'');
  }
	YY_BREAK
case 122:
YY_RULE_SETUP
#line 364 "../SqlLexer.lpp"
{
    /* End string */
    BEGIN(CONDITION_SQL);
    return TOKEN_STRING_SINGLE_QUOTED;
  }
	YY_BREAK


case 123:
YY_RULE_SETUP
#line 372 "../SqlLexer.lpp"
{
    /* Two quotes in a row become a single quote (this is specified by the SQL standard). */
    yylval->string_value_->push_back('"');
  }
	YY_BREAK
case 124:
YY_RULE_SETUP
#line 376 "../SqlLexer.lpp"
{
    /* End string */
    BEGIN(CONDITION_SQL);
    return TOKEN_STRING_DOUBLE_QUOTED;
  }
	YY_BREAK

case 125:
/* rule 125 can match eol */
YY_RULE_SETUP
#line 383 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 126:
/* rule 126 can match eol */
YY_RULE_SETUP
#line 388 "../SqlLexer.lpp"
{
  /* Scan up to a quote or escape sequence. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 127:
/* rule 127 can match eol */
YY_RULE_SETUP
#line 393 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK

case 128:
YY_RULE_SETUP
#line 399 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_NAME;
  }
	YY_BREAK
case 129:
YY_RULE_SETUP
#line 405 "../SqlLexer.lpp"
{
    yylval->numeric_literal_value_ = new quickstep::NumericParseLiteralValue(
        yylloc->first_line, yylloc->first_column, yytext);
    return TOKEN_UNSIGNED_NUMVAL;
  }
	YY_BREAK
case 130:
YY_RULE_SETUP
#line 411 "../SqlLexer.lpp"
/* comment */
	YY_BREAK
case 131:
/* rule 131 can match eol */
YY_RULE_SETUP
#line 413 "../SqlLexer.lpp"
{ yycolumn = 0; }
	YY_BREAK
case 132:
YY_RULE_SETUP
#line 415 "../SqlLexer.lpp"
; /* ignore white space */
	YY_BREAK
/* CONDITION_SQL */
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(CONDITION_COMMAND):
case YY_STATE_EOF(CONDITION_SQL):
#line 419 "../SqlLexer.lpp"
{
  /* All conditions except for mutli-state string extracting conditions. */
  BEGIN(INITIAL);
  return TOKEN_EOF;
}
	YY_BREAK
case 133:
YY_RULE_SETUP
#line 425 "../SqlLexer.lpp"
{
  BEGIN(INITIAL);
  quickstep_yyerror(NULL, yyscanner, NULL, "illegal character");
  return TOKEN_LEX_ERROR;
}
	YY_BREAK
case 134:
YY_RULE_SETUP
#line 431 "../SqlLexer.lpp"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 2180 "SqlLexer_gen.cpp"

	case YY_END_OF_BUFFER:
		{
		/* Amount of text matched not including the EOB char. */
		int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = yyg->yy_hold_char;
		YY_RESTORE_YY_MORE_OFFSET

		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
			{
			/* We're scanning a new file or input source.  It's
			 * possible that this happened because the user
			 * just pointed yyin at a new source and called
			 * quickstep_yylex().  If so, then we have to assure
			 * consistency between YY_CURRENT_BUFFER and our
			 * globals.  Here is the right place to do so, because
			 * this is the first action (other than possibly a
			 * back-up) that will match for the new input source.
			 */
			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
			}

		/* Note that here we test for yy_c_buf_p "<=" to the position
		 * of the first EOB in the buffer, since yy_c_buf_p will
		 * already have been incremented past the NUL character
		 * (since all states make transitions on EOB to the
		 * end-of-buffer state).  Contrast this with the test
		 * in input().
		 */
		if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state( yyscanner );

			/* Okay, we're now positioned to make the NUL
			 * transition.  We couldn't have
			 * yy_get_previous_state() go ahead and do it
			 * for us because it doesn't know how to deal
			 * with the possibility of jamming (and we don't
			 * want to build jamming into it because then it
			 * will run more slowly).
			 */

			yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);

			yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;

			if ( yy_next_state )
				{
				/* Consume the NUL. */
				yy_cp = ++yyg->yy_c_buf_p;
				yy_current_state = yy_next_state;
				goto yy_match;
				}

			else
				{
				yy_cp = yyg->yy_last_accepting_cpos;
				yy_current_state = yyg->yy_last_accepting_state;
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer( yyscanner ) )
			{
			case EOB_ACT_END_OF_FILE:
				{
				yyg->yy_did_buffer_switch_on_eof = 0;

				if ( quickstep_yywrap(yyscanner ) )
					{
					/* Note: because we've taken care in
					 * yy_get_next_buffer() to have set up
					 * yytext, we can now set up
					 * yy_c_buf_p so that if some total
					 * hoser (like flex itself) wants to
					 * call the scanner after we return the
					 * YY_NULL, it'll still work - another
					 * YY_NULL will get returned.
					 */
					yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! yyg->yy_did_buffer_switch_on_eof )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				yyg->yy_c_buf_p =
					yyg->yytext_ptr + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state( yyscanner );

				yy_cp = yyg->yy_c_buf_p;
				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
				goto yy_match;

			case EOB_ACT_LAST_MATCH:
				yyg->yy_c_buf_p =
				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];

				yy_current_state = yy_get_previous_state( yyscanner );

				yy_cp = yyg->yy_c_buf_p;
				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
				goto yy_find_action;
			}
		break;
		}

	default:
		YY_FATAL_ERROR(
			"fatal flex scanner internal error--no action found" );
	} /* end of action switch */
		} /* end of scanning one token */
	} /* end of user's declarations */
} /* end of quickstep_yylex */

/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *	EOB_ACT_LAST_MATCH -
 *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *	EOB_ACT_END_OF_FILE - end of file
 */
static int yy_get_next_buffer (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = yyg->yytext_ptr;
	int number_to_move, i;
	int ret_val;

	if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
		YY_FATAL_ERROR(
		"fatal flex scanner internal error--end of buffer missed" );

	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
		{ /* Don't try to fill the buffer, so this is an EOF. */
		if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
			{
			/* We matched a single character, the EOB, so
			 * treat this as a final EOF.
			 */
			return EOB_ACT_END_OF_FILE;
			}

		else
			{
			/* We matched some text prior to the EOB, first
			 * process it.
			 */
			return EOB_ACT_LAST_MATCH;
			}
		}

	/* Try to read more data. */

	/* First move last chars to start of buffer. */
	number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;

	for ( i = 0; i < number_to_move; ++i )
		*(dest++) = *(source++);

	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
		/* don't do the read, it's not guaranteed to return an EOF,
		 * just force an EOF
		 */
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;

	else
		{
			yy_size_t num_to_read =
			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */

			/* just a shorter name for the current buffer */
			YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;

			int yy_c_buf_p_offset =
				(int) (yyg->yy_c_buf_p - b->yy_ch_buf);

			if ( b->yy_is_our_buffer )
				{
				yy_size_t new_size = b->yy_buf_size * 2;

				if ( new_size <= 0 )
					b->yy_buf_size += b->yy_buf_size / 8;
				else
					b->yy_buf_size *= 2;

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					quickstep_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
				}
			else
				/* Can't grow it, we don't own it. */
				b->yy_ch_buf = 0;

			if ( ! b->yy_ch_buf )
				YY_FATAL_ERROR(
				"fatal error - scanner input buffer overflow" );

			yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];

			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
						number_to_move - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

		/* Read in more data. */
		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
			yyg->yy_n_chars, num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

	if ( yyg->yy_n_chars == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			quickstep_yyrestart(yyin  ,yyscanner);
			}

		else
			{
			ret_val = EOB_ACT_LAST_MATCH;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

	if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) quickstep_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
	}

	yyg->yy_n_chars += number_to_move;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;

	yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];

	return ret_val;
}

/* yy_get_previous_state - get the state just before the EOB char was reached */

    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
{
	yy_state_type yy_current_state;
	char *yy_cp;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	yy_current_state = yyg->yy_start;

	for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
		{
		YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
		if ( yy_accept[yy_current_state] )
			{
			yyg->yy_last_accepting_state = yy_current_state;
			yyg->yy_last_accepting_cpos = yy_cp;
			}
		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
			{
			yy_current_state = (int) yy_def[yy_current_state];
			if ( yy_current_state >= 498 )
				yy_c = yy_meta[(unsigned int) yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
		}

	return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
{
	int yy_is_jam;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
	char *yy_cp = yyg->yy_c_buf_p;

	YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		yyg->yy_last_accepting_state = yy_current_state;
		yyg->yy_last_accepting_cpos = yy_cp;
		}
	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
		{
		yy_current_state = (int) yy_def[yy_current_state];
		if ( yy_current_state >= 498 )
			yy_c = yy_meta[(unsigned int) yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
	yy_is_jam = (yy_current_state == 497);

	(void)yyg;
	return yy_is_jam ? 0 : yy_current_state;
}

#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (yyscan_t yyscanner)
#else
    static int input  (yyscan_t yyscanner)
#endif

{
	int c;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

	if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
		{
		/* yy_c_buf_p now points to the character we want to return.
		 * If this occurs *before* the EOB characters, then it's a
		 * valid NUL; if not, then we've hit the end of the buffer.
		 */
		if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
			/* This was really a NUL. */
			*yyg->yy_c_buf_p = '\0';

		else
			{ /* need more input */
			yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
			++yyg->yy_c_buf_p;

			switch ( yy_get_next_buffer( yyscanner ) )
				{
				case EOB_ACT_LAST_MATCH:
					/* This happens because yy_g_n_b()
					 * sees that we've accumulated a
					 * token and flags that we need to
					 * try matching the token before
					 * proceeding.  But for input(),
					 * there's no matching to consider.
					 * So convert the EOB_ACT_LAST_MATCH
					 * to EOB_ACT_END_OF_FILE.
					 */

					/* Reset buffer status. */
					quickstep_yyrestart(yyin ,yyscanner);

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( quickstep_yywrap(yyscanner ) )
						return EOF;

					if ( ! yyg->yy_did_buffer_switch_on_eof )
						YY_NEW_FILE;
#ifdef __cplusplus
					return yyinput(yyscanner);
#else
					return input(yyscanner);
#endif
					}

				case EOB_ACT_CONTINUE_SCAN:
					yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
					break;
				}
			}
		}

	c = *(unsigned char *) yyg->yy_c_buf_p;	/* cast for 8-bit char's */
	*yyg->yy_c_buf_p = '\0';	/* preserve yytext */
	yyg->yy_hold_char = *++yyg->yy_c_buf_p;

	if ( c == '\n' )
		   
    do{ yylineno++;
        yycolumn=0;
    }while(0)
;

	return c;
}
#endif	/* ifndef YY_NO_INPUT */

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * @param yyscanner The scanner object.
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void quickstep_yyrestart  (FILE * input_file , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	if ( ! YY_CURRENT_BUFFER ){
        quickstep_yyensure_buffer_stack (yyscanner);
		YY_CURRENT_BUFFER_LVALUE =
            quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
	}

	quickstep_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
	quickstep_yy_load_buffer_state(yyscanner );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * @param yyscanner The scanner object.
 */
    void quickstep_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	/* TODO. We should be able to replace this entire function body
	 * with
	 *		quickstep_yypop_buffer_state();
	 *		quickstep_yypush_buffer_state(new_buffer);
     */
	quickstep_yyensure_buffer_stack (yyscanner);
	if ( YY_CURRENT_BUFFER == new_buffer )
		return;

	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*yyg->yy_c_buf_p = yyg->yy_hold_char;
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	quickstep_yy_load_buffer_state(yyscanner );

	/* We don't actually know whether we did this switch during
	 * EOF (quickstep_yywrap()) processing, but the only time this flag
	 * is looked at is after quickstep_yywrap() is called, so it's safe
	 * to go ahead and always set it.
	 */
	yyg->yy_did_buffer_switch_on_eof = 1;
}

static void quickstep_yy_load_buffer_state  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	yyg->yy_hold_char = *yyg->yy_c_buf_p;
}

/** Allocate and initialize an input buffer state.
 * @param file A readable stream.
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
 * @param yyscanner The scanner object.
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE quickstep_yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) quickstep_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_create_buffer()" );

	b->yy_buf_size = size;

	/* yy_ch_buf has to be 2 characters longer than the size given because
	 * we need to put in 2 end-of-buffer characters.
	 */
	b->yy_ch_buf = (char *) quickstep_yyalloc(b->yy_buf_size + 2 ,yyscanner );
	if ( ! b->yy_ch_buf )
		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_create_buffer()" );

	b->yy_is_our_buffer = 1;

	quickstep_yy_init_buffer(b,file ,yyscanner);

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with quickstep_yy_create_buffer()
 * @param yyscanner The scanner object.
 */
    void quickstep_yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	if ( ! b )
		return;

	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;

	if ( b->yy_is_our_buffer )
		quickstep_yyfree((void *) b->yy_ch_buf ,yyscanner );

	quickstep_yyfree((void *) b ,yyscanner );
}

/* Initializes or reinitializes a buffer.
 * This function is sometimes called more than once on the same buffer,
 * such as during a quickstep_yyrestart() or at EOF.
 */
    static void quickstep_yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)

{
	int oerrno = errno;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	quickstep_yy_flush_buffer(b ,yyscanner);

	b->yy_input_file = file;
	b->yy_fill_buffer = 1;

    /* If b is the current buffer, then quickstep_yy_init_buffer was _probably_
     * called from quickstep_yyrestart() or through yy_get_next_buffer.
     * In that case, we don't want to reset the lineno or column.
     */
    if (b != YY_CURRENT_BUFFER){
        b->yy_bs_lineno = 1;
        b->yy_bs_column = 0;
    }

        b->yy_is_interactive = 0;
    
	errno = oerrno;
}

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * @param yyscanner The scanner object.
 */
    void quickstep_yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if ( ! b )
		return;

	b->yy_n_chars = 0;

	/* We always need two end-of-buffer characters.  The first causes
	 * a transition to the end-of-buffer state.  The second causes
	 * a jam in that state.
	 */
	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

	b->yy_buf_pos = &b->yy_ch_buf[0];

	b->yy_at_bol = 1;
	b->yy_buffer_status = YY_BUFFER_NEW;

	if ( b == YY_CURRENT_BUFFER )
		quickstep_yy_load_buffer_state(yyscanner );
}

/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *  @param yyscanner The scanner object.
 */
void quickstep_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (new_buffer == NULL)
		return;

	quickstep_yyensure_buffer_stack(yyscanner);

	/* This block is copied from quickstep_yy_switch_to_buffer. */
	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*yyg->yy_c_buf_p = yyg->yy_hold_char;
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

	/* Only push if top exists. Otherwise, replace top. */
	if (YY_CURRENT_BUFFER)
		yyg->yy_buffer_stack_top++;
	YY_CURRENT_BUFFER_LVALUE = new_buffer;

	/* copied from quickstep_yy_switch_to_buffer. */
	quickstep_yy_load_buffer_state(yyscanner );
	yyg->yy_did_buffer_switch_on_eof = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  @param yyscanner The scanner object.
 */
void quickstep_yypop_buffer_state (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (!YY_CURRENT_BUFFER)
		return;

	quickstep_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
	YY_CURRENT_BUFFER_LVALUE = NULL;
	if (yyg->yy_buffer_stack_top > 0)
		--yyg->yy_buffer_stack_top;

	if (YY_CURRENT_BUFFER) {
		quickstep_yy_load_buffer_state(yyscanner );
		yyg->yy_did_buffer_switch_on_eof = 1;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void quickstep_yyensure_buffer_stack (yyscan_t yyscanner)
{
	yy_size_t num_to_alloc;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	if (!yyg->yy_buffer_stack) {

		/* First allocation is just for 2 elements, since we don't know if this
		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
		 * immediate realloc on the next call.
         */
		num_to_alloc = 1;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)quickstep_yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								, yyscanner);
		if ( ! yyg->yy_buffer_stack )
			YY_FATAL_ERROR( "out of dynamic memory in quickstep_yyensure_buffer_stack()" );
								  
		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
				
		yyg->yy_buffer_stack_max = num_to_alloc;
		yyg->yy_buffer_stack_top = 0;
		return;
	}

	if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){

		/* Increase the buffer to prepare for a possible push. */
		int grow_size = 8 /* arbitrary grow size */;

		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)quickstep_yyrealloc
								(yyg->yy_buffer_stack,
								num_to_alloc * sizeof(struct yy_buffer_state*)
								, yyscanner);
		if ( ! yyg->yy_buffer_stack )
			YY_FATAL_ERROR( "out of dynamic memory in quickstep_yyensure_buffer_stack()" );

		/* zero only the new slots.*/
		memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
		yyg->yy_buffer_stack_max = num_to_alloc;
	}
}

/** Setup the input buffer state to scan directly from a user-specified character buffer.
 * @param base the character buffer
 * @param size the size in bytes of the character buffer
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object. 
 */
YY_BUFFER_STATE quickstep_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	if ( size < 2 ||
	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
	     base[size-1] != YY_END_OF_BUFFER_CHAR )
		/* They forgot to leave room for the EOB's. */
		return 0;

	b = (YY_BUFFER_STATE) quickstep_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_scan_buffer()" );

	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = 0;
	b->yy_n_chars = b->yy_buf_size;
	b->yy_is_interactive = 0;
	b->yy_at_bol = 1;
	b->yy_fill_buffer = 0;
	b->yy_buffer_status = YY_BUFFER_NEW;

	quickstep_yy_switch_to_buffer(b ,yyscanner );

	return b;
}

/** Setup the input buffer state to scan a string. The next call to quickstep_yylex() will
 * scan from a @e copy of @a str.
 * @param yystr a NUL-terminated string to scan
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 * @note If you want to scan bytes that may contain NUL values, then use
 *       quickstep_yy_scan_bytes() instead.
 */
YY_BUFFER_STATE quickstep_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
{
    
	return quickstep_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
}

/** Setup the input buffer state to scan the given bytes. The next call to quickstep_yylex() will
 * scan from a @e copy of @a bytes.
 * @param yybytes the byte buffer to scan
 * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE quickstep_yy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	yy_size_t i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = _yybytes_len + 2;
	buf = (char *) quickstep_yyalloc(n ,yyscanner );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_scan_bytes()" );

	for ( i = 0; i < _yybytes_len; ++i )
		buf[i] = yybytes[i];

	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;

	b = quickstep_yy_scan_buffer(buf,n ,yyscanner);
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in quickstep_yy_scan_bytes()" );

	/* It's okay to grow etc. this buffer, and we should throw it
	 * away when we're done.
	 */
	b->yy_is_our_buffer = 1;

	return b;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
{
    	(void) fprintf( stderr, "%s\n", msg );
	exit( YY_EXIT_FAILURE );
}

/* Redefine yyless() so it works in section 3 code. */

#undef yyless
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		yytext[yyleng] = yyg->yy_hold_char; \
		yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
		yyg->yy_hold_char = *yyg->yy_c_buf_p; \
		*yyg->yy_c_buf_p = '\0'; \
		yyleng = yyless_macro_arg; \
		} \
	while ( 0 )

/* Accessor  methods (get/set functions) to struct members. */

/** Get the user-defined data for this scanner.
 * @param yyscanner The scanner object.
 */
YY_EXTRA_TYPE quickstep_yyget_extra  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyextra;
}

/** Get the current line number.
 * @param yyscanner The scanner object.
 */
int quickstep_yyget_lineno  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    
        if (! YY_CURRENT_BUFFER)
            return 0;
    
    return yylineno;
}

/** Get the current column number.
 * @param yyscanner The scanner object.
 */
int quickstep_yyget_column  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    
        if (! YY_CURRENT_BUFFER)
            return 0;
    
    return yycolumn;
}

/** Get the input stream.
 * @param yyscanner The scanner object.
 */
FILE *quickstep_yyget_in  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyin;
}

/** Get the output stream.
 * @param yyscanner The scanner object.
 */
FILE *quickstep_yyget_out  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyout;
}

/** Get the length of the current token.
 * @param yyscanner The scanner object.
 */
yy_size_t quickstep_yyget_leng  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyleng;
}

/** Get the current token.
 * @param yyscanner The scanner object.
 */

char *quickstep_yyget_text  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yytext;
}

/** Set the user-defined data. This data is never touched by the scanner.
 * @param user_defined The data to be associated with this scanner.
 * @param yyscanner The scanner object.
 */
void quickstep_yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyextra = user_defined ;
}

/** Set the current line number.
 * @param line_number
 * @param yyscanner The scanner object.
 */
void quickstep_yyset_lineno (int  line_number , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        /* lineno is only valid if an input buffer exists. */
        if (! YY_CURRENT_BUFFER )
           YY_FATAL_ERROR( "quickstep_yyset_lineno called with no buffer" );
    
    yylineno = line_number;
}

/** Set the current column.
 * @param line_number
 * @param yyscanner The scanner object.
 */
void quickstep_yyset_column (int  column_no , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        /* column is only valid if an input buffer exists. */
        if (! YY_CURRENT_BUFFER )
           YY_FATAL_ERROR( "quickstep_yyset_column called with no buffer" );
    
    yycolumn = column_no;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param in_str A readable stream.
 * @param yyscanner The scanner object.
 * @see quickstep_yy_switch_to_buffer
 */
void quickstep_yyset_in (FILE *  in_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyin = in_str ;
}

void quickstep_yyset_out (FILE *  out_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyout = out_str ;
}

int quickstep_yyget_debug  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yy_flex_debug;
}

void quickstep_yyset_debug (int  bdebug , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yy_flex_debug = bdebug ;
}

/* Accessor methods for yylval and yylloc */

YYSTYPE * quickstep_yyget_lval  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yylval;
}

void quickstep_yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yylval = yylval_param;
}

YYLTYPE *quickstep_yyget_lloc  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yylloc;
}
    
void quickstep_yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yylloc = yylloc_param;
}
    
/* User-visible API */

/* quickstep_yylex_init is special because it creates the scanner itself, so it is
 * the ONLY reentrant function that doesn't take the scanner as the last argument.
 * That's why we explicitly handle the declaration, instead of using our macros.
 */

int quickstep_yylex_init(yyscan_t* ptr_yy_globals)

{
    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }

    *ptr_yy_globals = (yyscan_t) quickstep_yyalloc ( sizeof( struct yyguts_t ), NULL );

    if (*ptr_yy_globals == NULL){
        errno = ENOMEM;
        return 1;
    }

    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));

    return yy_init_globals ( *ptr_yy_globals );
}

/* quickstep_yylex_init_extra has the same functionality as quickstep_yylex_init, but follows the
 * convention of taking the scanner as the last argument. Note however, that
 * this is a *pointer* to a scanner, as it will be allocated by this call (and
 * is the reason, too, why this function also must handle its own declaration).
 * The user defined value in the first argument will be available to quickstep_yyalloc in
 * the yyextra field.
 */

int quickstep_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )

{
    struct yyguts_t dummy_yyguts;

    quickstep_yyset_extra (yy_user_defined, &dummy_yyguts);

    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }
	
    *ptr_yy_globals = (yyscan_t) quickstep_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
	
    if (*ptr_yy_globals == NULL){
        errno = ENOMEM;
        return 1;
    }
    
    /* By setting to 0xAA, we expose bugs in
    yy_init_globals. Leave at 0x00 for releases. */
    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
    
    quickstep_yyset_extra (yy_user_defined, *ptr_yy_globals);
    
    return yy_init_globals ( *ptr_yy_globals );
}

static int yy_init_globals (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from quickstep_yylex_destroy(), so don't allocate here.
     */

    yyg->yy_buffer_stack = 0;
    yyg->yy_buffer_stack_top = 0;
    yyg->yy_buffer_stack_max = 0;
    yyg->yy_c_buf_p = (char *) 0;
    yyg->yy_init = 0;
    yyg->yy_start = 0;

    yyg->yy_start_stack_ptr = 0;
    yyg->yy_start_stack_depth = 0;
    yyg->yy_start_stack =  NULL;

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = (FILE *) 0;
    yyout = (FILE *) 0;
#endif

    /* For future reference: Set errno on error, since we are called by
     * quickstep_yylex_init()
     */
    return 0;
}

/* quickstep_yylex_destroy is for both reentrant and non-reentrant scanners. */
int quickstep_yylex_destroy  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		quickstep_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
		YY_CURRENT_BUFFER_LVALUE = NULL;
		quickstep_yypop_buffer_state(yyscanner);
	}

	/* Destroy the stack itself. */
	quickstep_yyfree(yyg->yy_buffer_stack ,yyscanner);
	yyg->yy_buffer_stack = NULL;

    /* Destroy the start condition stack. */
        quickstep_yyfree(yyg->yy_start_stack ,yyscanner );
        yyg->yy_start_stack = NULL;

    /* Reset the globals. This is important in a non-reentrant scanner so the next time
     * quickstep_yylex() is called, initialization will occur. */
    yy_init_globals( yyscanner);

    /* Destroy the main struct (reentrant only). */
    quickstep_yyfree ( yyscanner , yyscanner );
    yyscanner = NULL;
    return 0;
}

/*
 * Internal utility routines.
 */

#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
{
	int i;
	for ( i = 0; i < n; ++i )
		s1[i] = s2[i];
}
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
{
	int n;
	for ( n = 0; s[n]; ++n )
		;

	return n;
}
#endif

void *quickstep_yyalloc (yy_size_t  size , yyscan_t yyscanner)
{
	return (void *) malloc( size );
}

void *quickstep_yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
{
	/* The cast to (char *) in the following accommodates both
	 * implementations that use char* generic pointers, and those
	 * that use void* generic pointers.  It works with the latter
	 * because both ANSI C and C++ allow castless assignment from
	 * any pointer type to void*, and deal with argument conversions
	 * as though doing an assignment.
	 */
	return (void *) realloc( (char *) ptr, size );
}

void quickstep_yyfree (void * ptr , yyscan_t yyscanner)
{
	free( (char *) ptr );	/* see quickstep_yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

#line 431 "../SqlLexer.lpp"



