#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 150
#define YY_END_OF_BUFFER 151
/* 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[545] =
    {   0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  151,    2,    2,  149,  149,  148,  147,  149,
      126,  122,  125,  122,  122,  145,  118,  115,  119,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  123,    4,    5,    5,    3,  141,
      141,  138,  142,  142,  136,  143,  143,  140,    1,  148,
      116,  146,  145,  145,  145,    0,  120,  117,  121,  144,
      144,  144,  144,   10,  144,  144,  144,   22,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  124,  144,

      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  144,   57,   65,  144,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  144,   79,   80,  144,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
        4,    5,    3,  141,  137,  142,  135,  135,  127,  129,
      130,  131,  132,  133,  134,  135,  143,  139,  146,  145,
        0,  145,    6,    7,  144,    9,   11,  144,  144,   15,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
       32,  144,  144,  144,  144,  144,  144,  144,  144,   43,

      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  144,  144,   61,  144,   67,  144,
      144,  144,  144,  144,  144,  144,   75,  144,   78,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  144,  144,   96,   97,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  127,  129,
      128,  144,  144,  144,  144,  144,  144,  144,   20,   23,
      144,  144,  144,   28,  144,  144,   30,  144,  144,  144,
      144,   37,  144,  144,   41,   42,  144,  144,  144,  144,
      144,  144,  144,   51,   52,  144,   54,  144,   56,  144,

      144,  144,  144,   64,   66,   68,   69,   70,  144,   72,
      144,  144,   76,  144,  144,  144,  144,  144,   87,  144,
       89,  144,  144,  144,  144,  144,  144,  144,  144,  100,
      101,  103,  144,  144,  144,  144,  144,  144,  110,  144,
      112,  113,  127,  128,    8,  144,  144,  144,  144,  144,
      144,  144,   25,  144,  144,  144,  144,  144,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,   47,   48,
       49,  144,   53,  144,   58,   59,  144,  144,  144,   71,
      144,   74,   77,   81,   82,  144,  144,  144,   88,  144,
      144,   92,  144,  144,  144,  144,   99,  144,  144,  144,

      144,  107,  144,  144,  111,  144,  144,  144,   14,  144,
      144,  144,  144,  144,   26,  144,   29,  144,  144,  144,
      144,   35,  144,  144,  144,   40,  144,   45,  144,  144,
       55,   60,  144,  144,   73,  144,  144,  144,  144,   91,
      144,   94,   95,  144,  144,  144,  105,  106,  108,  144,
      144,  144,   13,  144,  144,  144,  144,  144,  144,   21,
      144,   33,   34,  144,  144,  144,  144,   46,   50,   62,
      144,  144,   85,   86,  144,  144,  144,  144,  144,  109,
      144,  144,  144,  144,  144,  144,  144,  144,   31,  144,
      144,   39,  144,   63,  144,  144,  144,   98,  144,  144,

      144,   12,  144,  144,  144,  144,   24,  144,   36,  144,
      144,   83,  144,  144,  102,  144,  114,   16,  144,  144,
      144,   27,   38,  144,   84,   90,  144,  144,  144,   18,
       19,  144,  144,  104,  144,  144,  144,  144,  144,   93,
      144,   44,   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[560] =
    {   0,
        0,    1,   46,    0,  117,  163,    2,    3,  128,  132,
        6,   10,  257, 1212, 1212,    0, 1212,   13, 1212,  233,
     1212, 1212, 1212,  208,    6,  130,    4, 1212,  195,  124,
      161,  170,  178,  207,  260,   92,  167,  161,   96,  107,
      219,  214,  212,  224,  236,   92,  279,  171,  278,  281,
      128,  227,    0,  125, 1212,  184,    4,   19,    0,    0,
        0,  146,    0,    0,  343,    0,    0,  145,    0,   22,
     1212,    0,  297,  316,  338,   18, 1212, 1212, 1212,    0,
      170,  227,  173,  178,  224,  299,  270,    0,  270,  335,
      330,  286,  320,  327,  376,  308,  316,  326, 1212,  335,

      351,  355,  371,  348,  346,  353,  359,  370,  382,  383,
      380,  379,  399,    0,  392,  379,  386,  401,  399,  401,
      402,  407,  402,  413,  420,    0,  431,  417,  420,  422,
      434,  437,  435,  451,  446,  433,  456,  459,  459,  457,
      450,  444,  454,  462,  469,  465,  465,  474,  460,  483,
      148,   29,    0,    0, 1212,    0, 1212, 1212,   22,   24,
     1212, 1212, 1212, 1212, 1212,    0,    0, 1212,    0,  515,
       26,   28,    0,    0,  488,    0,  490,  473,  489,  478,
      501,  502,  496,  512,  496,  499,  494,  520,  503,  521,
        0,  519,  528,  526,  529,  514,  535,  522,  534,    0,

      539,  522,  524,  532,  534,  553,  551,  546,  550,  544,
      564,  564,  556,  570,  571,  572,  574,  564,    0,  561,
      564,  581,  578,  583,  571,  573,    0,  583,    0,  591,
      592,  578,  596,  587,  589,  604,  600,  609,  612,  612,
       98,  608,  625,    0,  619,  620,  619,  629,  630,  624,
      620,  638,  628,  623,  642,  633,  640,  632,   30,  125,
        0,  635,  640,  650,  642,  652,  647,  654,    0,  668,
      659,  659,  655,    0,  658,  663,  668,  676,  669,  671,
      679,  688,  685,  683,    0,    0,  681,  680,  701,  698,
      685,  686,  699,    0,    0,  693,    0,  697,    0,  688,

      695,  696,  709,    0,    0,    0,    0,    0,  695,    0,
      705,  720,  711,  715,  718,  730,  741,  746,    0,  743,
        0,  731,  726,  731,  748,  739,  752,  746,  755,    0,
      742,    0,  758,  743,  746,  760,  764,  762,    0,  766,
        0,  759,  136, 1212,    0,  769,  769,  763,  784,  772,
      780,  791,    0,  783,  786,  800,  801,  798,  807,  797,
      805,  802,  799,  802,  813,  814,  802,  819,    0,    0,
        0,  817,    0,  818,    0,    0,  807,  823,  807,    0,
      825,    0,    0,    0,    0,  811,  818,  823,    0,  838,
      828,    0,  841,  845,  832,  846,    0,  842,  844,  859,

      860,    0,  847,  866,    0,  853,  860,  857,    0,  852,
      858,  876,  870,  860,    0,  881,    0,  878,  872,  874,
      867,    0,  868,  885,  887,    0,   93,    0,  879,  887,
        0,    0,  884,  903,    0,  898,  890,  888,  906,    0,
      909,    0,    0,  908,  922,  923,    0,    0,    0,  907,
      912,  913,    0,  920,  917,  921,  923,  932,  929,    0,
      935,    0,    0,  936,  934,  924,  926,    0,    0,    0,
      934,  932,    0,    0,  945,  948,  939,  947,  949,    0,
      945,  961,  957,  962,  963,  960,  963,  968,    0,  965,
      970,    0,  965,    0,  973,  985,  979,    0,  977,  979,

      988,    0,  991,  994,  989,  997,    0,  983,    0,  997,
      987,  987,  996, 1008,    0, 1006,    0,    0, 1002, 1018,
     1008,    0,    0, 1020,    0,    0, 1016, 1032, 1018,    0,
        0, 1025, 1035,    0, 1032, 1035, 1025, 1040, 1029,    0,
     1031,    0,    0, 1212, 1096, 1106, 1116, 1126, 1136, 1140,
     1143, 1149, 1157, 1167, 1177, 1187, 1197, 1202, 1204
    } ;

static yyconst flex_int16_t yy_def[560] =
    {   0,
      545,  545,  544,    3,  546,  546,  547,  547,  548,  548,
      549,  549,  544,  544,  544,  550,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  544,  544,  544,  544,  552,  553,
      553,  544,  554,  554,  555,  556,  556,  544,  550,  544,
      544,  557,  544,  544,  544,  544,  544,  544,  544,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  544,  551,

      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      544,  544,  552,  553,  544,  554,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  558,  556,  544,  557,  544,
      544,  544,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,

      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  544,  544,
      559,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,

      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  544,  544,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,

      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,

      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
      551,  551,  551,    0,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544
    } ;

static yyconst flex_uint16_t yy_nxt[1284] =
    {   0,
      544,  544,   15,   15,   61,   61,  152,  152,   67,   62,
       62,   68,   67,  544,   70,   68,   70,   73,   73,   77,
       78,  152,  152,   70,  544,   70,  171,  171,  544,  172,
      172,  152,  152,  259,  260,  260,  260,  172,  172,  172,
      172,  343,  260,  544,   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,  110,  115,  116,  132,
       64,   17,   17,   17,   64,   62,  260,  260,  467,   62,
       74,   75,   75,  325,   81,  147,  150,  260,  260,  151,
      168,   76,   82,  155,   83,  110,  115,  116,  132,   84,
       17,   17,   17,   17,   56,   57,   58,   17,   17,   17,
       17,   17,   65,   81,  147,  150,   65,   17,   17,   17,
       76,   82,   85,   83,  111,  151,   86,   89,   84,   87,
      173,  113,  137,  176,   90,   94,  114,  177,  112,   95,

      138,   91,   88,   96,   92,   93,   17,   17,   17,   97,
       79,   85,   98,  111,   99,   86,   89,   72,   87,  173,
      113,  137,  176,   90,   94,  114,  177,  112,   95,  138,
       91,   88,   96,   92,   93,  100,  117,  101,   97,  121,
      118,   98,  102,  123,  119,  122,  125,  103,   71,  124,
      120,  148,  149,  129,  126,  174,  544,  130,  127,  544,
      178,  128,  544,  175,  100,  117,  101,  544,  121,  118,
      131,  102,  123,  119,  122,  125,  103,  104,  124,  120,
      148,  149,  129,  126,  174,  105,  130,  127,  106,  178,
      128,  107,  175,  544,  108,  139,  133,  109,  544,  131,

      134,  181,  140,  141,  135,  182,  104,  188,   73,   73,
      136,  144,  142,  145,  105,  143,  146,  106,   76,  544,
      107,  544,  179,  108,  139,  133,  109,  170,  170,  134,
      181,  140,  141,  135,  182,  180,  188,   76,  189,  136,
      144,  142,  145,  196,  143,  146,  158,   76,   74,   75,
       75,  179,  183,  197,  159,  160,  184,  198,  185,   76,
      186,  161,  187,  190,  180,  162,   76,  189,  191,  544,
      199,  200,  196,  163,  201,  544,  204,  164,  544,  165,
      205,  183,  197,  166,  206,  184,  198,  185,   76,  186,
      161,  187,  190,  207,  162,  192,  202,  191,  193,  199,

      200,  208,  163,  201,  194,  204,  164,  203,  165,  205,
      209,  195,  166,  206,  210,  211,  213,  218,  212,  214,
      219,  220,  207,  221,  192,  202,  222,  193,  223,  215,
      208,  224,  225,  194,  216,  217,  203,  226,  227,  209,
      195,  228,  229,  210,  211,  213,  218,  212,  214,  219,
      220,  230,  221,  231,  232,  222,  233,  223,  215,  234,
      224,  225,  235,  216,  217,  236,  226,  227,  237,  240,
      228,  229,  241,  238,  239,  242,  245,  246,  247,  248,
      230,  249,  231,  232,  243,  233,  250,  251,  234,  252,
      253,  235,  244,  254,  236,  256,  257,  237,  240,  255,

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

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

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

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

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

      510,  511,  497,  512,  498,  499,  513,  500,  514,  515,
      501,  516,  517,  502,  518,  519,  503,  520,  521,  522,
      523,  524,  525,  504,  505,  506,  507,  508,  509,  510,
      511,  526,  512,  527,  528,  513,  529,  514,  515,  530,
      516,  517,  531,  518,  519,  532,  520,  521,  522,  523,
      524,  525,  533,  534,  535,  536,  537,  538,  539,  540,
      526,  541,  527,  528,  542,  529,  543,  544,  530,  544,
      544,  531,  544,  544,  532,  544,  544,  544,  544,  544,
      544,  533,  534,  535,  536,  537,  538,  539,  540,  544,
      541,  544,  544,  542,  544,  543,   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,  544,   80,  153,  153,  153,  153,  154,  154,  154,
      544,  154,  154,  154,  154,  154,  154,  156,  156,  156,
      544,  156,  156,  156,  156,  544,  156,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  167,  167,  544,
      167,  167,  167,  167,  167,  167,  167,  169,  544,  169,

      169,  169,  169,  169,  169,  169,  169,  261,  261,  344,
      344,   13,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544
    } ;

static yyconst flex_int16_t yy_chk[1284] =
    {   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,  152,  152,  159,  159,  160,  160,  171,  171,  172,
      172,  259,  259,    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,  260,  260,  427,   10,
       26,   26,   26,  241,   30,   51,   54,  343,  343,  151,
       68,   26,   30,   62,   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,   56,   31,   32,   30,   31,
       81,   38,   48,   83,   32,   33,   38,   84,   37,   33,

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

       47,   87,   49,   49,   47,   89,   35,   92,   73,   73,
       47,   50,   49,   50,   35,   49,   50,   35,   73,    0,
       35,    0,   86,   35,   49,   47,   35,   74,   74,   47,
       87,   49,   49,   47,   89,   86,   92,   74,   93,   47,
       50,   49,   50,   96,   49,   50,   65,   73,   75,   75,
       75,   86,   90,   97,   65,   65,   90,   98,   91,   75,
       91,   65,   91,   94,   86,   65,   74,   93,   94,    0,
      100,  101,   96,   65,  102,    0,  104,   65,    0,   65,
      105,   90,   97,   65,  106,   90,   98,   91,   75,   91,
       65,   91,   94,  107,   65,   95,  103,   94,   95,  100,

      101,  108,   65,  102,   95,  104,   65,  103,   65,  105,
      109,   95,   65,  106,  110,  111,  112,  115,  111,  113,
      116,  117,  107,  118,   95,  103,  119,   95,  119,  113,
      108,  120,  121,   95,  113,  113,  103,  122,  123,  109,
       95,  124,  125,  110,  111,  112,  115,  111,  113,  116,
      117,  127,  118,  128,  129,  119,  130,  119,  113,  131,
      120,  121,  132,  113,  113,  133,  122,  123,  134,  135,
      124,  125,  136,  134,  134,  137,  138,  139,  140,  141,
      127,  142,  128,  129,  137,  130,  143,  144,  131,  145,
      146,  132,  137,  147,  133,  148,  149,  134,  135,  147,

      150,  136,  134,  134,  137,  138,  139,  140,  141,  175,
      142,  177,  178,  137,  179,  143,  144,  180,  145,  146,
      181,  137,  147,  182,  148,  149,  170,  170,  147,  150,
      183,  184,  181,  185,  186,  187,  170,  188,  175,  189,
      177,  178,  190,  179,  192,  193,  180,  194,  195,  181,
      196,  194,  182,  197,  198,  199,  201,  202,  203,  183,
      184,  181,  185,  186,  187,  170,  188,  204,  189,  205,
      206,  190,  207,  192,  193,  208,  194,  195,  209,  196,
      194,  210,  197,  198,  199,  201,  202,  203,  211,  212,
      213,  214,  215,  216,  218,  217,  204,  220,  205,  206,

      221,  207,  222,  223,  208,  217,  224,  209,  225,  226,
      210,  228,  230,  231,  232,  233,  234,  211,  212,  213,
      214,  215,  216,  218,  217,  235,  220,  236,  237,  221,
      238,  222,  223,  239,  217,  224,  240,  225,  226,  242,
      228,  230,  231,  232,  233,  234,  243,  245,  246,  247,
      248,  249,  250,  251,  235,  252,  236,  237,  253,  238,
      254,  255,  239,  256,  257,  240,  258,  256,  242,  262,
      263,  264,  265,  266,  267,  243,  245,  246,  247,  248,
      249,  250,  251,  268,  252,  270,  271,  253,  272,  254,
      255,  273,  256,  257,  275,  258,  256,  276,  262,  263,

      264,  265,  266,  267,  277,  278,  279,  280,  281,  282,
      283,  284,  268,  287,  270,  271,  288,  272,  289,  290,
      273,  291,  292,  275,  293,  296,  276,  298,  300,  301,
      302,  309,  303,  277,  278,  279,  280,  281,  282,  283,
      284,  311,  287,  303,  312,  288,  313,  289,  290,  314,
      291,  292,  315,  293,  296,  316,  298,  300,  301,  302,
      309,  303,  317,  318,  320,  322,  323,  324,  325,  326,
      311,  327,  303,  312,  328,  313,  329,  331,  314,  333,
      334,  315,  335,  336,  316,  337,  338,  340,  342,  346,
      347,  317,  318,  320,  322,  323,  324,  325,  326,  348,

      327,  349,  351,  328,  350,  329,  331,  350,  333,  334,
      352,  335,  336,  354,  337,  338,  340,  342,  346,  347,
      355,  356,  357,  358,  359,  360,  361,  362,  348,  363,
      349,  351,  364,  350,  365,  366,  350,  367,  368,  352,
      372,  374,  354,  377,  378,  379,  381,  386,  387,  355,
      356,  357,  358,  359,  360,  361,  362,  388,  363,  390,
      391,  364,  393,  365,  366,  394,  367,  368,  395,  372,
      374,  396,  377,  378,  379,  381,  386,  387,  398,  399,
      400,  401,  403,  404,  406,  407,  388,  408,  390,  391,
      410,  393,  411,  412,  394,  413,  414,  395,  416,  418,

      396,  419,  420,  421,  423,  424,  425,  398,  399,  400,
      401,  403,  404,  406,  407,  429,  408,  430,  433,  410,
      434,  411,  412,  436,  413,  414,  437,  416,  418,  438,
      419,  420,  421,  423,  424,  425,  439,  441,  444,  445,
      446,  450,  451,  452,  429,  454,  430,  433,  455,  434,
      456,  457,  436,  458,  459,  437,  461,  464,  438,  465,
      466,  467,  471,  472,  475,  439,  441,  444,  445,  446,
      450,  451,  452,  476,  454,  477,  478,  455,  479,  456,
      457,  481,  458,  459,  482,  461,  464,  483,  465,  466,
      467,  471,  472,  475,  484,  485,  486,  487,  488,  490,

      491,  493,  476,  495,  477,  478,  496,  479,  497,  499,
      481,  500,  501,  482,  503,  504,  483,  505,  506,  508,
      510,  511,  512,  484,  485,  486,  487,  488,  490,  491,
      493,  513,  495,  514,  516,  496,  519,  497,  499,  520,
      500,  501,  521,  503,  504,  524,  505,  506,  508,  510,
      511,  512,  527,  528,  529,  532,  533,  535,  536,  537,
      513,  538,  514,  516,  539,  519,  541,    0,  520,    0,
        0,  521,    0,    0,  524,    0,    0,    0,    0,    0,
        0,  527,  528,  529,  532,  533,  535,  536,  537,    0,
      538,    0,    0,  539,    0,  541,  545,  545,  545,  545,

      545,  545,  545,  545,  545,  545,  546,  546,  546,  546,
      546,  546,  546,  546,  546,  546,  547,  547,  547,  547,
      547,  547,  547,  547,  547,  547,  548,  548,  548,  548,
      548,  548,  548,  548,  548,  548,  549,  549,  549,  549,
      549,  549,  549,  549,  549,  549,  550,  550,  551,  551,
      551,    0,  551,  552,  552,  552,  552,  553,  553,  553,
        0,  553,  553,  553,  553,  553,  553,  554,  554,  554,
        0,  554,  554,  554,  554,    0,  554,  555,  555,  555,
      555,  555,  555,  555,  555,  555,  555,  556,  556,    0,
      556,  556,  556,  556,  556,  556,  556,  557,    0,  557,

      557,  557,  557,  557,  557,  557,  557,  558,  558,  559,
      559,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544,  544,  544,  544,  544,  544,  544,  544,
      544,  544,  544
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[151] =
    {   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, 1, 0, 0, 0, 0, 
    0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0,     };

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
#line 1 "../SqlLexer.lpp"
/**
 *   Copyright 2011-2015 Quickstep Technologies LLC.
 *   Copyright 2015 Pivotal Software, Inc.
 *   Copyright 2016, Quickstep Research Group, Computer Sciences Department,
 *     University of Wisconsin—Madison.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 **/
#define YY_NO_INPUT 1
#define YY_NO_UNISTD_H 1
#line 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;
class ParseFunctionCall;
class ParseGroupBy;
class ParseHaving;
class ParseKeyIntegerValue;
class ParseKeyStringValue;
class ParseKeyStringList;
class ParseKeyValue;
class ParseLimit;
class ParseOrderBy;
class ParseOrderByItem;
class ParsePartitionClause;
class ParsePredicate;
class ParseSample;
class ParseScalarLiteral;
class 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 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 1049 "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 128 "../SqlLexer.lpp"


#line 1340 "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 >= 545 )
					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 != 544 );
		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 131 "../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 139 "../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 148 "../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 155 "../SqlLexer.lpp"
{
    /* Ignore whitespace. */
  }
	YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
#line 159 "../SqlLexer.lpp"
{
    /* Newline reverts the lexer to the initial state. */
    yycolumn = 0;
    BEGIN(INITIAL);
    return '\n';
  }
	YY_BREAK


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


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

case 141:
/* rule 141 can match eol */
YY_RULE_SETUP
#line 404 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 142:
/* rule 142 can match eol */
YY_RULE_SETUP
#line 409 "../SqlLexer.lpp"
{
  /* Scan up to a quote or escape sequence. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 143:
/* rule 143 can match eol */
YY_RULE_SETUP
#line 414 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK

case 144:
YY_RULE_SETUP
#line 420 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_NAME;
  }
	YY_BREAK
case 145:
YY_RULE_SETUP
#line 426 "../SqlLexer.lpp"
{
    yylval->numeric_literal_value_ = new quickstep::NumericParseLiteralValue(
        yylloc->first_line, yylloc->first_column, yytext);
    return TOKEN_UNSIGNED_NUMVAL;
  }
	YY_BREAK
case 146:
YY_RULE_SETUP
#line 432 "../SqlLexer.lpp"
/* comment */
	YY_BREAK
case 147:
/* rule 147 can match eol */
YY_RULE_SETUP
#line 434 "../SqlLexer.lpp"
{ yycolumn = 0; }
	YY_BREAK
case 148:
YY_RULE_SETUP
#line 436 "../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 440 "../SqlLexer.lpp"
{
  /* All conditions except for mutli-state string extracting conditions. */
  BEGIN(INITIAL);
  return TOKEN_EOF;
}
	YY_BREAK
case 149:
YY_RULE_SETUP
#line 446 "../SqlLexer.lpp"
{
  BEGIN(INITIAL);
  quickstep_yyerror(NULL, yyscanner, NULL, "illegal character");
  return TOKEN_LEX_ERROR;
}
	YY_BREAK
case 150:
YY_RULE_SETUP
#line 452 "../SqlLexer.lpp"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 2317 "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 >= 545 )
				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 >= 545 )
			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 == 544);

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



