#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 6
#define YY_FLEX_SUBMINOR_VERSION 0
#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
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
 * Ditto for the __ia64__ case accordingly.
 */
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#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) (/*CONSTCOND*/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 );
#if defined(__GNUC__) && __GNUC__ >= 3
__attribute__((__noreturn__))
#endif
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 163
#define YY_END_OF_BUFFER 164
/* 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[599] =
    {   0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  164,    2,    2,  162,  162,  161,  160,  162,
      139,  135,  138,  135,  135,  158,  131,  128,  132,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  136,    4,    5,    5,    3,  154,
      154,  151,  155,  155,  149,  156,  156,  153,    1,  161,
      129,  159,  158,  158,  158,    0,  133,  130,  134,  157,
      157,  157,  157,   10,  157,  157,  157,   22,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,  137,

      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,   60,   69,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,   83,   84,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,    4,    5,    3,  154,  150,  155,  148,
      148,  140,  142,  143,  144,  145,  146,  147,  148,  156,
      152,  159,  158,    0,  158,    6,    7,  157,    9,   11,
      157,  157,   15,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,   33,  157,  157,  157,  157,  157,

      157,  157,  157,   44,  157,  157,  157,  157,  157,  157,
      157,   52,  157,  157,  157,  157,  157,  157,  157,  157,
      157,   64,  157,   71,  157,  157,  157,  157,  157,  157,
      157,   79,  157,   82,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  100,  157,  157,
      105,  106,  157,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  140,  142,
      141,  157,  157,  157,  157,  157,  157,  157,   20,   23,
      157,  157,  157,   28,  157,  157,  157,   31,  157,  157,
      157,  157,   38,  157,  157,   42,   43,  157,  157,  157,

      157,  157,  157,  157,  157,   54,   55,  157,   57,  157,
       59,  157,  157,  157,  157,   68,   70,   72,   73,   74,
      157,   76,  157,  157,   80,  157,  157,   87,  157,  157,
      157,  157,  157,   94,  157,   96,  157,  157,  157,  102,
      157,  157,  157,  157,  157,  157,  110,  111,  113,  157,
      157,  157,  157,  157,  157,  157,  157,  122,  157,  157,
      125,  126,  140,  141,    8,  157,  157,  157,  157,  157,
      157,  157,   25,  157,  157,  157,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,   48,
       49,   50,  157,  157,   56,  157,   61,   62,  157,  157,

      157,   75,  157,   78,   81,   85,   86,  157,  157,  157,
      157,  157,   95,  157,  157,   99,  157,  157,  157,  157,
      157,  109,  157,  157,  157,  116,  157,  157,  119,  157,
      157,  123,  157,  157,  157,  157,   14,  157,  157,  157,
      157,  157,   26,  157,   29,  157,  157,  157,  157,  157,
       36,  157,  157,  157,   41,  157,   46,  157,  157,  157,
       58,   63,  157,  157,  157,   77,  157,  157,  157,  157,
      157,  157,   98,  157,  103,  104,  157,  157,  157,  157,
      157,  117,  118,  120,  157,  124,  157,  157,   13,  157,
      157,  157,  157,  157,  157,   21,   30,  157,   34,   35,

      157,  157,  157,  157,   47,  157,   53,   65,  157,  157,
      157,   90,  157,   92,  157,  157,  157,  157,  157,  157,
      157,  157,  121,  157,  157,  157,  157,  157,  157,  157,
      157,   32,  157,  157,   40,  157,  157,  157,   67,  157,
      157,   93,  157,  157,  107,  157,  157,  157,  157,  157,
       12,  157,  157,  157,  157,   24,  157,   37,  157,  157,
       51,   66,   88,   91,  157,  157,  108,  112,  157,  115,
      127,   16,  157,  157,  157,   27,   39,  157,   89,   97,
      157,  157,  157,   18,   19,  157,  157,  114,  157,  157,
      157,  157,  157,  101,  157,   45,   17,    0

    } ;

static yyconst YY_CHAR 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 YY_CHAR 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_uint16_t yy_base[614] =
    {   0,
        0,    1,   46,    0,  117,  163,    2,    3,  128,  132,
        6,   10,  211, 1319, 1319,    0, 1319,   13, 1319,  194,
     1319, 1319, 1319,  194,    6,  130,    4, 1319,  170,  124,
      161,  215,  170,  207,  265,   92,  167,  162,   96,  107,
      223,  165,  162,  221,  274,   92,  284,  277,  315,  206,
      128,  232,    0,  125, 1319,  152,    4,   19,    0,    0,
        0,  143,    0,    0,  379,    0,    0,  144,    0,   22,
     1319,    0,  292,  305,  335,   18, 1319, 1319, 1319,    0,
      174,  264,  180,  186,  209,  271,  229,    0,  277,  333,
      335,  312,  330,  317,  323,  338,  323,  333,  340, 1319,

      339,  355,  357,  381,  370,  373,  377,  382,  380,  384,
      383,  383,  383,  431,    0,  398,  383,  390,  406,  402,
      403,  404,  425,  420,  431,  442,    0,  445,  432,  448,
      436,  437,  451,  448,  444,  460,  452,  439,  489,  464,
      468,  469,  468,  462,  455,  477,  501,  493,  489,  494,
      502,  494,  510,  142,   29,    0,    0, 1319,    0, 1319,
     1319,   22,   24, 1319, 1319, 1319, 1319, 1319,    0,    0,
     1319,    0,  520,   26,   28,    0,    0,  508,    0,  512,
      495,  510,  497,  530,  518,  506,  525,  508,  512,  509,
      543,  530,  533,  550,    0,  547,  558,  556,  561,  546,

      565,  552,  564,    0,  569,  552,  554,  556,  557,  576,
      566,  576,  569,  571,  565,  579,  580,  573,  587,  597,
      598,  604,  594,    0,  593,  594,  612,  613,  616,  603,
      605,    0,  614,    0,  622,  623,  611,  610,  630,  631,
      626,  615,  629,  628,  639,  640,  639,  631,  634,  656,
        0,  654,  648,  659,  658,  670,  672,  668,  666,  667,
      682,  671,  665,  684,  674,  685,  683,  675,   30,  125,
        0,  676,  683,  693,  685,  697,  692,  692,    0,  706,
      697,  706,  704,    0,  705,  711,  725,  713,  722,  717,
      719,  727,  736,  733,  731,    0,    0,  728,  725,  745,

      742,  729,  730,  736,  743,    0,    0,  739,    0,  742,
        0,  733,  742,  743,  759,    0,    0,    0,    0,    0,
      743,    0,  745,  774,  764,  769,  770,    0,  782,  788,
      791,  796,  780,    0,  794,    0,  782,  777,  782,    0,
      799,  790,  802,  795,  788,  804,    0,  791,    0,  808,
      793,  801,  797,  799,  814,  818,  816,    0,  830,  825,
        0,  828,  136, 1319,    0,  841,  841,  829,  850,  838,
      849,  853,    0,  844,  841,  855,  856,  848,  854,  864,
      854,  862,  859,  857,  858,  868,  871,  858,  876,    0,
        0,    0,  858,  875,    0,  886,    0,    0,  878,  894,

      885,    0,  898,    0,    0,    0,    0,  889,  898,  909,
      896,  906,    0,  911,  901,    0,  913,  915,  900,  912,
      905,    0,  904,  906,  912,    0,  924,  925,    0,  912,
      933,    0,  912,  922,  930,  926,    0,  929,  938,  956,
      952,  942,    0,  964,    0,  962,  950,  958,  960,  953,
        0,  954,  971,  973,    0,   93,    0,  957,  969,  965,
        0,    0,  963,  977,  982,    0,  975,  967,  979,  964,
      972,  979,    0,  983,    0,    0,  983,  989, 1008, 1013,
     1011,    0,    0,    0, 1001,    0, 1006, 1009,    0, 1016,
     1013, 1016, 1018, 1026, 1023,    0,    0, 1028,    0,    0,

     1029, 1026, 1016, 1018,    0, 1025,    0,    0, 1037, 1029,
     1027,    0, 1031,    0, 1021, 1044, 1041, 1031, 1039, 1042,
     1043, 1062,    0, 1052, 1066, 1063, 1062, 1065, 1063, 1068,
     1073,    0, 1070, 1075,    0, 1070, 1084, 1072,    0, 1079,
     1087,    0, 1090, 1084,    0, 1091, 1083, 1084, 1099, 1096,
        0, 1098, 1103, 1097, 1106,    0, 1093,    0, 1107, 1107,
        0,    0, 1111,    0, 1112, 1126,    0,    0, 1124,    0,
        0,    0, 1121, 1136, 1126,    0,    0, 1136,    0,    0,
     1126, 1142, 1128,    0,    0, 1135, 1145,    0, 1142, 1145,
     1135, 1150, 1137,    0, 1138,    0,    0, 1319, 1203, 1213,

     1223, 1233, 1243, 1247, 1250, 1256, 1264, 1274, 1284, 1294,
     1304, 1309, 1311
    } ;

static yyconst flex_int16_t yy_def[614] =
    {   0,
      599,  599,  598,    3,  600,  600,  601,  601,  602,  602,
      603,  603,  598,  598,  598,  604,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  598,  598,  598,  598,  606,  607,
      607,  598,  608,  608,  609,  610,  610,  598,  604,  598,
      598,  611,  598,  598,  598,  598,  598,  598,  598,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  598,

      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  598,  598,  606,  607,  598,  608,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  612,  610,
      598,  611,  598,  598,  598,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,

      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  598,  598,
      613,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,

      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  598,  598,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,

      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,

      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
      605,  605,  605,  605,  605,  605,  605,    0,  598,  598,

      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598
    } ;

static yyconst flex_uint16_t yy_nxt[1391] =
    {   0,
      598,  598,   15,   15,   61,   61,  155,  155,   67,   62,
       62,   68,   67,  598,   70,   68,   70,   73,   73,   77,
       78,  155,  155,   70,  598,   70,  174,  174,  598,  175,
      175,  155,  155,  269,  270,  270,  270,  175,  175,  175,
      175,  363,  270,  598,   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,   53,   54,   53,   55,
       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,   53,   54,   17,   56,   57,
       58,   17,   17,   17,   17,   17,  111,  116,  117,  134,
       64,   17,   17,   17,   64,   62,  270,  270,  504,   62,
       74,   75,   75,  154,   81,  150,  153,  270,  270,  171,
      158,   76,   82,  154,   83,  111,  116,  117,  134,   84,
       17,   17,   17,   17,   56,   57,   58,   17,   17,   17,
       17,   17,   65,   81,  150,  153,   65,   17,   17,   17,
       76,   82,   85,   83,  112,   79,   86,   95,   84,   87,
      122,   96,  114,  124,  176,   97,  123,  115,  113,  125,

      179,   98,   88,   72,   99,  180,   17,   17,   17,   71,
      598,   85,  598,  112,  100,   86,   95,  598,   87,  122,
       96,  114,  124,  176,   97,  123,  115,  113,  125,  179,
       98,   88,   89,   99,  180,  101,  147,  102,  148,   90,
      118,  149,  103,  126,  119,  181,   91,  104,  120,   92,
       93,  127,   94,  598,  121,  128,  151,  152,  129,  130,
      184,   89,  598,  598,  101,  147,  102,  148,   90,  118,
      149,  103,  126,  119,  181,   91,  104,  120,   92,   93,
      127,   94,  105,  121,  128,  151,  152,  129,  130,  184,
      106,  131,  177,  107,  182,  132,  108,  598,  139,  109,

      178,  135,  110,   73,   73,  136,  140,  183,  133,  137,
      598,  105,  185,   76,  141,  138,  173,  173,  598,  106,
      131,  177,  107,  182,  132,  108,   76,  139,  109,  178,
      135,  110,  142,  191,  136,  140,  183,  133,  137,  143,
      144,  185,   76,  141,  138,   74,   75,   75,  192,  145,
      186,  193,  146,  598,  187,   76,   76,  196,  200,  194,
      197,  142,  191,  188,  195,  189,  198,  190,  143,  144,
      201,  202,  598,  199,  203,  204,  205,  192,  145,  186,
      193,  146,  161,  187,  598,   76,  196,  200,  194,  197,
      162,  163,  188,  195,  189,  198,  190,  164,  208,  201,

      202,  165,  199,  203,  204,  205,  206,  209,  210,  166,
      211,  213,  214,  167,  215,  168,  212,  207,  216,  169,
      218,  217,  598,  223,  224,  225,  164,  208,  226,  227,
      165,  228,  598,  229,  230,  206,  209,  210,  166,  211,
      213,  214,  167,  215,  168,  212,  207,  216,  169,  218,
      217,  219,  223,  224,  225,  231,  232,  226,  227,  233,
      228,  220,  229,  230,  234,  235,  221,  222,  236,  237,
      238,  239,  240,  242,  243,  247,  241,  244,  248,  598,
      219,  252,  245,  246,  231,  232,  253,  254,  233,  255,
      220,  256,  257,  234,  235,  221,  222,  236,  237,  238,

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

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

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

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

      441,  442,  440,  443,  444,  445,  446,  447,  448,  461,
      449,  450,  451,  452,  462,  463,  453,  454,  455,  466,
      464,  456,  457,  465,  458,  467,  459,  460,  468,  469,
      470,  471,  472,  473,  474,  475,  476,  477,  461,  478,
      479,  480,  481,  462,  463,  482,  483,  484,  466,  464,
      485,  486,  465,  487,  467,  488,  489,  468,  469,  470,
      471,  472,  473,  474,  475,  476,  477,  490,  478,  479,
      480,  481,  491,  492,  482,  483,  484,  493,  494,  485,
      486,  495,  487,  496,  488,  489,  497,  498,  499,  500,
      501,  502,  503,  505,  506,  507,  490,  508,  509,  510,

      511,  491,  492,  512,  513,  514,  493,  494,  515,  516,
      495,  517,  496,  518,  519,  497,  498,  499,  500,  501,
      502,  503,  505,  506,  507,  520,  508,  509,  510,  511,
      521,  522,  512,  513,  514,  523,  524,  515,  516,  525,
      517,  526,  518,  519,  527,  528,  529,  530,  531,  532,
      533,  534,  535,  536,  520,  537,  538,  539,  540,  521,
      522,  541,  542,  543,  523,  524,  544,  545,  525,  546,
      526,  547,  548,  527,  528,  529,  530,  531,  532,  533,
      534,  535,  536,  549,  537,  538,  539,  540,  550,  551,
      541,  542,  543,  552,  553,  544,  545,  554,  546,  555,

      547,  548,  556,  557,  558,  559,  560,  561,  562,  563,
      564,  565,  549,  566,  567,  568,  569,  550,  551,  570,
      571,  572,  552,  553,  573,  574,  554,  575,  555,  576,
      577,  556,  557,  558,  559,  560,  561,  562,  563,  564,
      565,  578,  566,  567,  568,  569,  579,  580,  570,  571,
      572,  581,  582,  573,  574,  583,  575,  584,  576,  577,
      585,  586,  587,  588,  589,  590,  591,  592,  593,  594,
      578,  595,  596,  597,  598,  579,  580,  598,  598,  598,
      581,  582,  598,  598,  583,  598,  584,  598,  598,  585,
      586,  587,  588,  589,  590,  591,  592,  593,  594,  598,

      595,  596,  597,   14,   14,   14,   14,   14,   14,   14,
       14,   14,   14,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   60,   60,   60,   60,   60,   60,   60,
       60,   60,   60,   63,   63,   63,   63,   63,   63,   63,
       63,   63,   63,   66,   66,   66,   66,   66,   66,   66,
       66,   66,   66,   69,   69,   80,   80,   80,  598,   80,
      156,  156,  156,  156,  157,  157,  157,  598,  157,  157,
      157,  157,  157,  157,  159,  159,  159,  598,  159,  159,
      159,  159,  598,  159,  160,  160,  160,  160,  160,  160,
      160,  160,  160,  160,  170,  170,  598,  170,  170,  170,

      170,  170,  170,  170,  172,  598,  172,  172,  172,  172,
      172,  172,  172,  172,  271,  271,  364,  364,   13,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598
    } ;

static yyconst flex_int16_t yy_chk[1391] =
    {   0,
        0,    0,    1,    2,    7,    8,   57,   57,   11,    7,
        8,   11,   12,    0,   18,   12,   18,   25,   25,   27,
       27,   58,   58,   70,    0,   70,   76,   76,    0,   76,
       76,  155,  155,  162,  162,  163,  163,  174,  174,  175,
      175,  269,  269,    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,   39,   40,   46,
        9,    5,    5,    5,   10,    9,  270,  270,  456,   10,
       26,   26,   26,  154,   30,   51,   54,  363,  363,   68,
       62,   26,   30,   56,   30,   36,   39,   40,   46,   30,
        5,    5,    5,    6,    6,    6,    6,    6,    6,    6,
        6,    6,    9,   30,   51,   54,   10,    6,    6,    6,
       26,   30,   31,   30,   37,   29,   31,   33,   30,   31,
       42,   33,   38,   43,   81,   33,   42,   38,   37,   43,

       83,   33,   31,   24,   33,   84,    6,    6,    6,   20,
       13,   31,    0,   37,   34,   31,   33,    0,   31,   42,
       33,   38,   43,   81,   33,   42,   38,   37,   43,   83,
       33,   31,   32,   33,   84,   34,   50,   34,   50,   32,
       41,   50,   34,   44,   41,   85,   32,   34,   41,   32,
       32,   44,   32,    0,   41,   44,   52,   52,   44,   44,
       87,   32,    0,    0,   34,   50,   34,   50,   32,   41,
       50,   34,   44,   41,   85,   32,   34,   41,   32,   32,
       44,   32,   35,   41,   44,   52,   52,   44,   44,   87,
       35,   45,   82,   35,   86,   45,   35,    0,   48,   35,

       82,   47,   35,   73,   73,   47,   48,   86,   45,   47,
        0,   35,   89,   73,   48,   47,   74,   74,    0,   35,
       45,   82,   35,   86,   45,   35,   74,   48,   35,   82,
       47,   35,   49,   92,   47,   48,   86,   45,   47,   49,
       49,   89,   73,   48,   47,   75,   75,   75,   93,   49,
       90,   94,   49,    0,   90,   74,   75,   96,   97,   95,
       96,   49,   92,   91,   95,   91,   96,   91,   49,   49,
       98,   99,    0,   96,  101,  102,  103,   93,   49,   90,
       94,   49,   65,   90,    0,   75,   96,   97,   95,   96,
       65,   65,   91,   95,   91,   96,   91,   65,  105,   98,

       99,   65,   96,  101,  102,  103,  104,  106,  107,   65,
      108,  109,  110,   65,  111,   65,  108,  104,  112,   65,
      113,  112,    0,  116,  117,  118,   65,  105,  119,  120,
       65,  120,    0,  121,  122,  104,  106,  107,   65,  108,
      109,  110,   65,  111,   65,  108,  104,  112,   65,  113,
      112,  114,  116,  117,  118,  123,  124,  119,  120,  125,
      120,  114,  121,  122,  126,  128,  114,  114,  129,  130,
      131,  132,  133,  134,  135,  137,  133,  136,  138,    0,
      114,  140,  136,  136,  123,  124,  141,  142,  125,  143,
      114,  144,  145,  126,  128,  114,  114,  129,  130,  131,

      132,  133,  134,  135,  137,  133,  136,  138,  139,  146,
      140,  136,  136,  148,  149,  141,  142,  139,  143,  147,
      144,  145,  150,  151,  152,  139,  147,  153,  150,  178,
      152,  173,  173,  180,  181,  182,  183,  139,  146,  185,
      186,  173,  148,  149,  187,  188,  139,  189,  147,  184,
      190,  150,  151,  152,  139,  147,  153,  150,  178,  152,
      191,  184,  180,  181,  182,  183,  192,  193,  185,  186,
      173,  194,  196,  187,  188,  197,  189,  198,  184,  190,
      199,  198,  200,  201,  202,  203,  205,  206,  207,  191,
      184,  208,  209,  210,  211,  192,  193,  212,  213,  214,

      194,  196,  215,  216,  197,  217,  198,  218,  219,  199,
      198,  200,  201,  202,  203,  205,  206,  207,  220,  221,
      208,  209,  210,  211,  223,  222,  212,  213,  214,  225,
      226,  215,  216,  227,  217,  222,  218,  219,  228,  229,
      230,  231,  233,  235,  236,  237,  238,  220,  221,  239,
      240,  242,  243,  223,  222,  241,  244,  241,  225,  226,
      245,  246,  227,  247,  222,  249,  248,  228,  229,  230,
      231,  233,  235,  236,  237,  238,  248,  250,  239,  240,
      242,  243,  252,  253,  241,  244,  241,  254,  255,  245,
      246,  256,  247,  257,  249,  248,  258,  259,  260,  261,

      260,  262,  263,  264,  265,  266,  250,  267,  265,  268,
      272,  252,  253,  273,  274,  275,  254,  255,  276,  277,
      256,  278,  257,  280,  281,  258,  259,  260,  261,  260,
      262,  263,  264,  265,  266,  282,  267,  265,  268,  272,
      283,  285,  273,  274,  275,  286,  287,  276,  277,  288,
      278,  289,  280,  281,  290,  291,  292,  293,  294,  295,
      298,  299,  300,  301,  282,  302,  303,  304,  305,  283,
      285,  308,  310,  312,  286,  287,  313,  314,  288,  321,
      289,  323,  315,  290,  291,  292,  293,  294,  295,  298,
      299,  300,  301,  315,  302,  303,  304,  305,  324,  325,

      308,  310,  312,  326,  327,  313,  314,  329,  321,  330,
      323,  315,  331,  332,  333,  335,  337,  338,  339,  341,
      342,  343,  315,  344,  345,  346,  348,  324,  325,  350,
      351,  352,  326,  327,  353,  354,  329,  355,  330,  356,
      357,  331,  332,  333,  335,  337,  338,  339,  341,  342,
      343,  359,  344,  345,  346,  348,  360,  362,  350,  351,
      352,  366,  367,  353,  354,  368,  355,  369,  356,  357,
      370,  371,  372,  370,  374,  375,  376,  377,  378,  379,
      359,  380,  381,  382,  383,  360,  362,  384,  385,  386,
      366,  367,  387,  388,  368,  389,  369,  393,  394,  370,

      371,  372,  370,  374,  375,  376,  377,  378,  379,  396,
      380,  381,  382,  383,  399,  400,  384,  385,  386,  403,
      401,  387,  388,  401,  389,  408,  393,  394,  409,  410,
      411,  412,  414,  415,  417,  418,  419,  420,  396,  421,
      423,  424,  425,  399,  400,  427,  428,  430,  403,  401,
      431,  433,  401,  434,  408,  435,  436,  409,  410,  411,
      412,  414,  415,  417,  418,  419,  420,  438,  421,  423,
      424,  425,  439,  440,  427,  428,  430,  441,  442,  431,
      433,  444,  434,  446,  435,  436,  447,  448,  449,  450,
      452,  453,  454,  458,  459,  460,  438,  463,  464,  465,

      467,  439,  440,  468,  469,  470,  441,  442,  471,  472,
      444,  474,  446,  477,  478,  447,  448,  449,  450,  452,
      453,  454,  458,  459,  460,  479,  463,  464,  465,  467,
      480,  481,  468,  469,  470,  485,  487,  471,  472,  488,
      474,  490,  477,  478,  491,  492,  493,  494,  495,  498,
      501,  502,  503,  504,  479,  506,  509,  510,  511,  480,
      481,  513,  515,  516,  485,  487,  517,  518,  488,  519,
      490,  520,  521,  491,  492,  493,  494,  495,  498,  501,
      502,  503,  504,  522,  506,  509,  510,  511,  524,  525,
      513,  515,  516,  526,  527,  517,  518,  528,  519,  529,

      520,  521,  530,  531,  533,  534,  536,  537,  538,  540,
      541,  543,  522,  544,  546,  547,  548,  524,  525,  549,
      550,  552,  526,  527,  553,  554,  528,  555,  529,  557,
      559,  530,  531,  533,  534,  536,  537,  538,  540,  541,
      543,  560,  544,  546,  547,  548,  563,  565,  549,  550,
      552,  566,  569,  553,  554,  573,  555,  574,  557,  559,
      575,  578,  581,  582,  583,  586,  587,  589,  590,  591,
      560,  592,  593,  595,    0,  563,  565,    0,    0,    0,
      566,  569,    0,    0,  573,    0,  574,    0,    0,  575,
      578,  581,  582,  583,  586,  587,  589,  590,  591,    0,

      592,  593,  595,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  600,  600,  600,  600,  600,  600,  600,
      600,  600,  600,  601,  601,  601,  601,  601,  601,  601,
      601,  601,  601,  602,  602,  602,  602,  602,  602,  602,
      602,  602,  602,  603,  603,  603,  603,  603,  603,  603,
      603,  603,  603,  604,  604,  605,  605,  605,    0,  605,
      606,  606,  606,  606,  607,  607,  607,    0,  607,  607,
      607,  607,  607,  607,  608,  608,  608,    0,  608,  608,
      608,  608,    0,  608,  609,  609,  609,  609,  609,  609,
      609,  609,  609,  609,  610,  610,    0,  610,  610,  610,

      610,  610,  610,  610,  611,    0,  611,  611,  611,  611,
      611,  611,  611,  611,  612,  612,  613,  613,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
      598,  598,  598,  598,  598,  598,  598,  598,  598,  598
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[164] =
    {   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, 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"
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 29 "../SqlLexer.lpp"
#include <cstdio>
#include <string>
#include <vector>

#include "parser/ParseJoinedTableReference.hpp"
#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;
struct ParseFrameInfo;
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 ParsePriority;
class ParseSample;
class ParseScalarLiteral;
class ParseSearchedWhenClause;
class ParseSelect;
class ParseSelectionClause;
class ParseSelectionItem;
class ParseSelectionItemScalar;
class ParseSelectionList;
class ParseSetOperation;
class ParseSimpleTableReference;
class ParseSimpleWhenClause;
class ParseStringKeyLiteralValues;
class ParseStatement;
class ParseStatementCopyFrom;
class ParseStatementCreateTable;
class ParseStatementDelete;
class ParseStatementDropTable;
class ParseStatementInsert;
class ParseStatementInsertTuple;
class ParseStatementInsertSelection;
class ParseStatementSetOperation;
class ParseStatementQuit;
class ParseStatementUpdate;
class ParseSubqueryExpression;
class ParseSubqueryTableReference;
class ParseTableReference;
class ParseTableReferenceSignature;
class ParseWindow;
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 1096 "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 YY_NO_UNPUT
    
#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
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#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 /*LINTED*/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 132 "../SqlLexer.lpp"


#line 1387 "SqlLexer_gen.cpp"

	while ( /*CONSTCOND*/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 >= 599 )
					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 != 598 );
		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 135 "../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 143 "../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 152 "../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 159 "../SqlLexer.lpp"
{
    /* Ignore whitespace. */
  }
	YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
#line 163 "../SqlLexer.lpp"
{
    /* Newline reverts the lexer to the initial state. */
    yycolumn = 0;
    BEGIN(INITIAL);
    return '\n';
  }
	YY_BREAK


case 6:
YY_RULE_SETUP
#line 172 "../SqlLexer.lpp"
return TOKEN_ADD;
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 173 "../SqlLexer.lpp"
return TOKEN_ALL;
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 174 "../SqlLexer.lpp"
return TOKEN_ALTER;
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 175 "../SqlLexer.lpp"
return TOKEN_AND;
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 176 "../SqlLexer.lpp"
return TOKEN_AS;
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 177 "../SqlLexer.lpp"
return TOKEN_ASC;
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 178 "../SqlLexer.lpp"
return TOKEN_ASC;
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 179 "../SqlLexer.lpp"
return TOKEN_BETWEEN;
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 180 "../SqlLexer.lpp"
return TOKEN_BIGINT;
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 181 "../SqlLexer.lpp"
return TOKEN_BIT;
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 182 "../SqlLexer.lpp"
return TOKEN_BITWEAVING;
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 183 "../SqlLexer.lpp"
return TOKEN_BLOCKPROPERTIES;
	YY_BREAK
case 18:
YY_RULE_SETUP
#line 184 "../SqlLexer.lpp"
return TOKEN_BLOCKSAMPLE;
	YY_BREAK
case 19:
YY_RULE_SETUP
#line 185 "../SqlLexer.lpp"
return TOKEN_BLOOM_FILTER;
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 186 "../SqlLexer.lpp"
return TOKEN_CASE;
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 187 "../SqlLexer.lpp"
return TOKEN_CSB_TREE;
	YY_BREAK
case 22:
YY_RULE_SETUP
#line 188 "../SqlLexer.lpp"
return TOKEN_BY;
	YY_BREAK
case 23:
YY_RULE_SETUP
#line 189 "../SqlLexer.lpp"
return TOKEN_CHARACTER;
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 190 "../SqlLexer.lpp"
return TOKEN_CHARACTER;
	YY_BREAK
case 25:
YY_RULE_SETUP
#line 191 "../SqlLexer.lpp"
return TOKEN_CHECK;
	YY_BREAK
case 26:
YY_RULE_SETUP
#line 192 "../SqlLexer.lpp"
return TOKEN_COLUMN;
	YY_BREAK
case 27:
YY_RULE_SETUP
#line 193 "../SqlLexer.lpp"
return TOKEN_CONSTRAINT;
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 194 "../SqlLexer.lpp"
return TOKEN_COPY;
	YY_BREAK
case 29:
YY_RULE_SETUP
#line 195 "../SqlLexer.lpp"
return TOKEN_CREATE;
	YY_BREAK
case 30:
YY_RULE_SETUP
#line 196 "../SqlLexer.lpp"
return TOKEN_CURRENT;
	YY_BREAK
case 31:
YY_RULE_SETUP
#line 197 "../SqlLexer.lpp"
return TOKEN_DATE;
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 198 "../SqlLexer.lpp"
return TOKEN_DATETIME;
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 199 "../SqlLexer.lpp"
return TOKEN_DAY;
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 200 "../SqlLexer.lpp"
return TOKEN_DECIMAL;
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 201 "../SqlLexer.lpp"
return TOKEN_DEFAULT;
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 202 "../SqlLexer.lpp"
return TOKEN_DELETE;
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 203 "../SqlLexer.lpp"
return TOKEN_DELIMITER;
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 204 "../SqlLexer.lpp"
return TOKEN_DESC;
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 205 "../SqlLexer.lpp"
return TOKEN_DESC;
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 206 "../SqlLexer.lpp"
return TOKEN_DISTINCT;
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 207 "../SqlLexer.lpp"
return TOKEN_DOUBLE;
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 208 "../SqlLexer.lpp"
return TOKEN_DROP;
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 209 "../SqlLexer.lpp"
return TOKEN_ELSE;
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 210 "../SqlLexer.lpp"
return TOKEN_END;
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 211 "../SqlLexer.lpp"
return TOKEN_ESCAPE_STRINGS;
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 212 "../SqlLexer.lpp"
return TOKEN_EXISTS;
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 213 "../SqlLexer.lpp"
return TOKEN_EXTRACT;
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 214 "../SqlLexer.lpp"
return TOKEN_FALSE;
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 215 "../SqlLexer.lpp"
return TOKEN_FIRST;
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 216 "../SqlLexer.lpp"
return TOKEN_FLOAT;
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 217 "../SqlLexer.lpp"
return TOKEN_FOLLOWING;
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 218 "../SqlLexer.lpp"
return TOKEN_FOR;
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 219 "../SqlLexer.lpp"
return TOKEN_FOREIGN;
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 220 "../SqlLexer.lpp"
return TOKEN_FROM;
	YY_BREAK
case 55:
YY_RULE_SETUP
#line 221 "../SqlLexer.lpp"
return TOKEN_FULL;
	YY_BREAK
case 56:
YY_RULE_SETUP
#line 222 "../SqlLexer.lpp"
return TOKEN_GROUP;
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 223 "../SqlLexer.lpp"
return TOKEN_HASH;
	YY_BREAK
case 58:
YY_RULE_SETUP
#line 224 "../SqlLexer.lpp"
return TOKEN_HAVING;
	YY_BREAK
case 59:
YY_RULE_SETUP
#line 225 "../SqlLexer.lpp"
return TOKEN_HOUR;
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 226 "../SqlLexer.lpp"
return TOKEN_IN;
	YY_BREAK
case 61:
YY_RULE_SETUP
#line 227 "../SqlLexer.lpp"
return TOKEN_INDEX;
	YY_BREAK
case 62:
YY_RULE_SETUP
#line 228 "../SqlLexer.lpp"
return TOKEN_INNER;
	YY_BREAK
case 63:
YY_RULE_SETUP
#line 229 "../SqlLexer.lpp"
return TOKEN_INSERT;
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 230 "../SqlLexer.lpp"
return TOKEN_INTEGER;
	YY_BREAK
case 65:
YY_RULE_SETUP
#line 231 "../SqlLexer.lpp"
return TOKEN_INTEGER;
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 232 "../SqlLexer.lpp"
return TOKEN_INTERSECT;
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 233 "../SqlLexer.lpp"
return TOKEN_INTERVAL;
	YY_BREAK
case 68:
YY_RULE_SETUP
#line 234 "../SqlLexer.lpp"
return TOKEN_INTO;
	YY_BREAK
case 69:
YY_RULE_SETUP
#line 235 "../SqlLexer.lpp"
return TOKEN_IS;
	YY_BREAK
case 70:
YY_RULE_SETUP
#line 236 "../SqlLexer.lpp"
return TOKEN_JOIN;
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 237 "../SqlLexer.lpp"
return TOKEN_KEY;
	YY_BREAK
case 72:
YY_RULE_SETUP
#line 238 "../SqlLexer.lpp"
return TOKEN_LAST;
	YY_BREAK
case 73:
YY_RULE_SETUP
#line 239 "../SqlLexer.lpp"
return TOKEN_LEFT;
	YY_BREAK
case 74:
YY_RULE_SETUP
#line 240 "../SqlLexer.lpp"
return TOKEN_LIKE;
	YY_BREAK
case 75:
YY_RULE_SETUP
#line 241 "../SqlLexer.lpp"
return TOKEN_LIMIT;
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 242 "../SqlLexer.lpp"
return TOKEN_LONG;
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 243 "../SqlLexer.lpp"
return TOKEN_MINUTE;
	YY_BREAK
case 78:
YY_RULE_SETUP
#line 244 "../SqlLexer.lpp"
return TOKEN_MONTH;
	YY_BREAK
case 79:
YY_RULE_SETUP
#line 245 "../SqlLexer.lpp"
return TOKEN_NOT;
	YY_BREAK
case 80:
YY_RULE_SETUP
#line 246 "../SqlLexer.lpp"
return TOKEN_NULL;
	YY_BREAK
case 81:
YY_RULE_SETUP
#line 247 "../SqlLexer.lpp"
return TOKEN_NULLS;
	YY_BREAK
case 82:
YY_RULE_SETUP
#line 248 "../SqlLexer.lpp"
return TOKEN_OFF;
	YY_BREAK
case 83:
YY_RULE_SETUP
#line 249 "../SqlLexer.lpp"
return TOKEN_ON;
	YY_BREAK
case 84:
YY_RULE_SETUP
#line 250 "../SqlLexer.lpp"
return TOKEN_OR;
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 251 "../SqlLexer.lpp"
return TOKEN_ORDER;
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 252 "../SqlLexer.lpp"
return TOKEN_OUTER;
	YY_BREAK
case 87:
YY_RULE_SETUP
#line 253 "../SqlLexer.lpp"
return TOKEN_OVER;
	YY_BREAK
case 88:
YY_RULE_SETUP
#line 254 "../SqlLexer.lpp"
return TOKEN_PARTITION;
	YY_BREAK
case 89:
YY_RULE_SETUP
#line 255 "../SqlLexer.lpp"
return TOKEN_PARTITIONS;
	YY_BREAK
case 90:
YY_RULE_SETUP
#line 256 "../SqlLexer.lpp"
return TOKEN_PERCENT;
	YY_BREAK
case 91:
YY_RULE_SETUP
#line 257 "../SqlLexer.lpp"
return TOKEN_PRECEDING;
	YY_BREAK
case 92:
YY_RULE_SETUP
#line 258 "../SqlLexer.lpp"
return TOKEN_PRIMARY;
	YY_BREAK
case 93:
YY_RULE_SETUP
#line 259 "../SqlLexer.lpp"
return TOKEN_PRIORITY;
	YY_BREAK
case 94:
YY_RULE_SETUP
#line 260 "../SqlLexer.lpp"
return TOKEN_QUIT;
	YY_BREAK
case 95:
YY_RULE_SETUP
#line 261 "../SqlLexer.lpp"
return TOKEN_RANGE;
	YY_BREAK
case 96:
YY_RULE_SETUP
#line 262 "../SqlLexer.lpp"
return TOKEN_REAL;
	YY_BREAK
case 97:
YY_RULE_SETUP
#line 263 "../SqlLexer.lpp"
return TOKEN_REFERENCES;
	YY_BREAK
case 98:
YY_RULE_SETUP
#line 264 "../SqlLexer.lpp"
return TOKEN_REGEXP;
	YY_BREAK
case 99:
YY_RULE_SETUP
#line 265 "../SqlLexer.lpp"
return TOKEN_RIGHT;
	YY_BREAK
case 100:
YY_RULE_SETUP
#line 266 "../SqlLexer.lpp"
return TOKEN_ROW;
	YY_BREAK
case 101:
YY_RULE_SETUP
#line 267 "../SqlLexer.lpp"
return TOKEN_ROW_DELIMITER;
	YY_BREAK
case 102:
YY_RULE_SETUP
#line 268 "../SqlLexer.lpp"
return TOKEN_ROWS;
	YY_BREAK
case 103:
YY_RULE_SETUP
#line 269 "../SqlLexer.lpp"
return TOKEN_SECOND;
	YY_BREAK
case 104:
YY_RULE_SETUP
#line 270 "../SqlLexer.lpp"
return TOKEN_SELECT;
	YY_BREAK
case 105:
YY_RULE_SETUP
#line 271 "../SqlLexer.lpp"
return TOKEN_SET;
	YY_BREAK
case 106:
YY_RULE_SETUP
#line 272 "../SqlLexer.lpp"
return TOKEN_SMA;
	YY_BREAK
case 107:
YY_RULE_SETUP
#line 273 "../SqlLexer.lpp"
return TOKEN_SMALLINT;
	YY_BREAK
case 108:
YY_RULE_SETUP
#line 274 "../SqlLexer.lpp"
return TOKEN_SUBSTRING;
	YY_BREAK
case 109:
YY_RULE_SETUP
#line 275 "../SqlLexer.lpp"
return TOKEN_TABLE;
	YY_BREAK
case 110:
YY_RULE_SETUP
#line 276 "../SqlLexer.lpp"
return TOKEN_THEN;
	YY_BREAK
case 111:
YY_RULE_SETUP
#line 277 "../SqlLexer.lpp"
return TOKEN_TIME;
	YY_BREAK
case 112:
YY_RULE_SETUP
#line 278 "../SqlLexer.lpp"
return TOKEN_TIMESTAMP;
	YY_BREAK
case 113:
YY_RULE_SETUP
#line 279 "../SqlLexer.lpp"
return TOKEN_TRUE;
	YY_BREAK
case 114:
YY_RULE_SETUP
#line 280 "../SqlLexer.lpp"
return TOKEN_TUPLESAMPLE;
	YY_BREAK
case 115:
YY_RULE_SETUP
#line 281 "../SqlLexer.lpp"
return TOKEN_UNBOUNDED;
	YY_BREAK
case 116:
YY_RULE_SETUP
#line 282 "../SqlLexer.lpp"
return TOKEN_UNION;
	YY_BREAK
case 117:
YY_RULE_SETUP
#line 283 "../SqlLexer.lpp"
return TOKEN_UNIQUE;
	YY_BREAK
case 118:
YY_RULE_SETUP
#line 284 "../SqlLexer.lpp"
return TOKEN_UPDATE;
	YY_BREAK
case 119:
YY_RULE_SETUP
#line 285 "../SqlLexer.lpp"
return TOKEN_USING;
	YY_BREAK
case 120:
YY_RULE_SETUP
#line 286 "../SqlLexer.lpp"
return TOKEN_VALUES;
	YY_BREAK
case 121:
YY_RULE_SETUP
#line 287 "../SqlLexer.lpp"
return TOKEN_VARCHAR;
	YY_BREAK
case 122:
YY_RULE_SETUP
#line 288 "../SqlLexer.lpp"
return TOKEN_WHEN;
	YY_BREAK
case 123:
YY_RULE_SETUP
#line 289 "../SqlLexer.lpp"
return TOKEN_WHERE;
	YY_BREAK
case 124:
YY_RULE_SETUP
#line 290 "../SqlLexer.lpp"
return TOKEN_WINDOW;
	YY_BREAK
case 125:
YY_RULE_SETUP
#line 291 "../SqlLexer.lpp"
return TOKEN_WITH;
	YY_BREAK
case 126:
YY_RULE_SETUP
#line 292 "../SqlLexer.lpp"
return TOKEN_YEAR;
	YY_BREAK
case 127:
YY_RULE_SETUP
#line 293 "../SqlLexer.lpp"
return TOKEN_YEARMONTH;
	YY_BREAK
case 128:
YY_RULE_SETUP
#line 295 "../SqlLexer.lpp"
return TOKEN_EQ;
	YY_BREAK
case 129:
YY_RULE_SETUP
#line 296 "../SqlLexer.lpp"
return TOKEN_NEQ;
	YY_BREAK
case 130:
YY_RULE_SETUP
#line 297 "../SqlLexer.lpp"
return TOKEN_NEQ;
	YY_BREAK
case 131:
YY_RULE_SETUP
#line 298 "../SqlLexer.lpp"
return TOKEN_LT;
	YY_BREAK
case 132:
YY_RULE_SETUP
#line 299 "../SqlLexer.lpp"
return TOKEN_GT;
	YY_BREAK
case 133:
YY_RULE_SETUP
#line 300 "../SqlLexer.lpp"
return TOKEN_LEQ;
	YY_BREAK
case 134:
YY_RULE_SETUP
#line 301 "../SqlLexer.lpp"
return TOKEN_GEQ;
	YY_BREAK
case 135:
YY_RULE_SETUP
#line 303 "../SqlLexer.lpp"
return yytext[0];
	YY_BREAK
case 136:
YY_RULE_SETUP
#line 304 "../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 137:
YY_RULE_SETUP
#line 310 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_SINGLE_QUOTED_ESCAPED);
  }
	YY_BREAK
case 138:
YY_RULE_SETUP
#line 315 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_SINGLE_QUOTED);
  }
	YY_BREAK
case 139:
YY_RULE_SETUP
#line 320 "../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 329 "../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 140:
YY_RULE_SETUP
#line 339 "../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 141:
YY_RULE_SETUP
#line 351 "../SqlLexer.lpp"
{
    /* Hexadecimal code */
    unsigned int code;
    std::sscanf(yytext + 2, "%x", &code);
    yylval->string_value_->push_back(code);
  }
	YY_BREAK
case 142:
YY_RULE_SETUP
#line 357 "../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 143:
YY_RULE_SETUP
#line 364 "../SqlLexer.lpp"
{
    /* Backspace */
    yylval->string_value_->push_back('\b');
  }
	YY_BREAK
case 144:
YY_RULE_SETUP
#line 368 "../SqlLexer.lpp"
{
    /* Form-feed */
    yylval->string_value_->push_back('\f');
  }
	YY_BREAK
case 145:
YY_RULE_SETUP
#line 372 "../SqlLexer.lpp"
{
    /* Newline */
    yylval->string_value_->push_back('\n');
  }
	YY_BREAK
case 146:
YY_RULE_SETUP
#line 376 "../SqlLexer.lpp"
{
    /* Carriage-return */
    yylval->string_value_->push_back('\r');
  }
	YY_BREAK
case 147:
YY_RULE_SETUP
#line 380 "../SqlLexer.lpp"
{
    /* Horizontal Tab */
    yylval->string_value_->push_back('\t');
  }
	YY_BREAK
case 148:
/* rule 148 can match eol */
YY_RULE_SETUP
#line 384 "../SqlLexer.lpp"
{
    /* Any other character (including actual newline or carriage return) */
    yylval->string_value_->push_back(yytext[1]);
  }
	YY_BREAK
case 149:
YY_RULE_SETUP
#line 388 "../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 150:
YY_RULE_SETUP
#line 398 "../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 151:
YY_RULE_SETUP
#line 402 "../SqlLexer.lpp"
{
    /* End string */
    BEGIN(CONDITION_SQL);
    return TOKEN_STRING_SINGLE_QUOTED;
  }
	YY_BREAK


case 152:
YY_RULE_SETUP
#line 410 "../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 153:
YY_RULE_SETUP
#line 414 "../SqlLexer.lpp"
{
    /* End string */
    BEGIN(CONDITION_SQL);
    return TOKEN_STRING_DOUBLE_QUOTED;
  }
	YY_BREAK

case 154:
/* rule 154 can match eol */
YY_RULE_SETUP
#line 421 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 155:
/* rule 155 can match eol */
YY_RULE_SETUP
#line 426 "../SqlLexer.lpp"
{
  /* Scan up to a quote or escape sequence. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 156:
/* rule 156 can match eol */
YY_RULE_SETUP
#line 431 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK

case 157:
YY_RULE_SETUP
#line 437 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_NAME;
  }
	YY_BREAK
case 158:
YY_RULE_SETUP
#line 443 "../SqlLexer.lpp"
{
    yylval->numeric_literal_value_ = new quickstep::NumericParseLiteralValue(
        yylloc->first_line, yylloc->first_column, yytext);
    return TOKEN_UNSIGNED_NUMVAL;
  }
	YY_BREAK
case 159:
YY_RULE_SETUP
#line 449 "../SqlLexer.lpp"
/* comment */
	YY_BREAK
case 160:
/* rule 160 can match eol */
YY_RULE_SETUP
#line 451 "../SqlLexer.lpp"
{ yycolumn = 0; }
	YY_BREAK
case 161:
YY_RULE_SETUP
#line 453 "../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 457 "../SqlLexer.lpp"
{
  /* All conditions except for mutli-state string extracting conditions. */
  BEGIN(INITIAL);
  return TOKEN_EOF;
}
	YY_BREAK
case 162:
YY_RULE_SETUP
#line 463 "../SqlLexer.lpp"
{
  BEGIN(INITIAL);
  quickstep_yyerror(NULL, yyscanner, NULL, "illegal character");
  return TOKEN_LEX_ERROR;
}
	YY_BREAK
case 163:
YY_RULE_SETUP
#line 469 "../SqlLexer.lpp"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 2429 "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;
	yy_size_t 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 = (yy_size_t) (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 >= 599 )
				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 >= 599 )
			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 == 598);

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

#ifndef YY_NO_UNPUT

#endif

#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 = (yy_size_t)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; // After all that talk, this was set to 1 anyways...
		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. */
		yy_size_t 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)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	(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 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 _column_no column 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)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;

	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)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	return (void *) malloc( size );
}

void *quickstep_yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;

	/* 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)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	free( (char *) ptr );	/* see quickstep_yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

#line 469 "../SqlLexer.lpp"



