#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 161
#define YY_END_OF_BUFFER 162
/* 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[593] =
    {   0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  162,    2,    2,  160,  160,  159,  158,  160,
      137,  133,  136,  133,  133,  156,  129,  126,  130,  155,
      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  134,    4,    5,    5,    3,  152,
      152,  149,  153,  153,  147,  154,  154,  151,    1,  159,
      127,  157,  156,  156,  156,    0,  131,  128,  132,  155,
      155,  155,  155,   10,  155,  155,  155,   22,  155,  155,
      155,  155,  155,  155,  155,  155,  155,  155,  155,  135,

      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,   60,   68,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  155,  155,   82,   83,  155,  155,
      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,    4,    5,    3,  152,  148,  153,  146,
      146,  138,  140,  141,  142,  143,  144,  145,  146,  154,
      150,  157,  156,    0,  156,    6,    7,  155,    9,   11,
      155,  155,   15,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,   33,  155,  155,  155,  155,  155,

      155,  155,  155,   44,  155,  155,  155,  155,  155,  155,
      155,   52,  155,  155,  155,  155,  155,  155,  155,  155,
      155,   64,  155,   70,  155,  155,  155,  155,  155,  155,
      155,   78,  155,   81,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  155,  155,  155,   99,  155,  155,
      104,  105,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  155,  155,  155,  155,  138,  140,
      139,  155,  155,  155,  155,  155,  155,  155,   20,   23,
      155,  155,  155,   28,  155,  155,  155,   31,  155,  155,
      155,  155,   38,  155,  155,   42,   43,  155,  155,  155,

      155,  155,  155,  155,  155,   54,   55,  155,   57,  155,
       59,  155,  155,  155,  155,   67,   69,   71,   72,   73,
      155,   75,  155,  155,   79,  155,  155,   86,  155,  155,
      155,  155,  155,   93,  155,   95,  155,  155,  155,  101,
      155,  155,  155,  155,  155,  155,  109,  110,  112,  155,
      155,  155,  155,  155,  155,  155,  120,  155,  155,  123,
      124,  138,  139,    8,  155,  155,  155,  155,  155,  155,
      155,   25,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  155,  155,  155,  155,  155,   48,   49,
       50,  155,  155,   56,  155,   61,   62,  155,  155,  155,

       74,  155,   77,   80,   84,   85,  155,  155,  155,  155,
      155,   94,  155,  155,   98,  155,  155,  155,  155,  155,
      108,  155,  155,  155,  155,  155,  117,  155,  155,  121,
      155,  155,  155,  155,   14,  155,  155,  155,  155,  155,
       26,  155,   29,  155,  155,  155,  155,  155,   36,  155,
      155,  155,   41,  155,   46,  155,  155,  155,   58,   63,
      155,  155,   76,  155,  155,  155,  155,  155,  155,   97,
      155,  102,  103,  155,  155,  155,  155,  155,  115,  116,
      118,  155,  122,  155,  155,   13,  155,  155,  155,  155,
      155,  155,   21,   30,  155,   34,   35,  155,  155,  155,

      155,   47,  155,   53,   65,  155,  155,   89,  155,   91,
      155,  155,  155,  155,  155,  155,  155,  155,  119,  155,
      155,  155,  155,  155,  155,  155,  155,   32,  155,  155,
       40,  155,  155,   66,  155,  155,   92,  155,  155,  106,
      155,  155,  155,  155,  155,   12,  155,  155,  155,  155,
       24,  155,   37,  155,  155,   51,   87,   90,  155,  155,
      107,  111,  155,  114,  125,   16,  155,  155,  155,   27,
       39,  155,   88,   96,  155,  155,  155,   18,   19,  155,
      155,  113,  155,  155,  155,  155,  155,  100,  155,   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[608] =
    {   0,
        0,    1,   46,    0,  117,  163,    2,    3,  128,  132,
        6,   10,  211, 1312, 1312,    0, 1312,   13, 1312,  194,
     1312, 1312, 1312,  194,    6,  130,    4, 1312,  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, 1312,  152,    4,   19,    0,    0,
        0,  143,    0,    0,  379,    0,    0,  144,    0,   22,
     1312,    0,  292,  305,  335,   18, 1312, 1312, 1312,    0,
      174,  264,  180,  186,  209,  271,  229,    0,  277,  333,
      335,  312,  330,  317,  323,  338,  323,  333,  340, 1312,

      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, 1312,    0, 1312,
     1312,   22,   24, 1312, 1312, 1312, 1312, 1312,    0,    0,
     1312,    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,  665,
      682,  670,  664,  683,  673,  684,  681,  674,   30,  125,
        0,  675,  680,  692,  684,  694,  691,  690,    0,  704,
      696,  695,  699,    0,  704,  707,  724,  710,  720,  714,
      718,  726,  735,  732,  730,    0,    0,  727,  724,  744,

      741,  727,  729,  735,  742,    0,    0,  736,    0,  741,
        0,  732,  739,  742,  759,    0,    0,    0,    0,    0,
      741,    0,  743,  757,  763,  765,  769,    0,  779,  786,
      788,  795,  779,    0,  793,    0,  781,  776,  781,    0,
      798,  789,  801,  793,  787,  803,    0,  790,    0,  805,
      792,  793,  795,  811,  814,  813,    0,  818,  809,    0,
      822,  136, 1312,    0,  836,  836,  825,  845,  835,  843,
      852,    0,  842,  839,  853,  854,  846,  852,  861,  851,
      860,  857,  853,  854,  866,  867,  854,  873,    0,    0,
        0,  854,  872,    0,  874,    0,    0,  862,  888,  876,

        0,  894,    0,    0,    0,    0,  883,  890,  903,  891,
      903,    0,  908,  898,    0,  910,  912,  897,  909,  901,
        0,  900,  902,  909,  919,  920,    0,  907,  928,    0,
      907,  916,  925,  921,    0,  915,  921,  939,  942,  936,
        0,  956,    0,  956,  942,  952,  955,  950,    0,  951,
      968,  970,    0,   93,    0,  954,  966,  962,    0,    0,
      959,  977,    0,  970,  961,  973,  958,  964,  973,    0,
      976,    0,    0,  975,  983,  992,  994,  993,    0,    0,
        0,  980,    0,  995, 1000,    0, 1006, 1004, 1007, 1011,
     1020, 1019,    0,    0, 1024,    0,    0, 1025, 1022, 1012,

     1014,    0, 1020,    0,    0, 1023, 1021,    0, 1023,    0,
     1014, 1037, 1032, 1022, 1031, 1033, 1034, 1045,    0, 1031,
     1046, 1041, 1040, 1051, 1052, 1055, 1063,    0, 1060, 1067,
        0, 1063, 1079,    0, 1073, 1081,    0, 1084, 1077,    0,
     1084, 1076, 1077, 1090, 1087,    0, 1090, 1093, 1087, 1095,
        0, 1083,    0, 1097, 1087,    0, 1089,    0, 1090, 1102,
        0,    0, 1101,    0,    0,    0, 1096, 1120, 1112,    0,
        0, 1122,    0,    0, 1115, 1131, 1119,    0,    0, 1127,
     1139,    0, 1136, 1139, 1129, 1143, 1130,    0, 1131,    0,
        0, 1312, 1196, 1206, 1216, 1226, 1236, 1240, 1243, 1249,

     1257, 1267, 1277, 1287, 1297, 1302, 1304
    } ;

static yyconst flex_int16_t yy_def[608] =
    {   0,
      593,  593,  592,    3,  594,  594,  595,  595,  596,  596,
      597,  597,  592,  592,  592,  598,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  592,  592,  592,  592,  600,  601,
      601,  592,  602,  602,  603,  604,  604,  592,  598,  592,
      592,  605,  592,  592,  592,  592,  592,  592,  592,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  592,

      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  592,  592,  600,  601,  592,  602,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  606,  604,
      592,  605,  592,  592,  592,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,

      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  592,  592,
      607,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,

      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  592,  592,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,

      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,

      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,  599,  599,  599,  599,  599,  599,  599,  599,  599,
      599,    0,  592,  592,  592,  592,  592,  592,  592,  592,

      592,  592,  592,  592,  592,  592,  592
    } ;

static yyconst flex_uint16_t yy_nxt[1384] =
    {   0,
      592,  592,   15,   15,   61,   61,  155,  155,   67,   62,
       62,   68,   67,  592,   70,   68,   70,   73,   73,   77,
       78,  155,  155,   70,  592,   70,  174,  174,  592,  175,
      175,  155,  155,  269,  270,  270,  270,  175,  175,  175,
      175,  362,  270,  592,   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,  501,   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,
      592,   85,  592,  112,  100,   86,   95,  592,   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,  592,  121,  128,  151,  152,  129,  130,
      184,   89,  592,  592,  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,  592,  139,  109,

      178,  135,  110,   73,   73,  136,  140,  183,  133,  137,
      592,  105,  185,   76,  141,  138,  173,  173,  592,  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,  592,  187,   76,   76,  196,  200,  194,
      197,  142,  191,  188,  195,  189,  198,  190,  143,  144,
      201,  202,  592,  199,  203,  204,  205,  192,  145,  186,
      193,  146,  161,  187,  592,   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,  592,  223,  224,  225,  164,  208,  226,  227,
      165,  228,  592,  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,  592,
      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,  353,

      354,  355,  356,  357,  359,  360,  343,  358,  361,  364,
      365,  344,  345,  366,  367,  368,  346,  347,  369,  370,
      348,  371,  349,  372,  373,  350,  351,  352,  353,  354,
      355,  356,  357,  359,  360,  374,  358,  361,  364,  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,  401,  379,  402,
      380,  403,  399,  381,  382,  383,  384,  385,  386,  387,
      388,  389,  390,  400,  391,  392,  393,  394,  404,  405,

      395,  396,  397,  406,  407,  398,  401,  408,  402,  409,
      403,  399,  410,  411,  412,  413,  414,  415,  416,  417,
      418,  419,  400,  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,  439,  429,  437,  430,  431,
      438,  440,  441,  442,  443,  444,  445,  446,  447,  448,
      432,  449,  450,  451,  452,  433,  434,  453,  454,  455,
      435,  436,  456,  457,  439,  458,  437,  459,  460,  438,

      440,  441,  442,  443,  444,  445,  446,  447,  448,  461,
      449,  450,  451,  452,  462,  463,  453,  454,  455,  464,
      465,  456,  457,  466,  458,  467,  459,  460,  468,  469,
      470,  471,  472,  473,  474,  475,  476,  477,  461,  478,
      479,  480,  481,  462,  463,  482,  483,  484,  464,  465,
      485,  486,  466,  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,
      502,  503,  504,  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,  502,
      503,  504,  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,  592,  592,
      578,  592,  592,  592,  592,  579,  580,  592,  592,  592,
      581,  582,  592,  592,  583,  592,  584,  592,  592,  585,
      586,  587,  588,  589,  590,  591,   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,  592,   80,  156,  156,  156,  156,  157,  157,  157,
      592,  157,  157,  157,  157,  157,  157,  159,  159,  159,
      592,  159,  159,  159,  159,  592,  159,  160,  160,  160,
      160,  160,  160,  160,  160,  160,  160,  170,  170,  592,
      170,  170,  170,  170,  170,  170,  170,  172,  592,  172,

      172,  172,  172,  172,  172,  172,  172,  271,  271,  363,
      363,   13,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592
    } ;

static yyconst flex_int16_t yy_chk[1384] =
    {   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,  454,   10,
       26,   26,   26,  154,   30,   51,   54,  362,  362,   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,

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

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

      371,  373,  374,  375,  376,  377,  378,  379,  380,  399,
      381,  382,  383,  384,  400,  402,  385,  386,  387,  407,
      408,  388,  392,  409,  393,  410,  395,  398,  411,  413,
      414,  416,  417,  418,  419,  420,  422,  423,  399,  424,
      425,  426,  428,  400,  402,  429,  431,  432,  407,  408,
      433,  434,  409,  436,  410,  437,  438,  411,  413,  414,
      416,  417,  418,  419,  420,  422,  423,  439,  424,  425,
      426,  428,  440,  442,  429,  431,  432,  444,  445,  433,
      434,  446,  436,  447,  437,  438,  448,  450,  451,  452,
      456,  457,  458,  461,  462,  464,  439,  465,  466,  467,

      468,  440,  442,  469,  471,  474,  444,  445,  475,  476,
      446,  477,  447,  478,  482,  448,  450,  451,  452,  456,
      457,  458,  461,  462,  464,  484,  465,  466,  467,  468,
      485,  487,  469,  471,  474,  488,  489,  475,  476,  490,
      477,  491,  478,  482,  492,  495,  498,  499,  500,  501,
      503,  506,  507,  509,  484,  511,  512,  513,  514,  485,
      487,  515,  516,  517,  488,  489,  518,  520,  490,  521,
      491,  522,  523,  492,  495,  498,  499,  500,  501,  503,
      506,  507,  509,  524,  511,  512,  513,  514,  525,  526,
      515,  516,  517,  527,  529,  518,  520,  530,  521,  532,

      522,  523,  533,  535,  536,  538,  539,  541,  542,  543,
      544,  545,  524,  547,  548,  549,  550,  525,  526,  552,
      554,  555,  527,  529,  557,  559,  530,  560,  532,  563,
      567,  533,  535,  536,  538,  539,  541,  542,  543,  544,
      545,  568,  547,  548,  549,  550,  569,  572,  552,  554,
      555,  575,  576,  557,  559,  577,  560,  580,  563,  567,
      581,  583,  584,  585,  586,  587,  589,    0,    0,    0,
      568,    0,    0,    0,    0,  569,  572,    0,    0,    0,
      575,  576,    0,    0,  577,    0,  580,    0,    0,  581,
      583,  584,  585,  586,  587,  589,  593,  593,  593,  593,

      593,  593,  593,  593,  593,  593,  594,  594,  594,  594,
      594,  594,  594,  594,  594,  594,  595,  595,  595,  595,
      595,  595,  595,  595,  595,  595,  596,  596,  596,  596,
      596,  596,  596,  596,  596,  596,  597,  597,  597,  597,
      597,  597,  597,  597,  597,  597,  598,  598,  599,  599,
      599,    0,  599,  600,  600,  600,  600,  601,  601,  601,
        0,  601,  601,  601,  601,  601,  601,  602,  602,  602,
        0,  602,  602,  602,  602,    0,  602,  603,  603,  603,
      603,  603,  603,  603,  603,  603,  603,  604,  604,    0,
      604,  604,  604,  604,  604,  604,  604,  605,    0,  605,

      605,  605,  605,  605,  605,  605,  605,  606,  606,  607,
      607,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592,  592,  592,  592,  592,  592,  592,  592,
      592,  592,  592
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[162] =
    {   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, 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 ParseSimpleTableReference;
class ParseSimpleWhenClause;
class ParseStringKeyLiteralValues;
class ParseStatement;
class ParseStatementCopyFrom;
class ParseStatementCreateTable;
class ParseStatementDelete;
class ParseStatementDropTable;
class ParseStatementInsert;
class ParseStatementInsertTuple;
class ParseStatementInsertSelection;
class ParseStatementSelect;
class ParseStatementQuit;
class ParseStatementUpdate;
class ParseSubqueryExpression;
class ParseSubqueryTableReference;
class ParseTableReference;
class ParseTableReferenceSignature;
class 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 1093 "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 131 "../SqlLexer.lpp"


#line 1384 "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 >= 593 )
					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 != 592 );
		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 134 "../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 142 "../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 151 "../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 158 "../SqlLexer.lpp"
{
    /* Ignore whitespace. */
  }
	YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
#line 162 "../SqlLexer.lpp"
{
    /* Newline reverts the lexer to the initial state. */
    yycolumn = 0;
    BEGIN(INITIAL);
    return '\n';
  }
	YY_BREAK


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


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

case 152:
/* rule 152 can match eol */
YY_RULE_SETUP
#line 418 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 153:
/* rule 153 can match eol */
YY_RULE_SETUP
#line 423 "../SqlLexer.lpp"
{
  /* Scan up to a quote or escape sequence. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 154:
/* rule 154 can match eol */
YY_RULE_SETUP
#line 428 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK

case 155:
YY_RULE_SETUP
#line 434 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_NAME;
  }
	YY_BREAK
case 156:
YY_RULE_SETUP
#line 440 "../SqlLexer.lpp"
{
    yylval->numeric_literal_value_ = new quickstep::NumericParseLiteralValue(
        yylloc->first_line, yylloc->first_column, yytext);
    return TOKEN_UNSIGNED_NUMVAL;
  }
	YY_BREAK
case 157:
YY_RULE_SETUP
#line 446 "../SqlLexer.lpp"
/* comment */
	YY_BREAK
case 158:
/* rule 158 can match eol */
YY_RULE_SETUP
#line 448 "../SqlLexer.lpp"
{ yycolumn = 0; }
	YY_BREAK
case 159:
YY_RULE_SETUP
#line 450 "../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 454 "../SqlLexer.lpp"
{
  /* All conditions except for mutli-state string extracting conditions. */
  BEGIN(INITIAL);
  return TOKEN_EOF;
}
	YY_BREAK
case 160:
YY_RULE_SETUP
#line 460 "../SqlLexer.lpp"
{
  BEGIN(INITIAL);
  quickstep_yyerror(NULL, yyscanner, NULL, "illegal character");
  return TOKEN_LEX_ERROR;
}
	YY_BREAK
case 161:
YY_RULE_SETUP
#line 466 "../SqlLexer.lpp"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 2416 "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 >= 593 )
				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 >= 593 )
			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 == 592);

	(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 466 "../SqlLexer.lpp"



