#line 1 "sqlscan.c"

#line 3 "sqlscan.c"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define yy_create_buffer orafce_sql_yy_create_buffer
#define yy_delete_buffer orafce_sql_yy_delete_buffer
#define yy_scan_buffer orafce_sql_yy_scan_buffer
#define yy_scan_string orafce_sql_yy_scan_string
#define yy_scan_bytes orafce_sql_yy_scan_bytes
#define yy_init_buffer orafce_sql_yy_init_buffer
#define yy_flush_buffer orafce_sql_yy_flush_buffer
#define yy_load_buffer_state orafce_sql_yy_load_buffer_state
#define yy_switch_to_buffer orafce_sql_yy_switch_to_buffer
#define yypush_buffer_state orafce_sql_yypush_buffer_state
#define yypop_buffer_state orafce_sql_yypop_buffer_state
#define yyensure_buffer_stack orafce_sql_yyensure_buffer_stack
#define yy_flex_debug orafce_sql_yy_flex_debug
#define yyin orafce_sql_yyin
#define yyleng orafce_sql_yyleng
#define yylex orafce_sql_yylex
#define yylineno orafce_sql_yylineno
#define yyout orafce_sql_yyout
#define yyrestart orafce_sql_yyrestart
#define yytext orafce_sql_yytext
#define yywrap orafce_sql_yywrap
#define yyalloc orafce_sql_yyalloc
#define yyrealloc orafce_sql_yyrealloc
#define yyfree orafce_sql_yyfree

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 6
#define YY_FLEX_SUBMINOR_VERSION 4
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

#ifdef yy_create_buffer
#define orafce_sql_yy_create_buffer_ALREADY_DEFINED
#else
#define yy_create_buffer orafce_sql_yy_create_buffer
#endif

#ifdef yy_delete_buffer
#define orafce_sql_yy_delete_buffer_ALREADY_DEFINED
#else
#define yy_delete_buffer orafce_sql_yy_delete_buffer
#endif

#ifdef yy_scan_buffer
#define orafce_sql_yy_scan_buffer_ALREADY_DEFINED
#else
#define yy_scan_buffer orafce_sql_yy_scan_buffer
#endif

#ifdef yy_scan_string
#define orafce_sql_yy_scan_string_ALREADY_DEFINED
#else
#define yy_scan_string orafce_sql_yy_scan_string
#endif

#ifdef yy_scan_bytes
#define orafce_sql_yy_scan_bytes_ALREADY_DEFINED
#else
#define yy_scan_bytes orafce_sql_yy_scan_bytes
#endif

#ifdef yy_init_buffer
#define orafce_sql_yy_init_buffer_ALREADY_DEFINED
#else
#define yy_init_buffer orafce_sql_yy_init_buffer
#endif

#ifdef yy_flush_buffer
#define orafce_sql_yy_flush_buffer_ALREADY_DEFINED
#else
#define yy_flush_buffer orafce_sql_yy_flush_buffer
#endif

#ifdef yy_load_buffer_state
#define orafce_sql_yy_load_buffer_state_ALREADY_DEFINED
#else
#define yy_load_buffer_state orafce_sql_yy_load_buffer_state
#endif

#ifdef yy_switch_to_buffer
#define orafce_sql_yy_switch_to_buffer_ALREADY_DEFINED
#else
#define yy_switch_to_buffer orafce_sql_yy_switch_to_buffer
#endif

#ifdef yypush_buffer_state
#define orafce_sql_yypush_buffer_state_ALREADY_DEFINED
#else
#define yypush_buffer_state orafce_sql_yypush_buffer_state
#endif

#ifdef yypop_buffer_state
#define orafce_sql_yypop_buffer_state_ALREADY_DEFINED
#else
#define yypop_buffer_state orafce_sql_yypop_buffer_state
#endif

#ifdef yyensure_buffer_stack
#define orafce_sql_yyensure_buffer_stack_ALREADY_DEFINED
#else
#define yyensure_buffer_stack orafce_sql_yyensure_buffer_stack
#endif

#ifdef yylex
#define orafce_sql_yylex_ALREADY_DEFINED
#else
#define yylex orafce_sql_yylex
#endif

#ifdef yyrestart
#define orafce_sql_yyrestart_ALREADY_DEFINED
#else
#define yyrestart orafce_sql_yyrestart
#endif

#ifdef yylex_init
#define orafce_sql_yylex_init_ALREADY_DEFINED
#else
#define yylex_init orafce_sql_yylex_init
#endif

#ifdef yylex_init_extra
#define orafce_sql_yylex_init_extra_ALREADY_DEFINED
#else
#define yylex_init_extra orafce_sql_yylex_init_extra
#endif

#ifdef yylex_destroy
#define orafce_sql_yylex_destroy_ALREADY_DEFINED
#else
#define yylex_destroy orafce_sql_yylex_destroy
#endif

#ifdef yyget_debug
#define orafce_sql_yyget_debug_ALREADY_DEFINED
#else
#define yyget_debug orafce_sql_yyget_debug
#endif

#ifdef yyset_debug
#define orafce_sql_yyset_debug_ALREADY_DEFINED
#else
#define yyset_debug orafce_sql_yyset_debug
#endif

#ifdef yyget_extra
#define orafce_sql_yyget_extra_ALREADY_DEFINED
#else
#define yyget_extra orafce_sql_yyget_extra
#endif

#ifdef yyset_extra
#define orafce_sql_yyset_extra_ALREADY_DEFINED
#else
#define yyset_extra orafce_sql_yyset_extra
#endif

#ifdef yyget_in
#define orafce_sql_yyget_in_ALREADY_DEFINED
#else
#define yyget_in orafce_sql_yyget_in
#endif

#ifdef yyset_in
#define orafce_sql_yyset_in_ALREADY_DEFINED
#else
#define yyset_in orafce_sql_yyset_in
#endif

#ifdef yyget_out
#define orafce_sql_yyget_out_ALREADY_DEFINED
#else
#define yyget_out orafce_sql_yyget_out
#endif

#ifdef yyset_out
#define orafce_sql_yyset_out_ALREADY_DEFINED
#else
#define yyset_out orafce_sql_yyset_out
#endif

#ifdef yyget_leng
#define orafce_sql_yyget_leng_ALREADY_DEFINED
#else
#define yyget_leng orafce_sql_yyget_leng
#endif

#ifdef yyget_text
#define orafce_sql_yyget_text_ALREADY_DEFINED
#else
#define yyget_text orafce_sql_yyget_text
#endif

#ifdef yyget_lineno
#define orafce_sql_yyget_lineno_ALREADY_DEFINED
#else
#define yyget_lineno orafce_sql_yyget_lineno
#endif

#ifdef yyset_lineno
#define orafce_sql_yyset_lineno_ALREADY_DEFINED
#else
#define yyset_lineno orafce_sql_yyset_lineno
#endif

#ifdef yywrap
#define orafce_sql_yywrap_ALREADY_DEFINED
#else
#define yywrap orafce_sql_yywrap
#endif

#ifdef yyalloc
#define orafce_sql_yyalloc_ALREADY_DEFINED
#else
#define yyalloc orafce_sql_yyalloc
#endif

#ifdef yyrealloc
#define orafce_sql_yyrealloc_ALREADY_DEFINED
#else
#define yyrealloc orafce_sql_yyrealloc
#endif

#ifdef yyfree
#define orafce_sql_yyfree_ALREADY_DEFINED
#else
#define yyfree orafce_sql_yyfree
#endif

#ifdef yytext
#define orafce_sql_yytext_ALREADY_DEFINED
#else
#define yytext orafce_sql_yytext
#endif

#ifdef yyleng
#define orafce_sql_yyleng_ALREADY_DEFINED
#else
#define yyleng orafce_sql_yyleng
#endif

#ifdef yyin
#define orafce_sql_yyin_ALREADY_DEFINED
#else
#define yyin orafce_sql_yyin
#endif

#ifdef yyout
#define orafce_sql_yyout_ALREADY_DEFINED
#else
#define yyout orafce_sql_yyout
#endif

#ifdef yy_flex_debug
#define orafce_sql_yy_flex_debug_ALREADY_DEFINED
#else
#define yy_flex_debug orafce_sql_yy_flex_debug
#endif

#ifdef yylineno
#define orafce_sql_yylineno_ALREADY_DEFINED
#else
#define yylineno orafce_sql_yylineno
#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

#ifndef SIZE_MAX
#define SIZE_MAX               (~(size_t)0)
#endif

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

/* begin standard C++ headers. */

/* TODO: this is always defined, so inline it */
#define yyconst const

#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yynoreturn
#endif

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

/* Promotes a possibly negative, possibly signed char to an
 *   integer in range [0..255] for use as an array index.
 */
#define YY_SC_TO_UI(c) ((YY_CHAR) (c))

/* 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 (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 (((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 yyrestart( yyin  )
#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

extern int yyleng;

extern FILE *yyin, *yyout;

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2
    
    #define YY_LESS_LINENO(n)
    #define YY_LINENO_REWIND_TO(ptr)
    
/* 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 = (yy_hold_char); \
		YY_RESTORE_YY_MORE_OFFSET \
		(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, (yytext_ptr)  )

#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.
	 */
	int yy_buf_size;

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	int 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 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 */

/* Stack of input buffers. */
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */

/* 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 ( (yy_buffer_stack) \
                          ? (yy_buffer_stack)[(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 (yy_buffer_stack)[(yy_buffer_stack_top)]

/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;
static int yy_n_chars;		/* number of characters read into yy_ch_buf */
int yyleng;

/* Points to current character in buffer. */
static char *yy_c_buf_p = NULL;
static int yy_init = 0;		/* whether we need to initialize */
static int yy_start = 0;	/* start state number */

/* Flag which is used to allow yywrap()'s to do buffer switches
 * instead of setting up a fresh yyin.  A bit of a hack ...
 */
static int yy_did_buffer_switch_on_eof;

void yyrestart ( FILE *input_file  );
void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size  );
void yy_delete_buffer ( YY_BUFFER_STATE b  );
void yy_flush_buffer ( YY_BUFFER_STATE b  );
void yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
void yypop_buffer_state ( void );

static void yyensure_buffer_stack ( void );
static void yy_load_buffer_state ( void );
static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )

YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size  );
YY_BUFFER_STATE yy_scan_string ( const char *yy_str  );
YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len  );

void *yyalloc ( yy_size_t  );
void *yyrealloc ( void *, yy_size_t  );
void yyfree ( void *  );

#define yy_new_buffer yy_create_buffer
#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}
#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

#define orafce_sql_yywrap() (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
typedef flex_uint8_t YY_CHAR;

FILE *yyin = NULL, *yyout = NULL;

typedef int yy_state_type;

extern int yylineno;
int yylineno = 1;

extern char *yytext;
#ifdef yytext_ptr
#undef yytext_ptr
#endif
#define yytext_ptr yytext

static yy_state_type yy_get_previous_state ( void );
static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
static int yy_get_next_buffer ( void );
static void yynoreturn yy_fatal_error ( const char* msg  );

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
	(yytext_ptr) = yy_bp; \
	yyleng = (int) (yy_cp - yy_bp); \
	(yy_hold_char) = *yy_cp; \
	*yy_cp = '\0'; \
	(yy_c_buf_p) = yy_cp;
#define YY_NUM_RULES 53
#define YY_END_OF_BUFFER 54
/* 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 const flex_int16_t yy_accept[155] =
    {   0,
        0,    0,   13,   13,    0,    0,    0,    0,   12,   12,
        0,    0,    0,    0,    0,    0,   54,   52,    1,    1,
       44,   38,   52,   43,   20,   43,   43,   43,   43,   46,
       43,   51,   51,   51,   51,   51,   13,   10,    6,    6,
        7,    7,   41,   39,   12,   17,   26,   26,   22,   31,
       25,   22,   35,   35,   37,    1,   44,   32,   45,   33,
        2,   47,    3,   47,   46,   49,   42,   51,    9,   21,
       19,   16,   13,   10,   10,   11,    6,    8,    5,    4,
       41,   40,   12,   17,   17,   18,   26,   22,   22,   24,
       23,   27,   28,   27,   25,   35,   34,   36,   33,    2,

        2,    3,   47,   50,   48,   10,   15,   11,    0,    4,
       17,   14,   18,    0,   22,   30,   23,    0,   28,   29,
       36,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,   28,   29,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0
    } ;

static const YY_CHAR yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        1,    2,    4,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    5,    6,    5,    7,    8,    5,    9,   10,
       10,   11,   12,   10,   13,   14,   15,   16,   16,   16,
       16,   16,   16,   16,   16,   17,   17,   18,   10,    8,
        8,    8,    5,    5,   19,   20,   19,   19,   21,   19,
       22,   22,   22,   22,   22,   22,   22,   23,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   24,   22,   22,
       10,   25,   10,    8,   22,    5,   19,   20,   19,   19,

       21,   19,   22,   22,   22,   22,   22,   22,   22,   23,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   26,
       22,   22,    1,    5,    1,    5,    1,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,

       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22
    } ;

static const YY_CHAR yy_meta[27] =
    {   0,
        1,    2,    3,    3,    4,    5,    6,    4,    7,    1,
        8,    4,    9,    1,    8,   10,   10,    1,   11,   11,
       11,   12,   12,   12,   13,   12
    } ;

static const flex_int16_t yy_base[193] =
    {   0,
        0,    0,  201,  200,   22,   33,  202,  201,  197,  196,
       33,   40,  195,  190,   25,   44,  198,  711,   50,   53,
        0,  711,   43,    0,  711,  711,  184,   23,  185,   52,
      177,    0,  185,  184,  183,  178,    0,   72,    0,    0,
       52,  175,    0,  179,    0,   84,    0,    0,   96,   45,
        0,    0,    0,    0,  177,   75,    0,  711,   64,  176,
      105,   73,    0,   75,    0,  109,  711,    0,  711,  711,
      711,  711,    0,    0,   93,  169,    0,   92,  711,    0,
        0,  711,    0,    0,   95,  116,    0,  110,  102,  711,
      101,  711,   96,    0,    0,    0,  711,   94,   88,    0,

      122,    0,  107,   66,  115,  127,  711,   80,  139,    0,
      135,  711,   71,  151,  136,  711,   59,  163,   54,    0,
       57,  135,  175,  187,  137,  199,  153,  211,  223,  138,
      235,  155,  247,  259,  159,  271,  711,  711,  157,  160,
        0,   49,  283,  159,  161,    0,   18,  295,  177,  162,
        0,   16,  307,  711,  320,  333,  346,  359,  372,  385,
      398,  408,  412,  419,  431,  444,  457,  470,  483,  495,
      508,  521,  529,  536,  548,  558,  566,  572,  580,  588,
      588,  594,  606,  619,  632,  636,  647,  659,  668,  680,
      689,  701

    } ;

static const flex_int16_t yy_def[193] =
    {   0,
      154,    1,  155,  155,  156,  156,  157,  157,  158,  158,
      159,  159,  160,  160,  161,  161,  154,  154,  154,  154,
      162,  154,  163,  162,  154,  154,  162,  154,  162,  154,
      154,  164,  164,  164,  164,  164,  165,  154,  166,  166,
      154,  154,  167,  154,  168,  154,  169,  169,  154,  170,
      171,   49,  172,  172,  173,  154,  162,  154,  154,  174,
      175,  154,  176,  154,   30,  154,  154,  164,  154,  154,
      154,  154,  165,   38,  177,  154,  166,  154,  154,  178,
      167,  154,  168,   46,  179,  154,  169,   49,  180,  154,
      154,  154,  154,  181,  171,  172,  154,  182,  174,  175,

      175,  176,  154,  154,  154,  177,  154,  154,  183,  178,
      179,  154,  154,  184,  180,  154,  154,  185,  154,  186,
      182,  187,  183,  183,  188,  183,  189,  184,  184,  190,
      184,  191,  185,  185,  192,  185,  154,  154,  187,  188,
      140,  154,  183,  189,  190,  145,  154,  184,  191,  192,
      150,  154,  185,    0,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154

    } ;

static const flex_int16_t yy_nxt[738] =
    {   0,
       18,   19,   20,   19,   21,   22,   23,   24,   25,   26,
       24,   24,   27,   28,   29,   30,   30,   31,   32,   33,
       34,   32,   35,   36,   18,   36,   40,   54,  132,   40,
      127,   55,   41,   40,   40,   48,   42,   40,   62,   62,
       40,   49,   48,   41,   40,   40,   54,   42,   49,   58,
       55,   56,   56,   56,   56,   56,   56,   50,   59,   59,
       93,  122,   78,   97,   50,   64,   79,   65,   65,  137,
       94,  132,   66,   74,   75,   75,   56,   56,   56,   59,
       59,  105,  105,  127,   76,   84,   85,   85,   62,   62,
      103,  103,  122,   66,   58,   66,   86,   88,   89,   89,

       97,  107,   78,  112,   90,  108,   79,  113,   91,  101,
      116,  119,  101,  118,  117,  101,  101,  101,  154,  101,
      104,  104,  103,  103,  105,  105,  101,   66,  114,  101,
      105,  105,  101,  101,  101,  107,  101,  140,  140,  108,
      124,  125,  125,  112,  116,  107,  112,  113,  117,  142,
      147,  126,  129,  130,  130,  145,  145,  150,  150,  140,
      140,  145,  145,  131,  134,  135,  135,  116,  107,  112,
      116,  152,  142,  147,  152,  136,  124,  125,  125,  150,
      150,  109,   58,   97,   82,   80,   72,  126,  124,  125,
      125,   71,   70,   69,   67,   63,   61,  154,   52,  126,

      124,  125,  125,   52,   46,   46,   44,   44,   38,   38,
      154,  143,  129,  130,  130,  154,  154,  154,  154,  154,
      154,  154,  154,  131,  129,  130,  130,  154,  154,  154,
      154,  154,  154,  154,  154,  131,  129,  130,  130,  154,
      154,  154,  154,  154,  154,  154,  154,  148,  134,  135,
      135,  154,  154,  154,  154,  154,  154,  154,  154,  136,
      134,  135,  135,  154,  154,  154,  154,  154,  154,  154,
      154,  136,  134,  135,  135,  154,  154,  154,  154,  154,
      154,  154,  154,  153,  124,  125,  125,  154,  154,  154,
      154,  154,  154,  154,  154,  143,  129,  130,  130,  154,

      154,  154,  154,  154,  154,  154,  154,  148,  134,  135,
      135,  154,  154,  154,  154,  154,  154,  154,  154,  153,
       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
       37,   37,   37,   39,   39,   39,   39,   39,   39,   39,
       39,   39,   39,   39,   39,   39,   43,   43,   43,   43,
       43,   43,   43,   43,   43,   43,   43,   43,   43,   45,
       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
       45,   45,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   51,   51,   51,   51,   51,
       51,   51,   51,   51,   51,   51,   51,   51,   53,   53,

       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
       53,   57,  154,  154,  154,   57,   57,   60,  154,  154,
      154,   60,   60,   60,   68,  154,  154,  154,   68,   68,
       68,   73,   73,   73,   73,   73,   73,  154,   73,   73,
       73,   73,   73,   73,   77,   77,   77,   77,   77,   77,
       77,  154,   77,   77,   77,   77,   77,   81,   81,   81,
       81,  154,   81,   81,   81,   81,   81,   81,   81,   81,
       83,   83,   83,   83,   83,   83,  154,   83,   83,   83,
       83,   83,   83,   87,   87,   87,   87,   87,   87,  154,
       87,   87,   87,   87,   87,   92,   92,   92,   92,   92,

       92,   92,   92,   92,   92,   92,   92,   92,   95,   95,
       95,   95,   95,   95,  154,   95,   95,   95,   95,   95,
       95,   96,   96,   96,   96,   96,  154,   96,   96,   96,
       96,   96,   96,   96,   98,  154,  154,  154,  154,   98,
       98,   99,  154,  154,  154,   99,   99,   99,  100,  100,
      154,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  102,  154,  154,  154,  102,  102,  106,  106,  154,
      154,  154,  106,  154,  106,  110,  154,  154,  154,  110,
      110,  111,  111,  154,  154,  154,  111,  154,  111,  115,
      115,  154,  154,  154,  115,  154,  115,  120,  120,  121,

      154,  154,  154,  121,  121,  121,  123,  123,  123,  123,
      123,  123,  123,  123,  123,  123,  123,  123,  123,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  133,  133,  133,  133,  133,  133,  133,  133,
      133,  133,  133,  133,  133,  138,  138,  139,  139,  139,
      139,  139,  139,  139,  139,  139,  139,  139,  139,  139,
      141,  141,  154,  154,  154,  141,  154,  141,  144,  144,
      144,  144,  144,  144,  144,  144,  144,  144,  144,  144,
      144,  146,  146,  154,  154,  154,  146,  154,  146,  149,
      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,

      149,  149,  151,  151,  154,  154,  154,  151,  154,  151,
       17,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154
    } ;

static const flex_int16_t yy_chk[738] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    5,   15,  152,    5,
      147,   15,    5,    5,    5,   11,    5,    6,   28,   28,
        6,   11,   12,    6,    6,    6,   16,    6,   12,   23,
       16,   19,   19,   19,   20,   20,   20,   11,   23,   23,
       50,  142,   41,  121,   12,   30,   41,   30,   30,  119,
       50,  117,   30,   38,   38,   38,   56,   56,   56,   59,
       59,  104,  104,  113,   38,   46,   46,   46,   62,   62,
       64,   64,  108,   62,   99,   64,   46,   49,   49,   49,

       98,   75,   78,   85,   49,   75,   78,   85,   49,   61,
       89,   93,   61,   91,   89,   61,   61,   61,   88,   61,
       66,   66,  103,  103,   66,   66,  101,  103,   86,  101,
      105,  105,  101,  101,  101,  106,  101,  122,  122,  106,
      109,  109,  109,  111,  115,  125,  130,  111,  115,  125,
      130,  109,  114,  114,  114,  127,  127,  132,  132,  139,
      139,  144,  144,  114,  118,  118,  118,  135,  140,  145,
      150,  135,  140,  145,  150,  118,  123,  123,  123,  149,
      149,   76,   60,   55,   44,   42,   36,  123,  124,  124,
      124,   35,   34,   33,   31,   29,   27,   17,   14,  124,

      126,  126,  126,   13,   10,    9,    8,    7,    4,    3,
        0,  126,  128,  128,  128,    0,    0,    0,    0,    0,
        0,    0,    0,  128,  129,  129,  129,    0,    0,    0,
        0,    0,    0,    0,    0,  129,  131,  131,  131,    0,
        0,    0,    0,    0,    0,    0,    0,  131,  133,  133,
      133,    0,    0,    0,    0,    0,    0,    0,    0,  133,
      134,  134,  134,    0,    0,    0,    0,    0,    0,    0,
        0,  134,  136,  136,  136,    0,    0,    0,    0,    0,
        0,    0,    0,  136,  143,  143,  143,    0,    0,    0,
        0,    0,    0,    0,    0,  143,  148,  148,  148,    0,

        0,    0,    0,    0,    0,    0,    0,  148,  153,  153,
      153,    0,    0,    0,    0,    0,    0,    0,    0,  153,
      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
      155,  155,  155,  156,  156,  156,  156,  156,  156,  156,
      156,  156,  156,  156,  156,  156,  157,  157,  157,  157,
      157,  157,  157,  157,  157,  157,  157,  157,  157,  158,
      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
      158,  158,  159,  159,  159,  159,  159,  159,  159,  159,
      159,  159,  159,  159,  159,  160,  160,  160,  160,  160,
      160,  160,  160,  160,  160,  160,  160,  160,  161,  161,

      161,  161,  161,  161,  161,  161,  161,  161,  161,  161,
      161,  162,    0,    0,    0,  162,  162,  163,    0,    0,
        0,  163,  163,  163,  164,    0,    0,    0,  164,  164,
      164,  165,  165,  165,  165,  165,  165,    0,  165,  165,
      165,  165,  165,  165,  166,  166,  166,  166,  166,  166,
      166,    0,  166,  166,  166,  166,  166,  167,  167,  167,
      167,    0,  167,  167,  167,  167,  167,  167,  167,  167,
      168,  168,  168,  168,  168,  168,    0,  168,  168,  168,
      168,  168,  168,  169,  169,  169,  169,  169,  169,    0,
      169,  169,  169,  169,  169,  170,  170,  170,  170,  170,

      170,  170,  170,  170,  170,  170,  170,  170,  171,  171,
      171,  171,  171,  171,    0,  171,  171,  171,  171,  171,
      171,  172,  172,  172,  172,  172,    0,  172,  172,  172,
      172,  172,  172,  172,  173,    0,    0,    0,    0,  173,
      173,  174,    0,    0,    0,  174,  174,  174,  175,  175,
        0,  175,  175,  175,  175,  175,  175,  175,  175,  175,
      175,  176,    0,    0,    0,  176,  176,  177,  177,    0,
        0,    0,  177,    0,  177,  178,    0,    0,    0,  178,
      178,  179,  179,    0,    0,    0,  179,    0,  179,  180,
      180,    0,    0,    0,  180,    0,  180,  181,  181,  182,

        0,    0,    0,  182,  182,  182,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  185,  185,  185,  185,  185,  185,  185,  185,
      185,  185,  185,  185,  185,  186,  186,  187,  187,  187,
      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
      188,  188,    0,    0,    0,  188,    0,  188,  189,  189,
      189,  189,  189,  189,  189,  189,  189,  189,  189,  189,
      189,  190,  190,    0,    0,    0,  190,    0,  190,  191,
      191,  191,  191,  191,  191,  191,  191,  191,  191,  191,

      191,  191,  192,  192,    0,    0,    0,  192,    0,  192,
      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
      154,  154,  154,  154,  154,  154,  154
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

extern int yy_flex_debug;
int yy_flex_debug = 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
char *yytext;
#line 1 "sqlscan.l"
#line 2 "sqlscan.l"
/* 
** A scanner for EMP-style numeric ranges 
*/

#include "postgres.h"

/* Not needed now that this file is compiled as part of gram.y */
/* #include "parser/parse.h" */
#include "parser/scansup.h"

#if PG_VERSION_NUM >= 130000

#include "port/pg_bitutils.h"

#endif

#include "mb/pg_wchar.h"

#include "parse_keyword.h"

/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
#undef fprintf
#define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)

static void
fprintf_to_ereport(const char *fmt, const char *msg)
{
	ereport(ERROR, (errmsg_internal("%s", msg)));
}

static int		xcdepth = 0;	/* depth of nesting in slash-star comments */
static char    *dolqstart;      /* current $foo$ quote start string */
static bool extended_string = false;


/* No reason to constrain amount of data slurped */
#define YY_READ_BUF_SIZE 16777216

/* Handles to the buffer that the lexer uses internally */


static YY_BUFFER_STATE scanbufhandle;

#define SET_YYLLOC()  (orafce_sql_yylval.val.lloc = yytext - scanbuf)

/* Handles to the buffer that the lexer uses internally */
static char *scanbuf;

/* flex 2.5.4 doesn't bother with a decl for this */

int orafce_sql_yylex(void);

void orafce_sql_scanner_init(const char *str);
void orafce_sql_scanner_finish(void);

/*
 * literalbuf is used to accumulate literal values when multiple rules
 * are needed to parse a single literal.  Call startlit to reset buffer
 * to empty, addlit to add text.  Note that the buffer is palloc'd and
 * starts life afresh on every parse cycle.
 */
static char	   *literalbuf;		/* expandable buffer */
static int		literallen;		/* actual current length */
static int		literalalloc;	/* current allocated buffer size */

#define startlit()  (literalbuf[0] = '\0', literallen = 0)
static void addlit(char *ytext, int yleng);
static void addlitchar(unsigned char ychar);
static char *litbufdup(void);

static int	lexer_errposition(void);

/*
 * Each call to yylex must set yylloc to the location of the found token
 * (expressed as a byte offset from the start of the input text).
 * When we parse a token that requires multiple lexer rules to process,
 * this should be done in the first such rule, else yylloc will point
 * into the middle of the token.
 */

/* Handles to the buffer that the lexer uses internally */
static char *scanbuf;

static unsigned char unescape_single_char(unsigned char c);

#ifndef _pg_mbstrlen_with_len
#define _pg_mbstrlen_with_len(buf,loc) 	pg_mbstrlen_with_len(buf,loc)
#endif

#line 1013 "sqlscan.c"
#define YY_NO_INPUT 1
/*
 * OK, here is a short description of lex/flex rules behavior.
 * The longest pattern which matches an input string is always chosen.
 * For equal-length patterns, the first occurring in the rules list is chosen.
 * INITIAL is the starting state, to which all non-conditional rules apply.
 * Exclusive states change parsing rules while the state is active.  When in
 * an exclusive state, only those rules defined for that state apply.
 *
 * We use exclusive states for quoted strings, extended comments,
 * and to eliminate parsing troubles for numeric strings.
 * Exclusive states:
 *  <xb> bit string literal
 *  <xc> extended C-style comments
 *  <xd> delimited identifiers (double-quoted identifiers)
 *  <xh> hexadecimal numeric string
 *  <xq> standard quoted strings
 *  <xe> extended quoted strings (support backslash escape sequences)
 *  <xdolq> $foo$ quoted strings
 */

/*
 * In order to make the world safe for Windows and Mac clients as well as
 * Unix ones, we accept either \n or \r as a newline.  A DOS-style \r\n
 * sequence will be seen as two successive newlines, but that doesn't cause
 * any problems.  Comments that start with -- and extend to the next
 * newline are treated as equivalent to a single whitespace character.
 *
 * NOTE a fine point: if there is no newline following --, we will absorb
 * everything to the end of the input as a comment.  This is correct.  Older
 * versions of Postgres failed to recognize -- as a comment if the input
 * did not end with a newline.
 *
 * XXX perhaps \f (formfeed) should be treated as a newline as well?
 *
 * XXX if you change the set of whitespace characters, fix scanner_isspace()
 * to agree, and see also the plpgsql lexer.
 */
/*
 * SQL requires at least one newline in the whitespace separating
 * string literals that are to be concatenated.  Silly, but who are we
 * to argue?  Note that {whitespace_with_newline} should not have * after
 * it, whereas {whitespace} should generally have a * after it...
 */
/*
 * To ensure that {quotecontinue} can be scanned without having to back up
 * if the full pattern isn't matched, we include trailing whitespace in
 * {quotestop}.  This matches all cases where {quotecontinue} fails to match,
 * except for {quote} followed by whitespace and just one "-" (not two,
 * which would start a {comment}).  To cover that we have {quotefail}.
 * The actions for {quotestop} and {quotefail} must throw back characters
 * beyond the quote proper.
 */
/* Bit string
 * It is tempting to scan the string for only those characters
 * which are allowed. However, this leads to silently swallowed
 * characters if illegal characters are included in the string.
 * For example, if xbinside is [01] then B'ABCD' is interpreted
 * as a zero-length string, and the ABCD' is lost!
 * Better to pass the string forward and let the input routines
 * validate the contents.
 */
/* Hexadecimal number */
/* National character */
/* Quoted string that allows backslash escapes */
/* Extended quote
 * xqdouble implements embedded quote, ''''
 */
/* $foo$ style quotes ("dollar quoting")
 * The quoted string starts with $foo$ where "foo" is an optional string
 * in the form of an identifier, except that it may not contain "$", 
 * and extends to the first occurrence of an identical string.  
 * There is *no* processing of the quoted text.
 *
 * {dolqfailed} is an error rule to avoid scanner backup when {dolqdelim}
 * fails to match its trailing "$".
 */
/* Double quote
 * Allows embedded spaces and other special characters into identifiers.
 */
/* C-style comments
 *
 * The "extended comment" syntax closely resembles allowable operator syntax.
 * The tricky part here is to get lex to recognize a string starting with
 * slash-star as a comment, when interpreting it as an operator would produce
 * a longer match --- remember lex will prefer a longer match!  Also, if we
 * have something like plus-slash-star, lex will think this is a 3-character
 * operator whereas we want to see it as a + operator and a comment start.
 * The solution is two-fold:
 * 1. append {op_chars}* to xcstart so that it matches as much text as
 *    {operator} would. Then the tie-breaker (first matching rule of same
 *    length) ensures xcstart wins.  We put back the extra stuff with yyless()
 *    in case it contains a star-slash that should terminate the comment.
 * 2. In the operator rule, check for slash-star within the operator, and
 *    if found throw it back with yyless().  This handles the plus-slash-star
 *    problem.
 * Dash-dash comments have similar interactions with the operator rule.
 */
/*
 * "self" is the set of chars that should be returned as single-character
 * tokens.  "op_chars" is the set of chars that can make up "Op" tokens,
 * which can be one or more characters long (but if a single-char token
 * appears in the "self" set, it is not to be returned as an Op).  Note
 * that the sets overlap, but each has some chars that are not in the other.
 *
 * If you change either set, adjust the character lists appearing in the
 * rule for "operator"!
 */
/* we no longer allow unary minus in numbers. 
 * instead we pass it separately to parser. there it gets
 * coerced via doNegate() -- Leon aug 20 1999
 *
 * {realfail1} and {realfail2} are added to prevent the need for scanner
 * backup when the {real} rule fails to match completely.
 */
/*
 * Dollar quoted strings are totally opaque, and no escaping is done on them.
 * Other quoted strings must allow some special characters such as single-quote
 *  and newline.
 * Embedded single-quotes are implemented both in the SQL standard
 *  style of two adjacent single quotes "''" and in the Postgres/Java style
 *  of escaped-quote "\'".
 * Other embedded escaped characters are matched explicitly and the leading
 *  backslash is dropped from the string.
 * Note that xcstart must appear before operator, as explained above!
 *  Also whitespace (comment) must appear before operator.
 */
#line 1141 "sqlscan.c"

#define INITIAL 0
#define xb 1
#define xc 2
#define xd 3
#define xh 4
#define xe 5
#define xq 6
#define xdolq 7

#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

static int yy_init_globals ( void );

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

int yylex_destroy ( void );

int yyget_debug ( void );

void yyset_debug ( int debug_flag  );

YY_EXTRA_TYPE yyget_extra ( void );

void yyset_extra ( YY_EXTRA_TYPE user_defined  );

FILE *yyget_in ( void );

void yyset_in  ( FILE * _in_str  );

FILE *yyget_out ( void );

void yyset_out  ( FILE * _out_str  );

			int yyget_leng ( void );

char *yyget_text ( void );

int yyget_lineno ( void );

void yyset_lineno ( int _line_number  );

/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int yywrap ( void );
#else
extern int yywrap ( void );
#endif
#endif

#ifndef YY_NO_UNPUT
    
#endif

#ifndef yytext_ptr
static void yy_flex_strncpy ( char *, const char *, int );
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen ( const char * );
#endif

#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput ( void );
#else
static int input ( void );
#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, (size_t) 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 = '*'; \
		int 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 = (int) fread(buf, 1, (yy_size_t) 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 )
#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 yylex (void);

#define YY_DECL int yylex (void)
#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;
    
	if ( !(yy_init) )
		{
		(yy_init) = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

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

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

		if ( ! YY_CURRENT_BUFFER ) {
			yyensure_buffer_stack ();
			YY_CURRENT_BUFFER_LVALUE =
				yy_create_buffer( yyin, YY_BUF_SIZE );
		}

		yy_load_buffer_state(  );
		}

	{
#line 314 "sqlscan.l"


#line 1366 "sqlscan.c"

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

		/* Support of yytext. */
		*yy_cp = (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 = (yy_start);
yy_match:
		do
			{
			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
			if ( yy_accept[yy_current_state] )
				{
				(yy_last_accepting_state) = yy_current_state;
				(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 >= 155 )
					yy_c = yy_meta[yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 154 );
		yy_cp = (yy_last_accepting_cpos);
		yy_current_state = (yy_last_accepting_state);

yy_find_action:
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

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 = (yy_hold_char);
			yy_cp = (yy_last_accepting_cpos);
			yy_current_state = (yy_last_accepting_state);
			goto yy_find_action;

case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
#line 316 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = NULL;
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_WHITESPACE;
				}
	YY_BREAK
case 2:
YY_RULE_SETUP
#line 325 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "sc";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_COMMENT;
				}
	YY_BREAK
case 3:
YY_RULE_SETUP
#line 335 "sqlscan.l"
{
					/* Set location in case of syntax error in comment */
					SET_YYLLOC();
					xcdepth = 0;
					BEGIN(xc);
					/* Put back any characters past slash-star; see above */
					startlit();
					addlitchar('/');
					addlitchar('*');
				
					yyless(2);
				}
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 348 "sqlscan.l"
{
					xcdepth++;
					/* Put back any characters past slash-star; see above */
					addlitchar('/');
					addlitchar('*');

					yyless(2);
				}
	YY_BREAK
case 5:
YY_RULE_SETUP
#line 357 "sqlscan.l"
{
					if (xcdepth <= 0)
					{
						BEGIN(INITIAL);
						addlitchar('*');
						addlitchar('/');

						yylval.val.str = litbufdup();
						yylval.val.modificator = "ec";
						yylval.val.keycode = -1;
						yylval.val.sep = NULL;
						return X_COMMENT;
					}
					else
					{
						xcdepth--;
						addlitchar('*');
						addlitchar('/');
					}

				}
	YY_BREAK
case 6:
/* rule 6 can match eol */
YY_RULE_SETUP
#line 379 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 383 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 387 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case YY_STATE_EOF(xc):
#line 391 "sqlscan.l"
{ 
					yylval.val.str = litbufdup();
					yylval.val.modificator = "ecu";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_COMMENT;

				}
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 400 "sqlscan.l"
{
					/* Binary bit type.
					 * At some point we should simply pass the string
					 * forward to the parser and label it there.
					 * In the meantime, place a leading "b" on the string
					 * to mark it for the input routine as a binary string.
					 */
					SET_YYLLOC();
					BEGIN(xb);
					startlit();
					addlitchar('b');
				}
	YY_BREAK
case 10:
/* rule 10 can match eol */
#line 413 "sqlscan.l"
case 11:
/* rule 11 can match eol */
YY_RULE_SETUP
#line 413 "sqlscan.l"
{
					yyless(1);
					BEGIN(INITIAL);
					yylval.val.str = litbufdup();
					yylval.val.modificator = "b";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 12:
/* rule 12 can match eol */
#line 423 "sqlscan.l"
case 13:
/* rule 13 can match eol */
YY_RULE_SETUP
#line 423 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 14:
/* rule 14 can match eol */
#line 427 "sqlscan.l"
case 15:
/* rule 15 can match eol */
YY_RULE_SETUP
#line 427 "sqlscan.l"
{
					/* ignore */
				}
	YY_BREAK
case YY_STATE_EOF(xb):
#line 430 "sqlscan.l"
{ 
					yylval.val.str = litbufdup();
					yylval.val.modificator = "bu";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 438 "sqlscan.l"
{
					/* Hexadecimal bit type.
					 * At some point we should simply pass the string
					 * forward to the parser and label it there.
					 * In the meantime, place a leading "x" on the string
					 * to mark it for the input routine as a hex string.
					 */
					SET_YYLLOC();
					BEGIN(xh);
					startlit();
					addlitchar('x');
				}
	YY_BREAK
case 17:
/* rule 17 can match eol */
#line 451 "sqlscan.l"
case 18:
/* rule 18 can match eol */
YY_RULE_SETUP
#line 451 "sqlscan.l"
{
					yyless(1);
					BEGIN(INITIAL);
					yylval.val.str = litbufdup();
					yylval.val.modificator = "x";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case YY_STATE_EOF(xh):
#line 460 "sqlscan.l"
{ 
					yylval.val.str = litbufdup();
					yylval.val.modificator = "xu";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 19:
YY_RULE_SETUP
#line 468 "sqlscan.l"
{
					/* National character.
					 * We will pass this along as a normal character string,
					 * but preceded with an internally-generated "NCHAR".
					 */
					const char *keyword;
					int		keycode;

					SET_YYLLOC();
					yyless(1);				/* eat only 'n' this time */
					/* nchar had better be a keyword! */
					keyword = orafce_scan_keyword("nchar", &keycode);
					Assert(keyword != NULL);
					yylval.val.str = (char*) keyword;
					yylval.val.keycode = keycode;
					yylval.val.modificator = NULL;
					yylval.val.sep = NULL;
					return X_KEYWORD;
				}
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 488 "sqlscan.l"
{
					SET_YYLLOC();
					BEGIN(xq);
					extended_string = false;
					startlit();
				}
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 494 "sqlscan.l"
{
					SET_YYLLOC();
					BEGIN(xe);
					extended_string = true;
					startlit();
				}
	YY_BREAK
case 22:
/* rule 22 can match eol */
#line 501 "sqlscan.l"
case 23:
/* rule 23 can match eol */
YY_RULE_SETUP
#line 501 "sqlscan.l"
{
					yyless(1);
					BEGIN(INITIAL);
					yylval.val.str = litbufdup();
					yylval.val.modificator = extended_string ? "es" : "qs";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_SCONST;
				}
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 510 "sqlscan.l"
{
					addlitchar('\'');
				}
	YY_BREAK
case 25:
/* rule 25 can match eol */
YY_RULE_SETUP
#line 513 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 26:
/* rule 26 can match eol */
YY_RULE_SETUP
#line 516 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 27:
/* rule 27 can match eol */
YY_RULE_SETUP
#line 519 "sqlscan.l"
{
					addlitchar(unescape_single_char(yytext[1]));
				}
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 522 "sqlscan.l"
{
					unsigned char c = strtoul(yytext+1, NULL, 8);

					addlitchar(c);
				}
	YY_BREAK
case 29:
YY_RULE_SETUP
#line 527 "sqlscan.l"
{
					unsigned char c = strtoul(yytext+2, NULL, 16);

					addlitchar(c);
				}
	YY_BREAK
case 30:
/* rule 30 can match eol */
YY_RULE_SETUP
#line 532 "sqlscan.l"
{
					/* ignore */
				}
	YY_BREAK
case 31:
YY_RULE_SETUP
#line 535 "sqlscan.l"
{
					/* This is only needed for \ just before EOF */
					addlitchar(yytext[0]);
				}
	YY_BREAK
case YY_STATE_EOF(xq):
case YY_STATE_EOF(xe):
#line 539 "sqlscan.l"
{ 
					yylval.val.str = litbufdup();
					yylval.val.modificator = extended_string ? "esu" : "qsu";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_SCONST;
				}    
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 547 "sqlscan.l"
{
					SET_YYLLOC();
					dolqstart = pstrdup(yytext);
					BEGIN(xdolq);
					startlit();
				}
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 553 "sqlscan.l"
{
					/* throw back all but the initial "$" */
					yyless(1);
					/* and treat it as {other} */
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "dolqf";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_OTHERS;
				}
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 563 "sqlscan.l"
{
					if (strcmp(yytext, dolqstart) == 0)
					{
						yylval.val.sep = dolqstart;
						yylval.val.modificator = "dolq";
						BEGIN(INITIAL);
						yylval.val.str = litbufdup();
						yylval.val.keycode = -1;
						return X_SCONST;
					}
					else
					{
						/*
						 * When we fail to match $...$ to dolqstart, transfer
						 * the $... part to the output, but put back the final
						 * $ for rescanning.  Consider $delim$...$junk$delim$
						 */
						addlit(yytext, yyleng-1);
						yyless(yyleng-1);
					}
				}
	YY_BREAK
case 35:
/* rule 35 can match eol */
YY_RULE_SETUP
#line 584 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 587 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 590 "sqlscan.l"
{
					/* This is only needed for inside the quoted text */
					addlitchar(yytext[0]);
				}
	YY_BREAK
case YY_STATE_EOF(xdolq):
#line 594 "sqlscan.l"
{ 
					yylval.val.sep = dolqstart;
					yylval.val.modificator = "dolqu";
					yylval.val.str = litbufdup();
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_SCONST;
				}
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 603 "sqlscan.l"
{
					SET_YYLLOC();
					BEGIN(xd);
					startlit();
				}
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 608 "sqlscan.l"
{
					char		   *ident;

					BEGIN(INITIAL);
					if (literallen == 0)
						yyerror(NULL, "zero-length delimited identifier");
					ident = litbufdup();
					if (literallen >= NAMEDATALEN)
						truncate_identifier(ident, literallen, true);
					yylval.val.modificator = "dq";
					yylval.val.str = ident;
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_IDENT;
				}
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 623 "sqlscan.l"
{
					addlitchar('"');
				}
	YY_BREAK
case 41:
/* rule 41 can match eol */
YY_RULE_SETUP
#line 626 "sqlscan.l"
{
					addlit(yytext, yyleng);
				}
	YY_BREAK
case YY_STATE_EOF(xd):
#line 629 "sqlscan.l"
{ 
					yylval.val.modificator = "dqu";
					yylval.val.str = litbufdup();
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_IDENT;
				}
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 636 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "typecast";
					yylval.val.keycode = X_TYPECAST;
					yylval.val.sep = NULL;
					return X_OTHERS;
				}
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 645 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "self";
					yylval.val.keycode = yytext[0];
					yylval.val.sep = NULL;
					return X_OTHERS;
				}
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 654 "sqlscan.l"
{
					/*
					 * Check for embedded slash-star or dash-dash; those
					 * are comment starts, so operator must stop there.
					 * Note that slash-star or dash-dash at the first
					 * character will match a prior rule, not this one.
					 */
					int		nchars = yyleng;
					char   *slashstar = strstr(yytext, "/*");
					char   *dashdash = strstr(yytext, "--");

					if (slashstar && dashdash)
					{
						/* if both appear, take the first one */
						if (slashstar > dashdash)
							slashstar = dashdash;
					}
					else if (!slashstar)
						slashstar = dashdash;
					if (slashstar)
						nchars = slashstar - yytext;

					/*
					 * For SQL compatibility, '+' and '-' cannot be the
					 * last char of a multi-char operator unless the operator
					 * contains chars that are not in SQL operators.
					 * The idea is to lex '=-' as two operators, but not
					 * to forbid operator names like '?-' that could not be
					 * sequences of SQL operators.
					 */
					while (nchars > 1 &&
						   (yytext[nchars-1] == '+' ||
							yytext[nchars-1] == '-'))
					{
						int		ic;

						for (ic = nchars-2; ic >= 0; ic--)
						{
							if (strchr("~!@#^&|`?%", yytext[ic]))
								break;
						}
						if (ic >= 0)
							break; /* found a char that makes it OK */
						nchars--; /* else remove the +/-, and check again */
					}

					SET_YYLLOC();

					if (nchars < yyleng)
					{
						/* Strip the unwanted chars from the token */
						yyless(nchars);
						/*
						 * If what we have left is only one char, and it's
						 * one of the characters matching "self", then
						 * return it as a character token the same way
						 * that the "self" rule would have.
						 */
						if (nchars == 1 &&
							strchr(",()[].;:+-*/%^<>=", yytext[0]))
						{
							yylval.val.str = pstrdup(yytext);
							yylval.val.modificator = NULL;
							yylval.val.keycode = yytext[0];
							yylval.val.sep = NULL;
							return X_OTHERS;
						}
					}

					/*
					 * Complain if operator is too long.  Unlike the case
					 * for identifiers, we make this an error not a notice-
					 * and-truncate, because the odds are we are looking at
					 * a syntactic mistake anyway.
					 */
					if (nchars >= NAMEDATALEN)
						yyerror(NULL, "operator too long");

					/* Convert "!=" operator to "<>" for compatibility */
					yylval.val.modificator = NULL;
					if (strcmp(yytext, "!=") == 0)
						yylval.val.str = pstrdup("<>");
					else
						yylval.val.str = pstrdup(yytext);
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_OP;
				}
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 743 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.modificator = NULL;
					yylval.val.str = pstrdup(yytext);
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_PARAM;
				}
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 752 "sqlscan.l"
{
					long val;
					char* endptr;

					SET_YYLLOC();
					errno = 0;
					val = strtol(yytext, &endptr, 10);
					if (*endptr != '\0' || errno == ERANGE
#ifdef HAVE_LONG_INT_64
						/* if long > 32 bits, check for overflow of int4 */
						|| val != (long) ((int32) val)
#endif
						)
					{
						/* integer too large, treat it as a float */
						yylval.val.str = pstrdup(yytext);
						yylval.val.modificator = "f";
						yylval.val.keycode = -1;
						yylval.val.sep = NULL;
						return X_NCONST;
					}
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "i";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 779 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "f";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 787 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "f";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 795 "sqlscan.l"
{
					/*
					 * throw back the [Ee], and treat as {decimal}.  Note
					 * that it is possible the input is actually {integer},
					 * but since this case will almost certainly lead to a
					 * syntax error anyway, we don't bother to distinguish.
					 */
					yyless(yyleng-1);
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "f";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 810 "sqlscan.l"
{
					/* throw back the [Ee][+-], and proceed as above */
					yyless(yyleng-2);
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = "f";
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_NCONST;
				}
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 822 "sqlscan.l"
{
					char		   *ident;
					const char *keyword;
					int		keycode;

					SET_YYLLOC();

					/* nchar had better be a keyword! */
					keyword = orafce_scan_keyword("nchar", &keycode);

					/* Is it a keyword? */
					keyword = orafce_scan_keyword(yytext, &keycode);
					if (keyword != NULL)
					{
						yylval.val.str = (char*) keyword;
						yylval.val.keycode = keycode;
						yylval.val.modificator = NULL;
						yylval.val.sep = NULL;
						return X_KEYWORD;
					}

					/*
					 * No.  Convert the identifier to lower case, and truncate
					 * if necessary.
					 */
					ident = downcase_truncate_identifier(yytext, yyleng, true);
					yylval.val.str = ident;
					yylval.val.modificator = NULL;
					yylval.val.keycode = -1;
					yylval.val.sep = NULL;
					return X_IDENT;
				}
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 855 "sqlscan.l"
{
					SET_YYLLOC();
					yylval.val.str = pstrdup(yytext);
					yylval.val.modificator = NULL;
					yylval.val.keycode = yytext[0];
					yylval.val.sep = NULL;
					return X_OTHERS;
				}
	YY_BREAK
case YY_STATE_EOF(INITIAL):
#line 864 "sqlscan.l"
{
					SET_YYLLOC();
					yyterminate();
				}
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 869 "sqlscan.l"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 2186 "sqlscan.c"

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

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = (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
			 * 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.
			 */
			(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 ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state(  );

			/* 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 );

			yy_bp = (yytext_ptr) + YY_MORE_ADJ;

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

			else
				{
				yy_cp = (yy_last_accepting_cpos);
				yy_current_state = (yy_last_accepting_state);
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer(  ) )
			{
			case EOB_ACT_END_OF_FILE:
				{
				(yy_did_buffer_switch_on_eof) = 0;

				if ( yywrap(  ) )
					{
					/* 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.
					 */
					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! (yy_did_buffer_switch_on_eof) )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				(yy_c_buf_p) =
					(yytext_ptr) + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
				goto yy_match;

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

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (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 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 (void)
{
    	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = (yytext_ptr);
	int number_to_move, i;
	int ret_val;

	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(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 ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
			{
			/* We matched a single character, the EOB, so
			 * treat this as a final EOF.
			 */
			return EOB_ACT_END_OF_FILE;
			}

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

	/* Try to read more data. */

	/* First move last chars to start of buffer. */
	number_to_move = (int) ((yy_c_buf_p) - (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 = (yy_n_chars) = 0;

	else
		{
			int 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) ((yy_c_buf_p) - b->yy_ch_buf);

			if ( b->yy_is_our_buffer )
				{
				int 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. */
					yyrealloc( (void *) b->yy_ch_buf,
							 (yy_size_t) (b->yy_buf_size + 2)  );
				}
			else
				/* Can't grow it, we don't own it. */
				b->yy_ch_buf = NULL;

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

			(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]),
			(yy_n_chars), num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	if ( (yy_n_chars) == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			yyrestart( yyin  );
			}

		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_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
		/* "- 2" to take care of EOB's */
		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
	}

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

	(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 (void)
{
	yy_state_type yy_current_state;
	char *yy_cp;
    
	yy_current_state = (yy_start);

	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (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] )
			{
			(yy_last_accepting_state) = yy_current_state;
			(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 >= 155 )
				yy_c = yy_meta[yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 )
{
	int yy_is_jam;
    	char *yy_cp = (yy_c_buf_p);

	YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		(yy_last_accepting_state) = yy_current_state;
		(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 >= 155 )
			yy_c = yy_meta[yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
	yy_is_jam = (yy_current_state == 154);

		return yy_is_jam ? 0 : yy_current_state;
}

#ifndef YY_NO_UNPUT

#endif

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

{
	int c;
    
	*(yy_c_buf_p) = (yy_hold_char);

	if ( *(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 ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			/* This was really a NUL. */
			*(yy_c_buf_p) = '\0';

		else
			{ /* need more input */
			int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
			++(yy_c_buf_p);

			switch ( yy_get_next_buffer(  ) )
				{
				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. */
					yyrestart( yyin );

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( yywrap(  ) )
						return 0;

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

				case EOB_ACT_CONTINUE_SCAN:
					(yy_c_buf_p) = (yytext_ptr) + offset;
					break;
				}
			}
		}

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

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

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * 
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void yyrestart  (FILE * input_file )
{
    
	if ( ! YY_CURRENT_BUFFER ){
        yyensure_buffer_stack ();
		YY_CURRENT_BUFFER_LVALUE =
            yy_create_buffer( yyin, YY_BUF_SIZE );
	}

	yy_init_buffer( YY_CURRENT_BUFFER, input_file );
	yy_load_buffer_state(  );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
{
    
	/* TODO. We should be able to replace this entire function body
	 * with
	 *		yypop_buffer_state();
	 *		yypush_buffer_state(new_buffer);
     */
	yyensure_buffer_stack ();
	if ( YY_CURRENT_BUFFER == new_buffer )
		return;

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

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	yy_load_buffer_state(  );

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

static void yy_load_buffer_state  (void)
{
    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	(yy_hold_char) = *(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.
 * 
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

	b->yy_buf_size = size;

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

	b->yy_is_our_buffer = 1;

	yy_init_buffer( b, file );

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * 
 */
    void yy_delete_buffer (YY_BUFFER_STATE  b )
{
    
	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 )
		yyfree( (void *) b->yy_ch_buf  );

	yyfree( (void *) b  );
}

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

{
	int oerrno = errno;
    
	yy_flush_buffer( b );

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

    /* If b is the current buffer, then yy_init_buffer was _probably_
     * called from 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.
 * 
 */
    void yy_flush_buffer (YY_BUFFER_STATE  b )
{
    	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 )
		yy_load_buffer_state(  );
}

/** 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.
 *  
 */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
{
    	if (new_buffer == NULL)
		return;

	yyensure_buffer_stack();

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

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

	/* copied from yy_switch_to_buffer. */
	yy_load_buffer_state(  );
	(yy_did_buffer_switch_on_eof) = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  
 */
void yypop_buffer_state (void)
{
    	if (!YY_CURRENT_BUFFER)
		return;

	yy_delete_buffer(YY_CURRENT_BUFFER );
	YY_CURRENT_BUFFER_LVALUE = NULL;
	if ((yy_buffer_stack_top) > 0)
		--(yy_buffer_stack_top);

	if (YY_CURRENT_BUFFER) {
		yy_load_buffer_state(  );
		(yy_did_buffer_switch_on_eof) = 1;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void yyensure_buffer_stack (void)
{
	yy_size_t num_to_alloc;
    
	if (!(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... */
		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));

		(yy_buffer_stack_max) = num_to_alloc;
		(yy_buffer_stack_top) = 0;
		return;
	}

	if ((yy_buffer_stack_top) >= ((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 = (yy_buffer_stack_max) + grow_size;
		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
								((yy_buffer_stack),
								num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		/* zero only the new slots.*/
		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
		(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
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
{
	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 NULL;

	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );

	b->yy_buf_size = (int) (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 = NULL;
	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;

	yy_switch_to_buffer( b  );

	return b;
}

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

/** Setup the input buffer state to scan the given bytes. The next call to 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.
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = (yy_size_t) (_yybytes_len + 2);
	buf = (char *) yyalloc( n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in 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 = yy_scan_buffer( buf, n );
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in 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 yynoreturn yy_fatal_error (const char* msg )
{
			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] = (yy_hold_char); \
		(yy_c_buf_p) = yytext + yyless_macro_arg; \
		(yy_hold_char) = *(yy_c_buf_p); \
		*(yy_c_buf_p) = '\0'; \
		yyleng = yyless_macro_arg; \
		} \
	while ( 0 )

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

/** Get the current line number.
 * 
 */
int yyget_lineno  (void)
{
    
    return yylineno;
}

/** Get the input stream.
 * 
 */
FILE *yyget_in  (void)
{
        return yyin;
}

/** Get the output stream.
 * 
 */
FILE *yyget_out  (void)
{
        return yyout;
}

/** Get the length of the current token.
 * 
 */
int yyget_leng  (void)
{
        return yyleng;
}

/** Get the current token.
 * 
 */

char *yyget_text  (void)
{
        return yytext;
}

/** Set the current line number.
 * @param _line_number line number
 * 
 */
void yyset_lineno (int  _line_number )
{
    
    yylineno = _line_number;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param _in_str A readable stream.
 * 
 * @see yy_switch_to_buffer
 */
void yyset_in (FILE *  _in_str )
{
        yyin = _in_str ;
}

void yyset_out (FILE *  _out_str )
{
        yyout = _out_str ;
}

int yyget_debug  (void)
{
        return yy_flex_debug;
}

void yyset_debug (int  _bdebug )
{
        yy_flex_debug = _bdebug ;
}

static int yy_init_globals (void)
{
        /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from yylex_destroy(), so don't allocate here.
     */

    (yy_buffer_stack) = NULL;
    (yy_buffer_stack_top) = 0;
    (yy_buffer_stack_max) = 0;
    (yy_c_buf_p) = NULL;
    (yy_init) = 0;
    (yy_start) = 0;

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = NULL;
    yyout = NULL;
#endif

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

/* yylex_destroy is for both reentrant and non-reentrant scanners. */
int yylex_destroy  (void)
{
    
    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		yy_delete_buffer( YY_CURRENT_BUFFER  );
		YY_CURRENT_BUFFER_LVALUE = NULL;
		yypop_buffer_state();
	}

	/* Destroy the stack itself. */
	yyfree((yy_buffer_stack) );
	(yy_buffer_stack) = NULL;

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

    return 0;
}

/*
 * Internal utility routines.
 */

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

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

	return n;
}
#endif

void *yyalloc (yy_size_t  size )
{
			return malloc(size);
}

void *yyrealloc  (void * ptr, yy_size_t  size )
{
		
	/* 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 realloc(ptr, size);
}

void yyfree (void * ptr )
{
			free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

#line 869 "sqlscan.l"


/*
 * lexer_errposition
 *		Report a lexical-analysis-time cursor position, if possible.
 *
 * This is expected to be used within an ereport() call.  The return value
 * is a dummy (always 0, in fact).
 *
 * Note that this can only be used for messages from the lexer itself,
 * since it depends on scanbuf to still be valid.
 */
static int
lexer_errposition(void)
{
	int		pos;

	/* Convert byte offset to character number */
	pos = _pg_mbstrlen_with_len(scanbuf, orafce_sql_yylval.val.lloc) + 1;
	/* And pass it to the ereport mechanism */

#if PG_VERSION_NUM >= 120000

	errposition(pos);

	return pos;

#else

	return errposition(pos);

#endif

}

/*
 * yyerror
 *		Report a lexer or grammar error.
 *
 * The message's cursor position identifies the most recently lexed token.
 * This is OK for syntax error messages from the Bison parser, because Bison
 * parsers report error as soon as the first unparsable token is reached.
 * Beware of using yyerror for other purposes, as the cursor position might
 * be misleading!
 */
void
orafce_sql_yyerror(List **result, const char *message)
{
	const char *loc = scanbuf + orafce_sql_yylval.val.lloc;

	if (*loc == YY_END_OF_BUFFER_CHAR)
	{
		ereport(ERROR,
				(errcode(ERRCODE_SYNTAX_ERROR),
				 errmsg("%s at end of input", message),
				 lexer_errposition()));
	}
	else
	{
		ereport(ERROR,
				(errcode(ERRCODE_SYNTAX_ERROR),
				 errmsg("%s at or near \"%s\"", message, loc),
				 lexer_errposition()));
	}
}


/*
 * Called before any actual parsing is done
 */
void
orafce_sql_scanner_init(const char *str)
{
	Size	slen = strlen(str);

	/*
	 * Might be left over after ereport()
	 */
	if (YY_CURRENT_BUFFER)
		yy_delete_buffer(YY_CURRENT_BUFFER);

	/*
	 * Make a scan buffer with special termination needed by flex.
	 */
	scanbuflen = slen;
	scanbuf = palloc(slen + 2);
	memcpy(scanbuf, str, slen);
	scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
	scanbufhandle = yy_scan_buffer(scanbuf, slen + 2);

	/* initialize literal buffer to a reasonable but expansible size */
	literalalloc = 128;
	literalbuf = (char *) palloc(literalalloc);
	startlit();

	BEGIN(INITIAL);
}


/*
 * Called after parsing is done to clean up after fdate_scanner_init()
 */
void
orafce_sql_scanner_finish(void)
{
	yy_delete_buffer(scanbufhandle);
	pfree(scanbuf);
}

static void
addlit(char *ytext, int yleng)
{
	/* enlarge buffer if needed */
	if ((literallen+yleng) >= literalalloc)
	{

#if PG_VERSION_NUM >= 130000

		literalalloc = pg_nextpower2_32(literallen + yleng + 1);

#else

		do {
			literalalloc *= 2;
		} while ((literallen+yleng) >= literalalloc);

#endif

		literalbuf = (char *) repalloc(literalbuf, literalalloc);
	}
	/* append new data, add trailing null */
	memcpy(literalbuf+literallen, ytext, yleng);
	literallen += yleng;
	literalbuf[literallen] = '\0';
}


static void
addlitchar(unsigned char ychar)
{
	/* enlarge buffer if needed */
	if ((literallen+1) >= literalalloc)
	{
		literalalloc *= 2;
		literalbuf = (char *) repalloc(literalbuf, literalalloc);
	}
	/* append new data, add trailing null */
	literalbuf[literallen] = ychar;
	literallen += 1;
	literalbuf[literallen] = '\0';
}


/*
 * One might be tempted to write pstrdup(literalbuf) instead of this,
 * but for long literals this is much faster because the length is
 * already known.
 */
static char *
litbufdup(void)
{
	char *new;

	new = palloc(literallen + 1);
	memcpy(new, literalbuf, literallen+1);
	return new;
}


static unsigned char
unescape_single_char(unsigned char c)
{
	switch (c)
	{
		case 'b':
			return '\b';
		case 'f':
			return '\f';
		case 'n':
			return '\n';
		case 'r':
			return '\r';
		case 't':
			return '\t';
		default:
			return c;
	}
}

