#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 144
#define YY_END_OF_BUFFER 145
/* 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[527] =
    {   0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  145,    2,    2,  143,  143,  142,  141,  143,
      120,  116,  119,  116,  116,  139,  112,  109,  113,  138,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  117,    4,    5,    5,    3,  135,  135,
      132,  136,  136,  130,  137,  137,  134,    1,  142,  110,
      140,  139,  139,  139,    0,  114,  111,  115,  138,  138,
      138,  138,   10,  138,  138,  138,   22,  138,  138,  138,
      138,  138,  138,  138,  138,  138,  138,  118,  138,  138,

      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
       55,   63,  138,  138,  138,  138,  138,  138,  138,  138,
      138,   75,   76,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  138,    4,    5,    3,  135,
      131,  136,  129,  129,  121,  123,  124,  125,  126,  127,
      128,  129,  137,  133,  140,  139,    0,  139,    6,    7,
      138,    9,   11,  138,  138,   15,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,   42,  138,  138,  138,  138,  138,

      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
       59,  138,   65,  138,  138,  138,  138,  138,   71,  138,
       74,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,   91,   92,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  121,
      123,  122,  138,  138,  138,  138,  138,  138,  138,   20,
       23,  138,  138,  138,   28,  138,  138,   30,  138,  138,
      138,  138,   36,  138,  138,   40,   41,  138,  138,  138,
      138,  138,  138,  138,   50,   51,  138,   53,  138,  138,
      138,  138,  138,   62,   64,   66,   67,   68,  138,   70,

       72,  138,  138,  138,  138,  138,   83,  138,   85,  138,
      138,  138,  138,  138,  138,  138,   95,   96,   98,  138,
      138,  138,  138,  138,  138,  105,  138,  107,  138,  121,
      122,    8,  138,  138,  138,  138,  138,  138,  138,   25,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,  138,   46,   47,   48,  138,   52,
      138,   56,   57,  138,  138,  138,   69,   73,   77,   78,
      138,  138,  138,   84,  138,  138,   88,  138,  138,  138,
       94,  138,  138,  138,  138,  102,  138,  138,  106,  138,
      138,  138,   14,  138,  138,  138,  138,  138,   26,  138,

       29,  138,  138,  138,  138,   34,  138,  138,  138,   39,
      138,   44,  138,  138,   54,   58,  138,  138,  138,  138,
      138,  138,   87,  138,   90,  138,  138,  138,  100,  101,
      103,  138,  138,  138,   13,  138,  138,  138,  138,  138,
      138,   21,  138,   32,   33,  138,  138,  138,  138,   45,
       49,   60,  138,  138,   81,   82,  138,  138,  138,  138,
      138,  104,  138,  138,  138,  138,  138,  138,  138,  138,
       31,  138,  138,   38,  138,   61,  138,  138,  138,   93,
      138,  138,  138,   12,  138,  138,  138,  138,   24,  138,
       35,  138,  138,   79,  138,  138,   97,  138,  108,   16,

      138,  138,  138,   27,   37,  138,   80,   86,  138,  138,
      138,   18,   19,  138,  138,   99,  138,  138,  138,  138,
      138,   89,  138,   43,   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[542] =
    {   0,
        0,    1,   46,    0,  117,  163,    2,    3,  128,  132,
        6,   10,  260, 1177, 1177,    0, 1177,   13, 1177,  241,
     1177, 1177, 1177,  239,    6,  130,    4, 1177,  202,  124,
      161,  170,  178,  207,  260,   92,  110,  161,   97,  108,
      219,    0,  153,  221,  176,  108,  232,  171,  276,  272,
      129,  221,  177, 1177,  184,    4,   19,    0,    0,    0,
      146,    0,    0,  340,    0,    0,  145,    0,   22, 1177,
        0,  249,  284,  334,   18, 1177, 1177, 1177,    0,  232,
      262,  234,  270,  267,  285,  278,    0,  276,  307,  331,
      291,  307,  299,  347,  313,  312,  325, 1177,  325,  345,

      348,  343,  343,  338,  342,  347,  352,  358,  362,  378,
      394,    0,  381,  366,  382,  396,  392,  390,  387,  397,
      404,    0,  407,  392,  397,  398,  408,  409,  407,  447,
      415,  400,  437,  434,  453,  451,  445,  438,  444,  452,
      458,  454,  453,  461,  447,  467,  148,   29,    0,    0,
     1177,    0, 1177, 1177,   22,   24, 1177, 1177, 1177, 1177,
     1177,    0,    0, 1177,    0,  474,   26,   28,    0,    0,
      467,    0,  468,  451,  466,  453,  478,  475,  480,  496,
      485,  488,  486,  511,  493,  509,  506,  515,  512,  515,
      499,  518,  507,  519,    0,  524,  507,  511,  511,  512,

      531,  528,  521,  525,  517,  531,  542,  551,  552,  559,
      560,  555,    0,  550,  551,  567,  564,  567,    0,  564,
        0,  572,  573,  559,  578,  569,  563,  577,  575,  583,
      584,  582,   98,  586,    0,  580,  583,  582,  592,  604,
      602,  598,  621,  609,  606,  625,  615,  622,  613,   30,
      125,    0,  614,  620,  630,  622,  632,  628,  627,    0,
      640,  631,  632,  626,    0,  627,  630,  629,  637,  632,
      634,  642,  662,  663,  661,    0,    0,  664,  661,  684,
      681,  667,  668,  680,    0,    0,  674,    0,  677,  668,
      675,  676,  688,    0,    0,    0,    0,    0,  677,    0,

      679,  681,  682,  694,  699,  704,    0,  702,    0,  690,
      687,  692,  709,  722,  718,  726,    0,  719,    0,  734,
      722,  724,  738,  741,  739,    0,  743,    0,  736,  136,
     1177,    0,  746,  746,  732,  752,  739,  750,  754,    0,
      747,  744,  758,  759,  756,  765,  757,  765,  762,  769,
      774,  784,  791,  778,  798,    0,    0,    0,  795,    0,
      796,    0,    0,  784,  800,  784,    0,    0,    0,    0,
      787,  794,  791,    0,  805,  795,    0,  808,  794,  806,
        0,  796,  800,  815,  816,    0,  803,  822,    0,  809,
      818,  814,    0,  807,  823,  845,  838,  834,    0,  854,

        0,  854,  847,  849,  842,    0,  843,  860,  862,    0,
       93,    0,  846,  853,    0,    0,  850,  868,  862,  852,
      848,  860,    0,  865,    0,  864,  878,  879,    0,    0,
        0,  863,  868,  871,    0,  877,  872,  886,  892,  900,
      903,    0,  908,    0,    0,  912,  909,  899,  901,    0,
        0,    0,  909,  907,    0,    0,  920,  915,  905,  913,
      914,    0,  909,  923,  917,  916,  919,  916,  919,  924,
        0,  921,  926,    0,  923,    0,  930,  940,  944,    0,
      946,  947,  962,    0,  964,  970,  964,  972,    0,  958,
        0,  972,  962,  962,  963,  974,    0,  972,    0,    0,

      967,  982,  970,    0,    0,  980,    0,    0,  970,  988,
      974,    0,    0,  981,  991,    0,  988,  991,  983,  997,
      984,    0,  996,    0,    0, 1177, 1061, 1071, 1081, 1091,
     1101, 1105, 1108, 1114, 1122, 1132, 1142, 1152, 1162, 1167,
     1169
    } ;

static yyconst flex_int16_t yy_def[542] =
    {   0,
      527,  527,  526,    3,  528,  528,  529,  529,  530,  530,
      531,  531,  526,  526,  526,  532,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  526,  526,  526,  526,  534,  535,  535,
      526,  536,  536,  537,  538,  538,  526,  532,  526,  526,
      539,  526,  526,  526,  526,  526,  526,  526,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  526,  533,  533,

      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  526,  526,  534,  535,
      526,  536,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  540,  538,  526,  539,  526,  526,  526,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,

      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  526,
      526,  541,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,

      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  526,
      526,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,

      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,

      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,  533,  533,  533,  533,  533,
      533,  533,  533,  533,  533,    0,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526
    } ;

static yyconst flex_uint16_t yy_nxt[1249] =
    {   0,
      526,  526,   15,   15,   60,   60,  148,  148,   66,   61,
       61,   67,   66,  526,   69,   67,   69,   72,   72,   76,
       77,  148,  148,   69,  526,   69,  167,  167,  526,  168,
      168,  148,  148,  250,  251,  251,  251,  168,  168,  168,
      168,  330,  251,  526,   16,   16,   17,   18,   19,   18,
       20,   21,   22,   23,   22,   24,   25,   26,   26,   17,
       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
       37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
       47,   48,   49,   50,   51,   52,   42,   53,   42,   54,
       17,   17,   30,   31,   32,   33,   34,   35,   36,   37,

       38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
       48,   49,   50,   51,   52,   42,   53,   17,   55,   56,
       57,   17,   17,   17,   17,   17,  109,  110,  113,  114,
       63,   17,   17,   17,   63,   61,  251,  251,  449,   61,
       73,   74,   74,  313,   80,  128,  143,  251,  251,  147,
      164,   75,   81,  151,   82,  109,  110,  113,  114,   83,
       17,   17,   17,   17,   55,   56,   57,   17,   17,   17,
       17,   17,   64,   80,  128,  143,   64,   17,   17,   17,
       75,   81,   84,   82,  119,  147,   85,   88,   83,   86,
      120,  111,  133,  125,   89,   93,  112,  126,  146,   94,

      134,   90,   87,   95,   91,   92,   17,   17,   17,   96,
      127,   84,   97,  119,   98,   85,   88,   78,   86,  120,
      111,  133,  125,   89,   93,  112,  126,  146,   94,  134,
       90,   87,   95,   91,   92,   99,  115,  100,   96,  127,
      116,   97,  101,  121,  117,  144,  145,  102,   71,  129,
      118,  122,  169,  130,  172,  123,   70,  131,  124,  526,
       72,   72,  526,  132,   99,  115,  100,  526,  526,  116,
       75,  101,  121,  117,  144,  145,  102,  103,  129,  118,
      122,  169,  130,  172,  123,  104,  131,  124,  105,  173,
      170,  106,  132,  135,  107,  166,  166,  108,  171,   75,

      136,  137,  140,  174,  141,   75,  103,  142,  175,  177,
      138,  178,  184,  139,  104,  526,  526,  105,  173,  170,
      106,  176,  135,  107,  179,  185,  108,  171,  180,  136,
      137,  140,  174,  141,   75,  186,  142,  175,  177,  138,
      178,  184,  139,  154,   73,   74,   74,  526,  191,  192,
      176,  155,  156,  179,  185,   75,  193,  180,  157,  181,
      194,  182,  158,  183,  186,  195,  187,  196,  197,  188,
      159,  199,  200,  201,  160,  189,  161,  191,  192,  198,
      162,  202,  190,  203,   75,  193,  204,  157,  181,  194,
      182,  158,  183,  205,  195,  187,  196,  197,  188,  159,

      199,  200,  201,  160,  189,  161,  212,  213,  198,  162,
      202,  190,  203,  206,  208,  204,  207,  214,  215,  216,
      218,  217,  205,  219,  209,  220,  221,  222,  223,  210,
      211,  224,  225,  226,  227,  212,  213,  228,  232,  233,
      526,  526,  206,  208,  526,  207,  214,  215,  216,  218,
      217,  236,  219,  209,  220,  221,  222,  223,  210,  211,
      224,  225,  226,  227,  229,  234,  228,  232,  233,  230,
      231,  237,  238,  235,  239,  240,  241,  242,  243,  244,
      236,  245,  247,  248,  249,  166,  166,  246,  253,  254,
      255,  256,  257,  229,  234,   75,  260,  258,  230,  231,

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

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

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

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

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

      510,  511,  496,  512,  513,  514,  515,  497,  498,  516,
      517,  518,  519,  520,  521,  499,  500,  522,  523,  524,
      501,  502,  503,  504,  505,  506,  507,  508,  509,  510,
      511,  525,  512,  513,  514,  515,  526,  526,  516,  517,
      518,  519,  520,  521,  526,  526,  522,  523,  524,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      525,   14,   14,   14,   14,   14,   14,   14,   14,   14,
       14,   58,   58,   58,   58,   58,   58,   58,   58,   58,
       58,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   62,   62,   62,   62,   62,   62,   62,   62,   62,

       62,   65,   65,   65,   65,   65,   65,   65,   65,   65,
       65,   68,   68,   79,   79,   79,  526,   79,  149,  149,
      149,  149,  150,  150,  150,  526,  150,  150,  150,  150,
      150,  150,  152,  152,  152,  526,  152,  152,  152,  152,
      526,  152,  153,  153,  153,  153,  153,  153,  153,  153,
      153,  153,  163,  163,  526,  163,  163,  163,  163,  163,
      163,  163,  165,  526,  165,  165,  165,  165,  165,  165,
      165,  165,  252,  252,  331,  331,   13,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,

      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526
    } ;

static yyconst flex_int16_t yy_chk[1249] =
    {   0,
        0,    0,    1,    2,    7,    8,   56,   56,   11,    7,
        8,   11,   12,    0,   18,   12,   18,   25,   25,   27,
       27,   57,   57,   69,    0,   69,   75,   75,    0,   75,
       75,  148,  148,  155,  155,  156,  156,  167,  167,  168,
      168,  250,  250,    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,   37,   39,   40,
        9,    5,    5,    5,   10,    9,  251,  251,  411,   10,
       26,   26,   26,  233,   30,   46,   51,  330,  330,  147,
       67,   26,   30,   61,   30,   36,   37,   39,   40,   30,
        5,    5,    5,    6,    6,    6,    6,    6,    6,    6,
        6,    6,    9,   30,   46,   51,   10,    6,    6,    6,
       26,   30,   31,   30,   43,   55,   31,   32,   30,   31,
       43,   38,   48,   45,   32,   33,   38,   45,   53,   33,

       48,   32,   31,   33,   32,   32,    6,    6,    6,   33,
       45,   31,   33,   43,   34,   31,   32,   29,   31,   43,
       38,   48,   45,   32,   33,   38,   45,   53,   33,   48,
       32,   31,   33,   32,   32,   34,   41,   34,   33,   45,
       41,   33,   34,   44,   41,   52,   52,   34,   24,   47,
       41,   44,   80,   47,   82,   44,   20,   47,   44,   13,
       72,   72,    0,   47,   34,   41,   34,    0,    0,   41,
       72,   34,   44,   41,   52,   52,   34,   35,   47,   41,
       44,   80,   47,   82,   44,   35,   47,   44,   35,   83,
       81,   35,   47,   49,   35,   73,   73,   35,   81,   72,

       49,   49,   50,   84,   50,   73,   35,   50,   85,   86,
       49,   88,   91,   49,   35,    0,    0,   35,   83,   81,
       35,   85,   49,   35,   89,   92,   35,   81,   89,   49,
       49,   50,   84,   50,   73,   93,   50,   85,   86,   49,
       88,   91,   49,   64,   74,   74,   74,    0,   95,   96,
       85,   64,   64,   89,   92,   74,   97,   89,   64,   90,
       99,   90,   64,   90,   93,  100,   94,  101,  102,   94,
       64,  103,  104,  105,   64,   94,   64,   95,   96,  102,
       64,  106,   94,  107,   74,   97,  108,   64,   90,   99,
       90,   64,   90,  109,  100,   94,  101,  102,   94,   64,

      103,  104,  105,   64,   94,   64,  113,  114,  102,   64,
      106,   94,  107,  110,  111,  108,  110,  115,  116,  117,
      118,  117,  109,  119,  111,  120,  121,  123,  124,  111,
      111,  125,  126,  127,  128,  113,  114,  129,  131,  132,
        0,    0,  110,  111,    0,  110,  115,  116,  117,  118,
      117,  134,  119,  111,  120,  121,  123,  124,  111,  111,
      125,  126,  127,  128,  130,  133,  129,  131,  132,  130,
      130,  135,  136,  133,  137,  138,  139,  140,  141,  142,
      134,  143,  144,  145,  146,  166,  166,  143,  171,  173,
      174,  175,  176,  130,  133,  166,  178,  177,  130,  130,

      135,  136,  133,  137,  138,  139,  140,  141,  142,  177,
      143,  144,  145,  146,  179,  180,  143,  171,  173,  174,
      175,  176,  181,  182,  166,  178,  177,  183,  184,  185,
      186,  187,  188,  189,  190,  191,  192,  189,  177,  193,
      194,  196,  197,  179,  180,  198,  199,  200,  201,  202,
      203,  181,  182,  204,  205,  206,  183,  184,  185,  186,
      187,  188,  189,  190,  191,  192,  189,  207,  193,  194,
      196,  197,  208,  209,  198,  199,  200,  201,  202,  203,
      210,  211,  204,  205,  206,  212,  214,  215,  216,  217,
      218,  211,  220,  222,  223,  224,  207,  225,  226,  227,

      228,  208,  209,  229,  230,  231,  232,  234,  236,  210,
      211,  237,  238,  239,  212,  214,  215,  216,  217,  218,
      211,  220,  222,  223,  224,  240,  225,  226,  227,  228,
      241,  242,  229,  230,  231,  232,  234,  236,  243,  244,
      237,  238,  239,  245,  246,  247,  248,  249,  253,  247,
      254,  255,  256,  257,  240,  258,  259,  261,  262,  241,
      242,  263,  264,  266,  267,  268,  269,  243,  244,  270,
      271,  272,  245,  246,  247,  248,  249,  253,  247,  254,
      255,  256,  257,  273,  258,  259,  261,  262,  274,  275,
      263,  264,  266,  267,  268,  269,  278,  279,  270,  271,

      272,  280,  281,  282,  283,  284,  287,  289,  290,  291,
      292,  293,  273,  299,  301,  302,  303,  274,  275,  304,
      305,  306,  293,  308,  310,  278,  279,  311,  312,  313,
      280,  281,  282,  283,  284,  287,  289,  290,  291,  292,
      293,  314,  299,  301,  302,  303,  315,  316,  304,  305,
      306,  293,  308,  310,  318,  320,  311,  312,  313,  321,
      322,  323,  324,  325,  327,  329,  333,  334,  335,  336,
      314,  337,  338,  339,  337,  315,  316,  341,  342,  343,
      344,  345,  346,  318,  320,  347,  348,  349,  321,  322,
      323,  324,  325,  327,  329,  333,  334,  335,  336,  350,

      337,  338,  339,  337,  351,  352,  341,  342,  343,  344,
      345,  346,  353,  354,  347,  348,  349,  355,  359,  361,
      364,  365,  366,  371,  372,  373,  375,  376,  350,  378,
      379,  380,  382,  351,  352,  383,  384,  385,  387,  388,
      390,  353,  354,  391,  392,  394,  355,  359,  361,  364,
      365,  366,  371,  372,  373,  375,  376,  395,  378,  379,
      380,  382,  396,  397,  383,  384,  385,  387,  388,  390,
      398,  400,  391,  392,  394,  402,  403,  404,  405,  407,
      408,  409,  413,  414,  417,  418,  395,  419,  420,  421,
      422,  396,  397,  424,  426,  427,  428,  432,  433,  398,

      400,  434,  436,  437,  402,  403,  404,  405,  407,  408,
      409,  413,  414,  417,  418,  438,  419,  420,  421,  422,
      439,  440,  424,  426,  427,  428,  432,  433,  441,  443,
      434,  436,  437,  446,  447,  448,  449,  453,  454,  457,
      458,  459,  460,  461,  438,  463,  464,  465,  466,  439,
      440,  467,  468,  469,  470,  472,  473,  441,  443,  475,
      477,  478,  446,  447,  448,  449,  453,  454,  457,  458,
      459,  460,  461,  479,  463,  464,  465,  466,  481,  482,
      467,  468,  469,  470,  472,  473,  483,  485,  475,  477,
      478,  486,  487,  488,  490,  492,  493,  494,  495,  496,

      498,  501,  479,  502,  503,  506,  509,  481,  482,  510,
      511,  514,  515,  517,  518,  483,  485,  519,  520,  521,
      486,  487,  488,  490,  492,  493,  494,  495,  496,  498,
      501,  523,  502,  503,  506,  509,    0,    0,  510,  511,
      514,  515,  517,  518,    0,    0,  519,  520,  521,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
      523,  527,  527,  527,  527,  527,  527,  527,  527,  527,
      527,  528,  528,  528,  528,  528,  528,  528,  528,  528,
      528,  529,  529,  529,  529,  529,  529,  529,  529,  529,
      529,  530,  530,  530,  530,  530,  530,  530,  530,  530,

      530,  531,  531,  531,  531,  531,  531,  531,  531,  531,
      531,  532,  532,  533,  533,  533,    0,  533,  534,  534,
      534,  534,  535,  535,  535,    0,  535,  535,  535,  535,
      535,  535,  536,  536,  536,    0,  536,  536,  536,  536,
        0,  536,  537,  537,  537,  537,  537,  537,  537,  537,
      537,  537,  538,  538,    0,  538,  538,  538,  538,  538,
      538,  538,  539,    0,  539,  539,  539,  539,  539,  539,
      539,  539,  540,  540,  541,  541,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,

      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526,  526,  526,
      526,  526,  526,  526,  526,  526,  526,  526
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[145] =
    {   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, 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 1037 "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 1328 "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 >= 527 )
					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 != 526 );
		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_DECIMAL;
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 195 "../SqlLexer.lpp"
return TOKEN_DEFAULT;
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 196 "../SqlLexer.lpp"
return TOKEN_DELETE;
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 197 "../SqlLexer.lpp"
return TOKEN_DELIMITER;
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 198 "../SqlLexer.lpp"
return TOKEN_DESC;
	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_DISTINCT;
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 201 "../SqlLexer.lpp"
return TOKEN_DOUBLE;
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 202 "../SqlLexer.lpp"
return TOKEN_DROP;
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 203 "../SqlLexer.lpp"
return TOKEN_ELSE;
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 204 "../SqlLexer.lpp"
return TOKEN_END;
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 205 "../SqlLexer.lpp"
return TOKEN_ESCAPE_STRINGS;
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 206 "../SqlLexer.lpp"
return TOKEN_EXISTS;
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 207 "../SqlLexer.lpp"
return TOKEN_EXTRACT;
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 208 "../SqlLexer.lpp"
return TOKEN_FALSE;
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 209 "../SqlLexer.lpp"
return TOKEN_FIRST;
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 210 "../SqlLexer.lpp"
return TOKEN_FLOAT;
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 211 "../SqlLexer.lpp"
return TOKEN_FOREIGN;
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 212 "../SqlLexer.lpp"
return TOKEN_FROM;
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 213 "../SqlLexer.lpp"
return TOKEN_FULL;
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 214 "../SqlLexer.lpp"
return TOKEN_GROUP;
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 215 "../SqlLexer.lpp"
return TOKEN_HASH;
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 216 "../SqlLexer.lpp"
return TOKEN_HAVING;
	YY_BREAK
case 55:
YY_RULE_SETUP
#line 217 "../SqlLexer.lpp"
return TOKEN_IN;
	YY_BREAK
case 56:
YY_RULE_SETUP
#line 218 "../SqlLexer.lpp"
return TOKEN_INDEX;
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 219 "../SqlLexer.lpp"
return TOKEN_INNER;
	YY_BREAK
case 58:
YY_RULE_SETUP
#line 220 "../SqlLexer.lpp"
return TOKEN_INSERT;
	YY_BREAK
case 59:
YY_RULE_SETUP
#line 221 "../SqlLexer.lpp"
return TOKEN_INTEGER;
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 222 "../SqlLexer.lpp"
return TOKEN_INTEGER;
	YY_BREAK
case 61:
YY_RULE_SETUP
#line 223 "../SqlLexer.lpp"
return TOKEN_INTERVAL;
	YY_BREAK
case 62:
YY_RULE_SETUP
#line 224 "../SqlLexer.lpp"
return TOKEN_INTO;
	YY_BREAK
case 63:
YY_RULE_SETUP
#line 225 "../SqlLexer.lpp"
return TOKEN_IS;
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 226 "../SqlLexer.lpp"
return TOKEN_JOIN;
	YY_BREAK
case 65:
YY_RULE_SETUP
#line 227 "../SqlLexer.lpp"
return TOKEN_KEY;
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 228 "../SqlLexer.lpp"
return TOKEN_LAST;
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 229 "../SqlLexer.lpp"
return TOKEN_LEFT;
	YY_BREAK
case 68:
YY_RULE_SETUP
#line 230 "../SqlLexer.lpp"
return TOKEN_LIKE;
	YY_BREAK
case 69:
YY_RULE_SETUP
#line 231 "../SqlLexer.lpp"
return TOKEN_LIMIT;
	YY_BREAK
case 70:
YY_RULE_SETUP
#line 232 "../SqlLexer.lpp"
return TOKEN_LONG;
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 233 "../SqlLexer.lpp"
return TOKEN_NOT;
	YY_BREAK
case 72:
YY_RULE_SETUP
#line 234 "../SqlLexer.lpp"
return TOKEN_NULL;
	YY_BREAK
case 73:
YY_RULE_SETUP
#line 235 "../SqlLexer.lpp"
return TOKEN_NULLS;
	YY_BREAK
case 74:
YY_RULE_SETUP
#line 236 "../SqlLexer.lpp"
return TOKEN_OFF;
	YY_BREAK
case 75:
YY_RULE_SETUP
#line 237 "../SqlLexer.lpp"
return TOKEN_ON;
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 238 "../SqlLexer.lpp"
return TOKEN_OR;
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 239 "../SqlLexer.lpp"
return TOKEN_ORDER;
	YY_BREAK
case 78:
YY_RULE_SETUP
#line 240 "../SqlLexer.lpp"
return TOKEN_OUTER;
	YY_BREAK
case 79:
YY_RULE_SETUP
#line 241 "../SqlLexer.lpp"
return TOKEN_PARTITION;
	YY_BREAK
case 80:
YY_RULE_SETUP
#line 242 "../SqlLexer.lpp"
return TOKEN_PARTITIONS;
	YY_BREAK
case 81:
YY_RULE_SETUP
#line 243 "../SqlLexer.lpp"
return TOKEN_PERCENT;
	YY_BREAK
case 82:
YY_RULE_SETUP
#line 244 "../SqlLexer.lpp"
return TOKEN_PRIMARY;
	YY_BREAK
case 83:
YY_RULE_SETUP
#line 245 "../SqlLexer.lpp"
return TOKEN_QUIT;
	YY_BREAK
case 84:
YY_RULE_SETUP
#line 246 "../SqlLexer.lpp"
return TOKEN_RANGE;
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 247 "../SqlLexer.lpp"
return TOKEN_REAL;
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 248 "../SqlLexer.lpp"
return TOKEN_REFERENCES;
	YY_BREAK
case 87:
YY_RULE_SETUP
#line 249 "../SqlLexer.lpp"
return TOKEN_REGEXP;
	YY_BREAK
case 88:
YY_RULE_SETUP
#line 250 "../SqlLexer.lpp"
return TOKEN_RIGHT;
	YY_BREAK
case 89:
YY_RULE_SETUP
#line 251 "../SqlLexer.lpp"
return TOKEN_ROW_DELIMITER;
	YY_BREAK
case 90:
YY_RULE_SETUP
#line 252 "../SqlLexer.lpp"
return TOKEN_SELECT;
	YY_BREAK
case 91:
YY_RULE_SETUP
#line 253 "../SqlLexer.lpp"
return TOKEN_SET;
	YY_BREAK
case 92:
YY_RULE_SETUP
#line 254 "../SqlLexer.lpp"
return TOKEN_SMA;
	YY_BREAK
case 93:
YY_RULE_SETUP
#line 255 "../SqlLexer.lpp"
return TOKEN_SMALLINT;
	YY_BREAK
case 94:
YY_RULE_SETUP
#line 256 "../SqlLexer.lpp"
return TOKEN_TABLE;
	YY_BREAK
case 95:
YY_RULE_SETUP
#line 257 "../SqlLexer.lpp"
return TOKEN_THEN;
	YY_BREAK
case 96:
YY_RULE_SETUP
#line 258 "../SqlLexer.lpp"
return TOKEN_TIME;
	YY_BREAK
case 97:
YY_RULE_SETUP
#line 259 "../SqlLexer.lpp"
return TOKEN_TIMESTAMP;
	YY_BREAK
case 98:
YY_RULE_SETUP
#line 260 "../SqlLexer.lpp"
return TOKEN_TRUE;
	YY_BREAK
case 99:
YY_RULE_SETUP
#line 261 "../SqlLexer.lpp"
return TOKEN_TUPLESAMPLE;
	YY_BREAK
case 100:
YY_RULE_SETUP
#line 262 "../SqlLexer.lpp"
return TOKEN_UNIQUE;
	YY_BREAK
case 101:
YY_RULE_SETUP
#line 263 "../SqlLexer.lpp"
return TOKEN_UPDATE;
	YY_BREAK
case 102:
YY_RULE_SETUP
#line 264 "../SqlLexer.lpp"
return TOKEN_USING;
	YY_BREAK
case 103:
YY_RULE_SETUP
#line 265 "../SqlLexer.lpp"
return TOKEN_VALUES;
	YY_BREAK
case 104:
YY_RULE_SETUP
#line 266 "../SqlLexer.lpp"
return TOKEN_VARCHAR;
	YY_BREAK
case 105:
YY_RULE_SETUP
#line 267 "../SqlLexer.lpp"
return TOKEN_WHEN;
	YY_BREAK
case 106:
YY_RULE_SETUP
#line 268 "../SqlLexer.lpp"
return TOKEN_WHERE;
	YY_BREAK
case 107:
YY_RULE_SETUP
#line 269 "../SqlLexer.lpp"
return TOKEN_WITH;
	YY_BREAK
case 108:
YY_RULE_SETUP
#line 270 "../SqlLexer.lpp"
return TOKEN_YEARMONTH;
	YY_BREAK
case 109:
YY_RULE_SETUP
#line 272 "../SqlLexer.lpp"
return TOKEN_EQ;
	YY_BREAK
case 110:
YY_RULE_SETUP
#line 273 "../SqlLexer.lpp"
return TOKEN_NEQ;
	YY_BREAK
case 111:
YY_RULE_SETUP
#line 274 "../SqlLexer.lpp"
return TOKEN_NEQ;
	YY_BREAK
case 112:
YY_RULE_SETUP
#line 275 "../SqlLexer.lpp"
return TOKEN_LT;
	YY_BREAK
case 113:
YY_RULE_SETUP
#line 276 "../SqlLexer.lpp"
return TOKEN_GT;
	YY_BREAK
case 114:
YY_RULE_SETUP
#line 277 "../SqlLexer.lpp"
return TOKEN_LEQ;
	YY_BREAK
case 115:
YY_RULE_SETUP
#line 278 "../SqlLexer.lpp"
return TOKEN_GEQ;
	YY_BREAK
case 116:
YY_RULE_SETUP
#line 280 "../SqlLexer.lpp"
return yytext[0];
	YY_BREAK
case 117:
YY_RULE_SETUP
#line 281 "../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 118:
YY_RULE_SETUP
#line 287 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_SINGLE_QUOTED_ESCAPED);
  }
	YY_BREAK
case 119:
YY_RULE_SETUP
#line 292 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
    BEGIN(CONDITION_STRING_SINGLE_QUOTED);
  }
	YY_BREAK
case 120:
YY_RULE_SETUP
#line 297 "../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 306 "../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 121:
YY_RULE_SETUP
#line 316 "../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 122:
YY_RULE_SETUP
#line 328 "../SqlLexer.lpp"
{
    /* Hexadecimal code */
    unsigned int code;
    std::sscanf(yytext + 2, "%x", &code);
    yylval->string_value_->push_back(code);
  }
	YY_BREAK
case 123:
YY_RULE_SETUP
#line 334 "../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 124:
YY_RULE_SETUP
#line 341 "../SqlLexer.lpp"
{
    /* Backspace */
    yylval->string_value_->push_back('\b');
  }
	YY_BREAK
case 125:
YY_RULE_SETUP
#line 345 "../SqlLexer.lpp"
{
    /* Form-feed */
    yylval->string_value_->push_back('\f');
  }
	YY_BREAK
case 126:
YY_RULE_SETUP
#line 349 "../SqlLexer.lpp"
{
    /* Newline */
    yylval->string_value_->push_back('\n');
  }
	YY_BREAK
case 127:
YY_RULE_SETUP
#line 353 "../SqlLexer.lpp"
{
    /* Carriage-return */
    yylval->string_value_->push_back('\r');
  }
	YY_BREAK
case 128:
YY_RULE_SETUP
#line 357 "../SqlLexer.lpp"
{
    /* Horizontal Tab */
    yylval->string_value_->push_back('\t');
  }
	YY_BREAK
case 129:
/* rule 129 can match eol */
YY_RULE_SETUP
#line 361 "../SqlLexer.lpp"
{
    /* Any other character (including actual newline or carriage return) */
    yylval->string_value_->push_back(yytext[1]);
  }
	YY_BREAK
case 130:
YY_RULE_SETUP
#line 365 "../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 131:
YY_RULE_SETUP
#line 375 "../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 132:
YY_RULE_SETUP
#line 379 "../SqlLexer.lpp"
{
    /* End string */
    BEGIN(CONDITION_SQL);
    return TOKEN_STRING_SINGLE_QUOTED;
  }
	YY_BREAK


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

case 135:
/* rule 135 can match eol */
YY_RULE_SETUP
#line 398 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 136:
/* rule 136 can match eol */
YY_RULE_SETUP
#line 403 "../SqlLexer.lpp"
{
  /* Scan up to a quote or escape sequence. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK
case 137:
/* rule 137 can match eol */
YY_RULE_SETUP
#line 408 "../SqlLexer.lpp"
{
  /* Scan up to a quote. */
  yylval->string_value_->append(yytext, yyleng);
}
	YY_BREAK

case 138:
YY_RULE_SETUP
#line 414 "../SqlLexer.lpp"
{
    yylval->string_value_ = new quickstep::ParseString(
        yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
    return TOKEN_NAME;
  }
	YY_BREAK
case 139:
YY_RULE_SETUP
#line 420 "../SqlLexer.lpp"
{
    yylval->numeric_literal_value_ = new quickstep::NumericParseLiteralValue(
        yylloc->first_line, yylloc->first_column, yytext);
    return TOKEN_UNSIGNED_NUMVAL;
  }
	YY_BREAK
case 140:
YY_RULE_SETUP
#line 426 "../SqlLexer.lpp"
/* comment */
	YY_BREAK
case 141:
/* rule 141 can match eol */
YY_RULE_SETUP
#line 428 "../SqlLexer.lpp"
{ yycolumn = 0; }
	YY_BREAK
case 142:
YY_RULE_SETUP
#line 430 "../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 434 "../SqlLexer.lpp"
{
  /* All conditions except for mutli-state string extracting conditions. */
  BEGIN(INITIAL);
  return TOKEN_EOF;
}
	YY_BREAK
case 143:
YY_RULE_SETUP
#line 440 "../SqlLexer.lpp"
{
  BEGIN(INITIAL);
  quickstep_yyerror(NULL, yyscanner, NULL, "illegal character");
  return TOKEN_LEX_ERROR;
}
	YY_BREAK
case 144:
YY_RULE_SETUP
#line 446 "../SqlLexer.lpp"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 2275 "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 >= 527 )
				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 >= 527 )
			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 == 526);

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



