#line 17 "./glslang.l"
//
// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// This file is auto-generated by generate_parser.sh. DO NOT EDIT!

// Ignore errors in auto-generated code.
#if defined(__GNUC__)
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wswitch-enum"
#elif defined(_MSC_VER)
#pragma warning(disable: 4065)
#pragma warning(disable: 4189)
#pragma warning(disable: 4505)
#pragma warning(disable: 4701)
#endif



#line 25 "./glslang_lex.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 5
#define YY_FLEX_SUBMINOR_VERSION 39
#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 yyrestart(yyin ,yyscanner )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#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 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 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 yyrestart (FILE *input_file ,yyscan_t yyscanner );
void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
void yypop_buffer_state (yyscan_t yyscanner );

static void yyensure_buffer_stack (yyscan_t yyscanner );
static void yy_load_buffer_state (yyscan_t yyscanner );
static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );

#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );

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

#define yy_new_buffer yy_create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        yyensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            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 ){\
        yyensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            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 yywrap(yyscanner) 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 );
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 244
#define YY_END_OF_BUFFER 245
/* 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[828] =
    {   0,
        0,    0,    0,    0,    0,    0,  245,  243,  242,  242,
      227,  233,  238,  222,  223,  231,  230,  219,  228,  226,
      232,  185,  185,  220,  216,  234,  221,  235,  239,  182,
      224,  225,  237,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  217,  236,  218,  229,    3,    4,    3,
      241,  244,  240,  213,  199,  218,  207,  202,  197,  205,
      195,  206,  196,  191,    2,    1,  198,  190,  184,  185,
        0,  188,    0,  225,  217,  224,  214,  210,  212,  211,
      215,  182,  203,  209,  182,  182,  182,  182,  182,  182,

      182,  182,  182,  182,  182,  182,   17,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
       20,  182,  182,   28,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  204,  208,    5,
      240,    0,  194,    1,  190,    0,  193,  187,    0,  189,
      183,  200,  201,  182,  140,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,   18,  182,

      182,  182,  182,  182,  182,  182,  182,  182,  182,   32,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,   29,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,    0,  191,    0,  190,
      192,  186,  182,  182,  182,   35,  182,  182,   23,  179,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
       21,  143,  182,  182,  182,  182,   26,  182,  182,  147,
      159,  182,  182,  182,  182,  182,  182,  182,  182,  182,

      182,  182,  182,  156,    9,   40,   41,   42,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  146,   36,  182,  182,   33,  182,  182,  182,
      182,  182,  182,  182,   52,   53,   54,   34,  182,  182,
      182,  182,  182,  182,   15,   61,   62,   63,  182,  141,
      182,  182,   12,  182,  182,  182,  182,  168,  169,  170,
      182,   37,  182,  160,   31,  171,  172,  173,    7,  165,
      166,  167,  182,  182,  182,   30,  163,  182,  182,  182,
       55,   56,   57,  182,  182,  182,  182,  182,  182,  182,

      182,  182,  182,  182,   90,  182,  182,  182,  182,  182,
      182,  182,  157,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  142,  182,  182,  181,   58,   59,
       60,  182,  182,   19,  182,   95,  182,  182,  182,  182,
       93,  182,  182,  182,  158,  153,   96,  182,  182,  182,
      182,  182,  182,  148,  182,  182,  182,   82,   43,   46,
       48,   47,   44,   50,   49,   51,   45,  182,  182,  182,
      182,  164,  139,  182,  182,  151,  182,  182,  182,   39,
       91,  178,   27,  152,   81,  182,  162,   22,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,

      182,  182,   24,   38,  182,  182,  182,  182,  182,  182,
       97,   98,   99,  182,  182,  182,  182,  182,    8,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      144,  182,  182,  182,  182,  182,   13,  182,  182,   14,
      182,  182,  182,  182,   25,   83,   16,  154,  101,  102,
      103,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  149,  182,  182,  182,   85,   87,   84,
      182,  182,  182,  182,  182,  182,  182,  145,  105,  106,
      107,  182,  182,  161,  182,  150,  182,  182,   11,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  100,  155,

        6,  182,  182,  182,  182,  182,  180,  182,   94,   10,
      174,   64,   67,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,   86,  182,  182,  182,
      182,  104,  182,  182,  182,  182,  182,  124,   70,   71,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,   92,  182,  182,  182,  108,  126,   74,
       75,  182,  182,   88,  182,  182,  182,  182,  182,  182,
      182,  119,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  133,  182,  182,  182,  182,   65,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,

      120,  109,  182,  110,  182,  182,  182,  134,  182,  182,
       72,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  121,  182,  182,  135,  182,  182,
       76,  111,  112,  182,  115,  182,  116,  182,  182,  182,
      182,  182,   89,  182,  182,  182,  182,  176,  182,   68,
      130,  182,  182,  113,  114,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  128,  131,  122,  182,   69,
      182,  182,  182,  182,  182,  182,  182,  182,  129,  132,
      182,  182,  125,   73,  182,  182,  175,  182,  182,  182,
       78,  182,  182,  127,   77,  182,  182,  182,  182,  182,

      182,  136,  182,  182,  182,  182,  182,  182,  137,  182,
      182,  182,   79,  182,  138,  117,  118,  182,  182,  182,
       66,  182,  182,  177,  123,   80,    0
    } ;

static yyconst flex_int32_t yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    4,    1,    1,    1,    5,    6,    1,    7,
        8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
       18,   19,   20,   20,   20,   21,   21,   22,   23,   24,
       25,   26,   27,    1,   28,   29,   30,   31,   32,   33,
       34,   34,   34,   34,   34,   34,   35,   34,   36,   34,
       34,   37,   38,   34,   39,   34,   34,   40,   34,   34,
       41,    1,   42,   43,   44,    1,   45,   46,   47,   48,

       49,   50,   51,   52,   53,   34,   54,   55,   56,   57,
       58,   59,   34,   60,   61,   62,   63,   64,   65,   66,
       67,   68,   69,   70,   71,   72,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    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 flex_int32_t yy_meta[73] =
    {   0,
        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    3,    3,    3,    3,    3,    3,
        3,    1,    1,    1,    1,    1,    1,    4,    4,    4,
        4,    3,    3,    5,    5,    5,    5,    5,    5,    5,
        1,    1,    1,    5,    4,    4,    4,    4,    3,    3,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    1,    1,
        1,    1
    } ;

static yyconst flex_int16_t yy_base[835] =
    {   0,
        0,    0,   70,   71,   80,    0, 1032, 1033, 1033, 1033,
     1006,   50,  147, 1033, 1033, 1005,  144, 1033,  143,  141,
      156,  169,  223, 1003, 1033,  169, 1003,   52, 1033,    0,
     1033, 1033,  152,  117,  138,  118,  157,  148,  167,  969,
      147,  173,  159,  126,  188,  963,  200,  976,  205,  199,
      212,  226,  147, 1033,  158, 1033, 1033, 1033, 1033, 1010,
     1033, 1033,    0, 1033, 1033, 1033, 1033, 1033, 1033, 1033,
     1033, 1033, 1033,  245, 1033,    0, 1033,  247,  242,    0,
      294, 1033,    0, 1033, 1033, 1033,  998, 1033, 1033, 1033,
      997,    0, 1033, 1033,  959,  964,  191,  961,  969,  968,

      955,  958,  969,  231,  963,  951,  948,  961,  948,  945,
      945,  951,  158,  240,  945,  955,  941,  947,  950,  951,
        0,  943,  953,  261,  952,  947,  928,  162,  932,  945,
      936,  240,  929,  270,  941,  943,  229,  932,  929,  918,
      927,  247,  243,  931,  927,  929,  918,  921,  244,  203,
      273,  930,  918,  930,  199,  923,  922, 1033, 1033, 1033,
        0,  319, 1033,    0,  295,  331, 1033, 1033,  338,  345,
      328, 1033, 1033,  921,    0,  917,  912,  916,  925,  922,
      319,  906,  906,  917,  909,  260,  919,  916,  916,  914,
      911,  903,  909,  896,  894,  906,  892,  908,    0,  905,

      893,  900,  897,  901,  902,  895,  892,  881,  880,  893,
      896,  884,  892,  880,  886,  877,  352,  882,  885,  876,
      883,  872,  876,  867,  881,  880,  871,  877,  314,  861,
      864,  862,  872,  862,  857,  855,  857,  867,  853,  855,
      852,  863,  862,  865,  847,  324,  855,  851,  849,  858,
      837,  366,  855,  857,  846,  838,  381,  388,  395,  407,
     1033, 1033,  835,  845,  844,    0,  842,  369,    0,    0,
      835,  833,  833,  834,  829,  837,  826,  843,  832,  375,
        0,    0,  826,  836,  835,  835,    0,  820,  400,    0,
        0,  822,  412,  829,  830,  821,  815,  814,  815,  814,

      814,  415,  809,    0,    0,  805,  804,  803,  805,  806,
      811,  805,  801,  814,  809,  809,  807,  806,  800,  794,
      796,  795,  799,  791,  794,  789,  797,  802,  790,  787,
      799,  790,    0,    0,  796,  792,    0,  784,  784,  789,
      780,  787,  418,  784,    0,    0,    0,    0,  774,  786,
      785,  784,  785,  785,    0,    0,    0,    0,  772,    0,
      780,  771,    0,  770,  771,  765,  775,    0,    0,    0,
      766,    0,  762,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  772,  425,  771,    0,    0,  769,  765,  762,
        0,    0,    0,  754,  427,  430,  433,  759,  755,  760,

      751,  749,  762,  747,    0,  747,  760,  749,  745,  751,
      746,  753,    0,  751,  748,  752,  736,  734,  737,  743,
      749,  744,  743,  731,    0,  733,  734,    0,    0,    0,
        0,  731,  734,    0,  728,    0,  741,  721,  730,  725,
        0,  718,  718,  731,    0,  733,    0,  442,  746,  745,
      744,  711,  710,    0,  727,  726,  721,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,  710,  723,  710,
      707,    0,    0,  712,  711,    0,  708,  715,  714,    0,
      700,    0,    0,    0,    0,  697,    0,    0,  696,  707,
      445,  700,  706,  705,  702,  697,  694,  687,  687,  700,

      685,  697,    0,    0,  690,  713,  712,  711,  678,  677,
      351,  352,    0,  689,  692,  690,  679,  675,    0,  687,
      684,  683,  673,  672,  662,  679,  665,  448,  673,  676,
        0,  693,  692,  691,  658,  657,    0,  671,  658,    0,
      668,  661,  662,  665,    0,    0,    0,    0,  685,  684,
        0,  661,  664,  649,  656,  647,  654,  655,  655,  654,
      640,  452,  652,    0,  653,  642,  641,    0,    0,    0,
      666,  665,  664,  631,  630,  626,  634,    0,  662,  661,
        0,  638,  641,    0,  467,    0,  619,  628,    0,  624,
      623,  632,  632,  620,  634,  618,  632,  627,    0,    0,

        0,  644,  643,  642,  609,  608,    0,  608,    0,    0,
      448,  463,  632,  618,  621,  604,  616,  604,  603,  612,
      612,  629,  628,  627,  594,  593,    0,  593,  594,  593,
      603,    0,  606,  602,  604,  600,  587,  618,  467,    0,
      595,  598,  590,  582,  589,  580,  601,  589,  585,  587,
      585,  585,  584,    0,  572,  571,  581,    0,  601,  471,
        0,  578,  581,    0,  581,  580,  564,  556,  564,  554,
      562,    0,  559,  558,  579,  567,  565,  565,  549,  552,
      566,  550,  581,  561,  562,  559,  556,  566,  543,  557,
      556,  540,  539,  538,  559,  547,  545,  545,  526,  525,

        0,  553,  525,  551,  523,  527,  526,  557,  537,  534,
        0,  533,  536,  532,  534,  518,  515,  528,  513,  514,
      521,  515,  504,  503,    0,  509,  508,  539,  519,  516,
        0,    0,    0,  512,    0,  511,    0,  517,  516,  500,
      497,  498,    0,  490,  498,  488,  494,  515,  494,    0,
        0,  506,  505,    0,    0,  504,  503,  487,  484,  485,
      499,  498,  475,  474,  480,    0,    0,  501,  473,  499,
      491,  483,  469,  118,  125,  130,  149,  187,    0,    0,
      255,  276,    0,    0,  288,  290,    0,  321,  308,  332,
        0,  362,  403,    0,    0,  408,  398,  409,  406,  434,

      442,    0,  440,  424,  458,  425,  428,  429,    0,  455,
      457,  449,    0,  471,    0,    0,    0,  452,  453,  447,
        0,  448,  449,    0,    0,    0, 1033,  514,  517,  520,
      523,  526,  525,  529
    } ;

static yyconst flex_int16_t yy_def[835] =
    {   0,
      827,    1,  828,  828,  827,    5,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  829,
      827,  827,  827,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  830,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  831,  827,  832,  827,  833,   22,   23,
      827,  827,  834,  827,  827,  827,  827,  827,  827,  827,
      827,  829,  827,  827,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  827,  827,  827,
      830,  827,  827,  832,  833,  827,  827,  827,  827,  827,
      834,  827,  827,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  827,  827,  827,  827,
      827,  827,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,

      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
      829,  829,  829,  829,  829,  829,    0,  827,  827,  827,
      827,  827,  827,  827
    } ;

static yyconst flex_int16_t yy_nxt[1106] =
    {   0,
        8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
       18,   19,   20,   21,   22,   23,   23,   23,   23,   23,
       23,   24,   25,   26,   27,   28,   29,   30,   30,   30,
       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
       31,   32,   33,   30,   34,   35,   36,   37,   38,   39,
       40,   41,   42,   30,   43,   44,   45,   46,   47,   48,
       49,   50,   51,   52,   53,   30,   30,   30,   54,   55,
       56,   57,   59,   59,   65,   66,   90,   91,   60,   60,
        8,   61,   62,    8,    8,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,

        8,    8,    8,    8,    8,    8,    8,   63,   63,   63,
       63,   63,   63,   63,   63,   63,   63,   63,   63,   63,
        8,    8,    8,   63,   63,   63,   63,   63,   63,   63,
       63,   63,   63,   63,   63,   63,   63,   63,   63,   63,
       63,   63,   63,   63,   63,   63,   63,   63,    8,    8,
        8,    8,   67,   70,   72,   74,   74,   74,   74,   74,
       74,   74,  101,   95,   75,  792,  102,   73,   71,   76,
      129,   68,  103,   85,  130,  104,   93,   96,   97,  793,
       77,   78,  158,   79,   79,   79,   79,   79,   79,   80,
       86,  118,   87,   88,   94,   98,  794,   99,  156,  119,

       81,  100,  109,  127,  110,  105,  157,   82,   83,  106,
      120,  112,  195,  111,  107,  795,  128,   81,  215,  113,
      108,  114,  121,  196,  115,  122,  216,  159,  123,  124,
      116,   82,  131,  125,   83,   78,  126,   80,   80,   80,
       80,   80,   80,   80,  134,  132,  796,  145,  176,  138,
      146,  253,  177,  254,   81,  246,  139,  140,  147,  135,
      141,   82,  136,  247,  149,  148,  142,  143,  150,  144,
      153,   81,  151,  228,  154,  152,  162,  163,  166,  167,
      168,  827,  184,  155,  197,   82,  185,  186,  237,  229,
      230,  235,  220,  162,  163,  166,  167,  198,  221,  244,

      245,  238,  797,  169,  168,  169,  236,  827,  170,  170,
      170,  170,  170,  170,  170,  207,  223,  248,  208,  209,
      275,  276,  210,  798,  211,  249,  166,  167,  257,  224,
      257,  225,  799,  258,  258,  258,  258,  258,  258,  258,
      259,  800,  259,  166,  167,  260,  260,  260,  260,  260,
      260,  260,  170,  170,  170,  170,  170,  170,  170,  170,
      170,  170,  170,  170,  170,  170,  262,  269,  306,  307,
      308,  320,  801,  338,  802,  321,  803,  261,  554,  556,
      270,  339,  345,  346,  347,  356,  357,  358,  555,  557,
      262,  368,  369,  370,  261,  258,  258,  258,  258,  258,

      258,  258,  258,  258,  258,  258,  258,  258,  258,  260,
      260,  260,  260,  260,  260,  260,  376,  377,  378,  804,
      163,  260,  260,  260,  260,  260,  260,  260,  380,  381,
      382,  391,  392,  393,  429,  430,  431,  163,  805,  167,
      449,  450,  451,  459,  460,  461,  462,  463,  464,  465,
      466,  467,  806,  452,  453,  807,  167,  506,  507,  508,
      532,  533,  534,  571,  572,  573,  808,  602,  603,  604,
      509,  510,  809,  535,  536,  644,  574,  575,  810,  576,
      605,  606,  622,  623,  624,  645,  811,  812,  813,  814,
      646,  815,  816,  817,  674,  625,  626,  647,  694,  648,

      649,  675,  818,  676,  819,  695,  820,  696,  821,  822,
      823,  824,  825,  826,   58,   58,   58,   58,   58,   92,
       92,   92,  161,  161,  161,   74,  164,  165,  164,  164,
      164,  171,  171,  791,  790,  789,  788,  787,  786,  785,
      784,  783,  782,  781,  780,  779,  778,  777,  776,  775,
      774,  773,  772,  771,  770,  769,  768,  767,  766,  765,
      764,  763,  762,  761,  760,  759,  758,  757,  756,  755,
      754,  753,  752,  751,  750,  749,  748,  747,  746,  745,
      744,  743,  742,  741,  740,  739,  738,  737,  736,  735,
      734,  733,  732,  731,  730,  729,  728,  727,  726,  725,

      724,  723,  722,  721,  720,  719,  718,  717,  716,  715,
      714,  713,  712,  711,  710,  709,  708,  707,  706,  705,
      704,  703,  702,  701,  700,  699,  698,  697,  693,  692,
      691,  690,  689,  688,  687,  686,  685,  684,  683,  682,
      681,  680,  679,  678,  677,  673,  672,  671,  670,  669,
      668,  667,  666,  665,  664,  663,  662,  661,  660,  659,
      658,  657,  656,  655,  654,  653,  652,  651,  650,  643,
      642,  641,  640,  639,  638,  637,  636,  635,  634,  633,
      632,  631,  630,  629,  628,  627,  621,  620,  619,  618,
      617,  616,  615,  614,  613,  612,  611,  610,  609,  608,

      607,  601,  600,  599,  598,  597,  596,  595,  594,  593,
      592,  591,  590,  589,  588,  587,  586,  585,  584,  583,
      582,  581,  580,  579,  578,  577,  570,  569,  568,  567,
      566,  565,  564,  563,  562,  561,  560,  559,  558,  553,
      552,  551,  550,  549,  548,  547,  546,  545,  544,  543,
      542,  541,  540,  539,  538,  537,  531,  530,  529,  528,
      527,  526,  525,  524,  523,  522,  521,  520,  519,  518,
      517,  516,  515,  514,  513,  512,  511,  505,  504,  503,
      502,  501,  500,  499,  498,  497,  496,  495,  494,  493,
      492,  491,  490,  489,  488,  487,  486,  485,  484,  483,

      482,  481,  480,  479,  478,  477,  476,  475,  474,  473,
      472,  471,  470,  469,  468,  458,  457,  456,  455,  454,
      448,  447,  446,  445,  444,  443,  442,  441,  440,  439,
      438,  437,  436,  435,  434,  433,  432,  428,  427,  426,
      425,  424,  423,  422,  421,  420,  419,  418,  417,  416,
      415,  414,  413,  412,  411,  410,  409,  408,  407,  406,
      405,  404,  403,  402,  401,  400,  399,  398,  397,  396,
      395,  394,  390,  389,  388,  387,  386,  385,  384,  383,
      379,  375,  374,  373,  372,  371,  367,  366,  365,  364,
      363,  362,  361,  360,  359,  355,  354,  353,  352,  351,

      350,  349,  348,  344,  343,  342,  341,  340,  337,  336,
      335,  334,  333,  332,  331,  330,  329,  328,  327,  326,
      325,  324,  323,  322,  319,  318,  317,  316,  315,  314,
      313,  312,  311,  310,  309,  305,  304,  303,  302,  301,
      300,  299,  298,  297,  296,  295,  294,  293,  292,  291,
      290,  289,  288,  287,  286,  285,  284,  283,  282,  281,
      280,  279,  278,  277,  274,  273,  272,  271,  268,  267,
      266,  265,  264,  263,  256,  255,  252,  251,  250,  243,
      242,  241,  240,  239,  234,  233,  232,  231,  227,  226,
      222,  219,  218,  217,  214,  213,  212,  206,  205,  204,

      203,  202,  201,  200,  199,  194,  193,  192,  191,  190,
      189,  188,  187,  183,  182,  181,  180,  179,  178,  175,
      174,  173,  172,  160,  137,  133,  117,   89,   84,   69,
       64,  827,    7,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,

      827,  827,  827,  827,  827
    } ;

static yyconst flex_int16_t yy_chk[1106] =
    {   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,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    3,    4,   12,   12,   28,   28,    3,    4,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,

        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,   13,   17,   19,   20,   20,   20,   20,   20,
       20,   20,   36,   34,   21,  774,   36,   19,   17,   21,
       44,   13,   36,   26,   44,   36,   33,   34,   34,  775,
       21,   22,   55,   22,   22,   22,   22,   22,   22,   22,
       26,   41,   26,   26,   33,   35,  776,   35,   53,   41,

       22,   35,   38,   43,   38,   37,   53,   22,   22,   37,
       41,   39,  113,   38,   37,  777,   43,   22,  128,   39,
       37,   39,   42,  113,   39,   42,  128,   55,   42,   42,
       39,   22,   45,   42,   22,   23,   42,   23,   23,   23,
       23,   23,   23,   23,   47,   45,  778,   50,   97,   49,
       50,  155,   97,  155,   23,  150,   49,   49,   50,   47,
       49,   23,   47,  150,   51,   50,   49,   49,   51,   49,
       52,   23,   51,  137,   52,   51,   74,   74,   78,   78,
       79,   79,  104,   52,  114,   23,  104,  104,  143,  137,
      137,  142,  132,   74,   74,   78,   78,  114,  132,  149,

      149,  143,  781,   81,   79,   81,  142,   79,   81,   81,
       81,   81,   81,   81,   81,  124,  134,  151,  124,  124,
      186,  186,  124,  782,  124,  151,  165,  165,  162,  134,
      162,  134,  785,  162,  162,  162,  162,  162,  162,  162,
      166,  786,  166,  165,  165,  166,  166,  166,  166,  166,
      166,  166,  169,  169,  169,  169,  169,  169,  169,  170,
      170,  170,  170,  170,  170,  170,  171,  181,  217,  217,
      217,  229,  788,  246,  789,  229,  790,  170,  511,  512,
      181,  246,  252,  252,  252,  268,  268,  268,  511,  512,
      171,  280,  280,  280,  170,  257,  257,  257,  257,  257,

      257,  257,  258,  258,  258,  258,  258,  258,  258,  259,
      259,  259,  259,  259,  259,  259,  289,  289,  289,  792,
      258,  260,  260,  260,  260,  260,  260,  260,  293,  293,
      293,  302,  302,  302,  343,  343,  343,  258,  793,  260,
      384,  384,  384,  395,  395,  395,  396,  396,  396,  397,
      397,  397,  796,  384,  384,  797,  260,  448,  448,  448,
      491,  491,  491,  528,  528,  528,  798,  562,  562,  562,
      448,  448,  799,  491,  491,  611,  528,  528,  800,  528,
      562,  562,  585,  585,  585,  611,  801,  803,  804,  805,
      612,  806,  807,  808,  639,  585,  585,  612,  660,  612,

      612,  639,  810,  639,  811,  660,  812,  660,  814,  818,
      819,  820,  822,  823,  828,  828,  828,  828,  828,  829,
      829,  829,  830,  830,  830,  831,  832,  833,  832,  832,
      832,  834,  834,  773,  772,  771,  770,  769,  768,  765,
      764,  763,  762,  761,  760,  759,  758,  757,  756,  753,
      752,  749,  748,  747,  746,  745,  744,  742,  741,  740,
      739,  738,  736,  734,  730,  729,  728,  727,  726,  724,
      723,  722,  721,  720,  719,  718,  717,  716,  715,  714,
      713,  712,  710,  709,  708,  707,  706,  705,  704,  703,
      702,  700,  699,  698,  697,  696,  695,  694,  693,  692,

      691,  690,  689,  688,  687,  686,  685,  684,  683,  682,
      681,  680,  679,  678,  677,  676,  675,  674,  673,  671,
      670,  669,  668,  667,  666,  665,  663,  662,  659,  657,
      656,  655,  653,  652,  651,  650,  649,  648,  647,  646,
      645,  644,  643,  642,  641,  638,  637,  636,  635,  634,
      633,  631,  630,  629,  628,  626,  625,  624,  623,  622,
      621,  620,  619,  618,  617,  616,  615,  614,  613,  608,
      606,  605,  604,  603,  602,  598,  597,  596,  595,  594,
      593,  592,  591,  590,  588,  587,  583,  582,  580,  579,
      577,  576,  575,  574,  573,  572,  571,  567,  566,  565,

      563,  561,  560,  559,  558,  557,  556,  555,  554,  553,
      552,  550,  549,  544,  543,  542,  541,  539,  538,  536,
      535,  534,  533,  532,  530,  529,  527,  526,  525,  524,
      523,  522,  521,  520,  518,  517,  516,  515,  514,  510,
      509,  508,  507,  506,  505,  502,  501,  500,  499,  498,
      497,  496,  495,  494,  493,  492,  490,  489,  486,  481,
      479,  478,  477,  475,  474,  471,  470,  469,  468,  457,
      456,  455,  453,  452,  451,  450,  449,  446,  444,  443,
      442,  440,  439,  438,  437,  435,  433,  432,  427,  426,
      424,  423,  422,  421,  420,  419,  418,  417,  416,  415,

      414,  412,  411,  410,  409,  408,  407,  406,  404,  403,
      402,  401,  400,  399,  398,  394,  390,  389,  388,  385,
      383,  373,  371,  367,  366,  365,  364,  362,  361,  359,
      354,  353,  352,  351,  350,  349,  344,  342,  341,  340,
      339,  338,  336,  335,  332,  331,  330,  329,  328,  327,
      326,  325,  324,  323,  322,  321,  320,  319,  318,  317,
      316,  315,  314,  313,  312,  311,  310,  309,  308,  307,
      306,  303,  301,  300,  299,  298,  297,  296,  295,  294,
      292,  288,  286,  285,  284,  283,  279,  278,  277,  276,
      275,  274,  273,  272,  271,  267,  265,  264,  263,  256,

      255,  254,  253,  251,  250,  249,  248,  247,  245,  244,
      243,  242,  241,  240,  239,  238,  237,  236,  235,  234,
      233,  232,  231,  230,  228,  227,  226,  225,  224,  223,
      222,  221,  220,  219,  218,  216,  215,  214,  213,  212,
      211,  210,  209,  208,  207,  206,  205,  204,  203,  202,
      201,  200,  198,  197,  196,  195,  194,  193,  192,  191,
      190,  189,  188,  187,  185,  184,  183,  182,  180,  179,
      178,  177,  176,  174,  157,  156,  154,  153,  152,  148,
      147,  146,  145,  144,  141,  140,  139,  138,  136,  135,
      133,  131,  130,  129,  127,  126,  125,  123,  122,  120,

      119,  118,  117,  116,  115,  112,  111,  110,  109,  108,
      107,  106,  105,  103,  102,  101,  100,   99,   98,   96,
       95,   91,   87,   60,   48,   46,   40,   27,   24,   16,
       11,    7,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,
      827,  827,  827,  827,  827,  827,  827,  827,  827,  827,

      827,  827,  827,  827,  827
    } ;

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

/* 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
/*
//
// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

This file contains the Lex specification for GLSL ES.
Based on ANSI C grammar, Lex specification:
http://www.lysator.liu.se/c/ANSI-C-grammar-l.html

IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh,
WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp).
*/

#include "glslang.h"
#include "ParseHelper.h"
#include "preprocessor/Token.h"
#include "util.h"
#include "glslang_tab.h"

/* windows only pragma */
#ifdef _MSC_VER
#pragma warning(disable : 4102)
#endif

#define YY_USER_ACTION                                 \
    yylloc->first_file = yylloc->last_file = yycolumn; \
    yylloc->first_line = yylloc->last_line = yylineno;

#define YY_INPUT(buf, result, max_size) \
    result = string_input(buf, max_size, yyscanner);

static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner);
static int check_type(yyscan_t yyscanner);
static int reserved_word(yyscan_t yyscanner);
static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
static int ES2_identifier_ES3_keyword(TParseContext *context, int token);
static int uint_constant(TParseContext *context);
static int int_constant(yyscan_t yyscanner);
static int float_constant(yyscan_t yyscanner);
static int floatsuffix_check(TParseContext* context);

#define INITIAL 0
#define COMMENT 1
#define FIELDS 2

#define YY_EXTRA_TYPE TParseContext*

/* 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 yylex_init (yyscan_t* scanner);

int 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 yylex_destroy (yyscan_t yyscanner );

int yyget_debug (yyscan_t yyscanner );

void yyset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner );

void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *yyget_in (yyscan_t yyscanner );

void yyset_in  (FILE * in_str ,yyscan_t yyscanner );

FILE *yyget_out (yyscan_t yyscanner );

void yyset_out  (FILE * out_str ,yyscan_t yyscanner );

yy_size_t yyget_leng (yyscan_t yyscanner );

char *yyget_text (yyscan_t yyscanner );

int yyget_lineno (yyscan_t yyscanner );

void yyset_lineno (int line_number ,yyscan_t yyscanner );

int yyget_column  (yyscan_t yyscanner );

void yyset_column (int column_no ,yyscan_t yyscanner );

YYSTYPE * yyget_lval (yyscan_t yyscanner );

void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );

       YYLTYPE *yyget_lloc (yyscan_t yyscanner );
    
        void 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 yywrap (yyscan_t yyscanner );
#else
extern int yywrap (yyscan_t yyscanner );
#endif
#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

    static void yy_push_state (int new_state ,yyscan_t yyscanner);
    
    static void yy_pop_state (yyscan_t yyscanner );
    
    static int yy_top_state (yyscan_t yyscanner );
    
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#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 yylex \
               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);

#define YY_DECL int 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 break;
#endif

#define YY_RULE_SETUP \
	YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
	register yy_state_type yy_current_state;
	register char *yy_cp, *yy_bp;
	register 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 ) {
			yyensure_buffer_stack (yyscanner);
			YY_CURRENT_BUFFER_LVALUE =
				yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
		}

		yy_load_buffer_state(yyscanner );
		}

	{

    TParseContext* context = yyextra;

    /* Single-line comments */

	while ( 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
			{
			register 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 >= 828 )
					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 != 827 );
		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
;
	YY_BREAK
/* Multi-line comments */
case 2:
YY_RULE_SETUP
{ yy_push_state(COMMENT, yyscanner); }
	YY_BREAK
case 3:
case 4:
/* rule 4 can match eol */
YY_RULE_SETUP
;
	YY_BREAK
case 5:
YY_RULE_SETUP
{ yy_pop_state(yyscanner); }
	YY_BREAK
case 6:
YY_RULE_SETUP
{ return(INVARIANT); }
	YY_BREAK
case 7:
YY_RULE_SETUP
{ return(HIGH_PRECISION); }
	YY_BREAK
case 8:
YY_RULE_SETUP
{ return(MEDIUM_PRECISION); }
	YY_BREAK
case 9:
YY_RULE_SETUP
{ return(LOW_PRECISION); }
	YY_BREAK
case 10:
YY_RULE_SETUP
{ return(PRECISION); }
	YY_BREAK
case 11:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, ATTRIBUTE); }
	YY_BREAK
case 12:
YY_RULE_SETUP
{ return(CONST_QUAL); }
	YY_BREAK
case 13:
YY_RULE_SETUP
{ return(UNIFORM); }
	YY_BREAK
case 14:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, VARYING); }
	YY_BREAK
case 15:
YY_RULE_SETUP
{ return(BREAK); }
	YY_BREAK
case 16:
YY_RULE_SETUP
{ return(CONTINUE); }
	YY_BREAK
case 17:
YY_RULE_SETUP
{ return(DO); }
	YY_BREAK
case 18:
YY_RULE_SETUP
{ return(FOR); }
	YY_BREAK
case 19:
YY_RULE_SETUP
{ return(WHILE); }
	YY_BREAK
case 20:
YY_RULE_SETUP
{ return(IF); }
	YY_BREAK
case 21:
YY_RULE_SETUP
{ return(ELSE); }
	YY_BREAK
case 22:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SWITCH); }
	YY_BREAK
case 23:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, CASE); }
	YY_BREAK
case 24:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, DEFAULT); }
	YY_BREAK
case 25:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, CENTROID); }
	YY_BREAK
case 26:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, FLAT); }
	YY_BREAK
case 27:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SMOOTH); }
	YY_BREAK
case 28:
YY_RULE_SETUP
{ return(IN_QUAL); }
	YY_BREAK
case 29:
YY_RULE_SETUP
{ return(OUT_QUAL); }
	YY_BREAK
case 30:
YY_RULE_SETUP
{ return(INOUT_QUAL); }
	YY_BREAK
case 31:
YY_RULE_SETUP
{ context->lexAfterType = true; return(FLOAT_TYPE); }
	YY_BREAK
case 32:
YY_RULE_SETUP
{ context->lexAfterType = true; return(INT_TYPE); }
	YY_BREAK
case 33:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UINT_TYPE); }
	YY_BREAK
case 34:
YY_RULE_SETUP
{ context->lexAfterType = true; return(VOID_TYPE); }
	YY_BREAK
case 35:
YY_RULE_SETUP
{ context->lexAfterType = true; return(BOOL_TYPE); }
	YY_BREAK
case 36:
YY_RULE_SETUP
{ yylval->lex.b = true;  return(BOOLCONSTANT); }
	YY_BREAK
case 37:
YY_RULE_SETUP
{ yylval->lex.b = false; return(BOOLCONSTANT); }
	YY_BREAK
case 38:
YY_RULE_SETUP
{ return(DISCARD); }
	YY_BREAK
case 39:
YY_RULE_SETUP
{ return(RETURN); }
	YY_BREAK
case 40:
YY_RULE_SETUP
{ context->lexAfterType = true; return(MATRIX2); }
	YY_BREAK
case 41:
YY_RULE_SETUP
{ context->lexAfterType = true; return(MATRIX3); }
	YY_BREAK
case 42:
YY_RULE_SETUP
{ context->lexAfterType = true; return(MATRIX4); }
	YY_BREAK
case 43:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX2); }
	YY_BREAK
case 44:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX3); }
	YY_BREAK
case 45:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX4); }
	YY_BREAK
case 46:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX2x3); }
	YY_BREAK
case 47:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX3x2); }
	YY_BREAK
case 48:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX2x4); }
	YY_BREAK
case 49:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX4x2); }
	YY_BREAK
case 50:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX3x4); }
	YY_BREAK
case 51:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX4x3); }
	YY_BREAK
case 52:
YY_RULE_SETUP
{ context->lexAfterType = true; return (VEC2); }
	YY_BREAK
case 53:
YY_RULE_SETUP
{ context->lexAfterType = true; return (VEC3); }
	YY_BREAK
case 54:
YY_RULE_SETUP
{ context->lexAfterType = true; return (VEC4); }
	YY_BREAK
case 55:
YY_RULE_SETUP
{ context->lexAfterType = true; return (IVEC2); }
	YY_BREAK
case 56:
YY_RULE_SETUP
{ context->lexAfterType = true; return (IVEC3); }
	YY_BREAK
case 57:
YY_RULE_SETUP
{ context->lexAfterType = true; return (IVEC4); }
	YY_BREAK
case 58:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UVEC2); }
	YY_BREAK
case 59:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UVEC3); }
	YY_BREAK
case 60:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UVEC4); }
	YY_BREAK
case 61:
YY_RULE_SETUP
{ context->lexAfterType = true; return (BVEC2); }
	YY_BREAK
case 62:
YY_RULE_SETUP
{ context->lexAfterType = true; return (BVEC3); }
	YY_BREAK
case 63:
YY_RULE_SETUP
{ context->lexAfterType = true; return (BVEC4); }
	YY_BREAK
case 64:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER2D; }
	YY_BREAK
case 65:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLERCUBE; }
	YY_BREAK
case 66:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER_EXTERNAL_OES; }
	YY_BREAK
case 67:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER3D; }
	YY_BREAK
case 68:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
	YY_BREAK
case 69:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAY); }
	YY_BREAK
case 70:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2D); }
	YY_BREAK
case 71:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLER3D); }
	YY_BREAK
case 72:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLERCUBE); }
	YY_BREAK
case 73:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2DARRAY); }
	YY_BREAK
case 74:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLER2D); }
	YY_BREAK
case 75:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLER3D); }
	YY_BREAK
case 76:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLERCUBE); }
	YY_BREAK
case 77:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLER2DARRAY); }
	YY_BREAK
case 78:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
	YY_BREAK
case 79:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, SAMPLERCUBESHADOW); }
	YY_BREAK
case 80:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
	YY_BREAK
case 81:
YY_RULE_SETUP
{ context->lexAfterType = true; return(STRUCT); }
	YY_BREAK
case 82:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, LAYOUT); }
	YY_BREAK
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
case 83:
case 84:
case 85:
case 86:
case 87:
case 88:
case 89:
case 90:
case 91:
case 92:
case 93:
case 94:
case 95:
case 96:
case 97:
case 98:
case 99:
case 100:
case 101:
case 102:
case 103:
case 104:
case 105:
case 106:
case 107:
case 108:
case 109:
case 110:
case 111:
case 112:
case 113:
case 114:
case 115:
case 116:
case 117:
case 118:
case 119:
case 120:
case 121:
case 122:
case 123:
case 124:
case 125:
case 126:
case 127:
case 128:
case 129:
case 130:
case 131:
case 132:
case 133:
case 134:
case 135:
case 136:
case 137:
case 138:
YY_RULE_SETUP
{ 
    if (context->getShaderVersion() < 300) {
		yylval->lex.string = NewPoolTString(yytext); 
	    return check_type(yyscanner); 
	}
	return reserved_word(yyscanner);
}
	YY_BREAK
/* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */
case 139:
YY_RULE_SETUP
{
    if (context->getShaderVersion() >= 300)
    {
        yylval->lex.string = NewPoolTString(yytext);
        return check_type(yyscanner);
    }

    return reserved_word(yyscanner);
}
	YY_BREAK
/* Reserved keywords */
case 140:
case 141:
case 142:
case 143:
case 144:
case 145:
case 146:
case 147:
case 148:
case 149:
case 150:
case 151:
case 152:
case 153:
case 154:
case 155:
case 156:
case 157:
case 158:
case 159:
case 160:
case 161:
case 162:
case 163:
case 164:
case 165:
case 166:
case 167:
case 168:
case 169:
case 170:
case 171:
case 172:
case 173:
case 174:
case 175:
case 176:
case 177:
case 178:
case 179:
case 180:
case 181:
YY_RULE_SETUP
{ return reserved_word(yyscanner); }
	YY_BREAK
case 182:
YY_RULE_SETUP
{
   yylval->lex.string = NewPoolTString(yytext); 
   return check_type(yyscanner);
}
	YY_BREAK
case 183:
YY_RULE_SETUP
{ return int_constant(yyscanner); }
	YY_BREAK
case 184:
YY_RULE_SETUP
{ return int_constant(yyscanner); }
	YY_BREAK
case 185:
YY_RULE_SETUP
{ return int_constant(yyscanner); }
	YY_BREAK
case 186:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 187:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 188:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 189:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 190:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 191:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 192:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 193:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 194:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 195:
YY_RULE_SETUP
{  return(ADD_ASSIGN); }
	YY_BREAK
case 196:
YY_RULE_SETUP
{  return(SUB_ASSIGN); }
	YY_BREAK
case 197:
YY_RULE_SETUP
{  return(MUL_ASSIGN); }
	YY_BREAK
case 198:
YY_RULE_SETUP
{  return(DIV_ASSIGN); }
	YY_BREAK
case 199:
YY_RULE_SETUP
{  return(MOD_ASSIGN); }
	YY_BREAK
case 200:
YY_RULE_SETUP
{  return(LEFT_ASSIGN); }
	YY_BREAK
case 201:
YY_RULE_SETUP
{  return(RIGHT_ASSIGN); }
	YY_BREAK
case 202:
YY_RULE_SETUP
{  return(AND_ASSIGN); }
	YY_BREAK
case 203:
YY_RULE_SETUP
{  return(XOR_ASSIGN); }
	YY_BREAK
case 204:
YY_RULE_SETUP
{  return(OR_ASSIGN); }
	YY_BREAK
case 205:
YY_RULE_SETUP
{  return(INC_OP); }
	YY_BREAK
case 206:
YY_RULE_SETUP
{  return(DEC_OP); }
	YY_BREAK
case 207:
YY_RULE_SETUP
{  return(AND_OP); }
	YY_BREAK
case 208:
YY_RULE_SETUP
{  return(OR_OP); }
	YY_BREAK
case 209:
YY_RULE_SETUP
{  return(XOR_OP); }
	YY_BREAK
case 210:
YY_RULE_SETUP
{  return(LE_OP); }
	YY_BREAK
case 211:
YY_RULE_SETUP
{  return(GE_OP); }
	YY_BREAK
case 212:
YY_RULE_SETUP
{  return(EQ_OP); }
	YY_BREAK
case 213:
YY_RULE_SETUP
{  return(NE_OP); }
	YY_BREAK
case 214:
YY_RULE_SETUP
{  return(LEFT_OP); }
	YY_BREAK
case 215:
YY_RULE_SETUP
{  return(RIGHT_OP); }
	YY_BREAK
case 216:
YY_RULE_SETUP
{ context->lexAfterType = false; return(SEMICOLON); }
	YY_BREAK
case 217:
YY_RULE_SETUP
{ context->lexAfterType = false; return(LEFT_BRACE); }
	YY_BREAK
case 218:
YY_RULE_SETUP
{ return(RIGHT_BRACE); }
	YY_BREAK
case 219:
YY_RULE_SETUP
{ if (context->inTypeParen) context->lexAfterType = false; return(COMMA); }
	YY_BREAK
case 220:
YY_RULE_SETUP
{ return(COLON); }
	YY_BREAK
case 221:
YY_RULE_SETUP
{ context->lexAfterType = false; return(EQUAL); }
	YY_BREAK
case 222:
YY_RULE_SETUP
{ context->lexAfterType = false; context->inTypeParen = true; return(LEFT_PAREN); }
	YY_BREAK
case 223:
YY_RULE_SETUP
{ context->inTypeParen = false; return(RIGHT_PAREN); }
	YY_BREAK
case 224:
YY_RULE_SETUP
{ return(LEFT_BRACKET); }
	YY_BREAK
case 225:
YY_RULE_SETUP
{ return(RIGHT_BRACKET); }
	YY_BREAK
case 226:
YY_RULE_SETUP
{ BEGIN(FIELDS);  return(DOT); }
	YY_BREAK
case 227:
YY_RULE_SETUP
{ return(BANG); }
	YY_BREAK
case 228:
YY_RULE_SETUP
{ return(DASH); }
	YY_BREAK
case 229:
YY_RULE_SETUP
{ return(TILDE); }
	YY_BREAK
case 230:
YY_RULE_SETUP
{ return(PLUS); }
	YY_BREAK
case 231:
YY_RULE_SETUP
{ return(STAR); }
	YY_BREAK
case 232:
YY_RULE_SETUP
{ return(SLASH); }
	YY_BREAK
case 233:
YY_RULE_SETUP
{ return(PERCENT); }
	YY_BREAK
case 234:
YY_RULE_SETUP
{ return(LEFT_ANGLE); }
	YY_BREAK
case 235:
YY_RULE_SETUP
{ return(RIGHT_ANGLE); }
	YY_BREAK
case 236:
YY_RULE_SETUP
{ return(VERTICAL_BAR); }
	YY_BREAK
case 237:
YY_RULE_SETUP
{ return(CARET); }
	YY_BREAK
case 238:
YY_RULE_SETUP
{ return(AMPERSAND); }
	YY_BREAK
case 239:
YY_RULE_SETUP
{ return(QUESTION); }
	YY_BREAK
case 240:
YY_RULE_SETUP
{ 
    BEGIN(INITIAL);
    yylval->lex.string = NewPoolTString(yytext); 
    return FIELD_SELECTION;
}
	YY_BREAK
case 241:
YY_RULE_SETUP
{}
	YY_BREAK
case 242:
/* rule 242 can match eol */
YY_RULE_SETUP
{  }
	YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(COMMENT):
case YY_STATE_EOF(FIELDS):
{ context->AfterEOF = true; yyterminate(); }
	YY_BREAK
case 243:
YY_RULE_SETUP
{ context->warning(*yylloc, "Unknown char", yytext, ""); return 0; }
	YY_BREAK
case 244:
YY_RULE_SETUP
ECHO;
	YY_BREAK

	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
			 * 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 ( 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 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;
	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	register char *source = yyg->yytext_ptr;
	register int 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 = (int) (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. */
					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;
			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 *) 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)
{
	register yy_state_type yy_current_state;
	register 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 )
		{
		register 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 >= 828 )
				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)
{
	register int yy_is_jam;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
	register char *yy_cp = yyg->yy_c_buf_p;

	register 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 >= 828 )
			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 == 827);

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

#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. */
					yyrestart(yyin ,yyscanner);

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( 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 yyrestart  (FILE * input_file , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

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

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

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * @param yyscanner The scanner object.
 */
    void 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
	 *		yypop_buffer_state();
	 *		yypush_buffer_state(new_buffer);
     */
	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;
	yy_load_buffer_state(yyscanner );

	/* 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.
	 */
	yyg->yy_did_buffer_switch_on_eof = 1;
}

static void 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 yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
	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(b->yy_buf_size + 2 ,yyscanner );
	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 ,yyscanner);

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * @param yyscanner The scanner object.
 */
    void 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 )
		yyfree((void *) b->yy_ch_buf ,yyscanner );

	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 yyrestart() or at EOF.
 */
    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)

{
	int oerrno = errno;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	yy_flush_buffer(b ,yyscanner);

	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.
 * @param yyscanner The scanner object.
 */
    void 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 )
		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 yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (new_buffer == NULL)
		return;

	yyensure_buffer_stack(yyscanner);

	/* This block is copied from 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 yy_switch_to_buffer. */
	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 yypop_buffer_state (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (!YY_CURRENT_BUFFER)
		return;

	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) {
		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 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;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								, yyscanner);
		if ( ! yyg->yy_buffer_stack )
			YY_FATAL_ERROR( "out of dynamic memory in 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. */
		int grow_size = 8 /* arbitrary grow size */;

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

	yy_switch_to_buffer(b ,yyscanner );

	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
 * @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
 *       yy_scan_bytes() instead.
 */
YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
{
    
	return yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
}

/** 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.
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE 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 *) yyalloc(n ,yyscanner );
	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 ,yyscanner);
	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;
}

    static void yy_push_state (int  new_state , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth )
		{
		yy_size_t new_size;

		yyg->yy_start_stack_depth += YY_START_STACK_INCR;
		new_size = yyg->yy_start_stack_depth * sizeof( int );

		if ( ! yyg->yy_start_stack )
			yyg->yy_start_stack = (int *) yyalloc(new_size ,yyscanner );

		else
			yyg->yy_start_stack = (int *) yyrealloc((void *) yyg->yy_start_stack,new_size ,yyscanner );

		if ( ! yyg->yy_start_stack )
			YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
		}

	yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START;

	BEGIN(new_state);
}

    static void yy_pop_state  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if ( --yyg->yy_start_stack_ptr < 0 )
		YY_FATAL_ERROR( "start-condition stack underflow" );

	BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]);
}

    static int yy_top_state  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1];
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
{
    	(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 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 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 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 *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 *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 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 *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 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
 * @param yyscanner The scanner object.
 */
void 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( "yyset_lineno called with no buffer" );
    
    yylineno = line_number;
}

/** Set the current column.
 * @param line_number
 * @param yyscanner The scanner object.
 */
void 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( "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 yy_switch_to_buffer
 */
void yyset_in (FILE *  in_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyin = in_str ;
}

void yyset_out (FILE *  out_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyout = out_str ;
}

int yyget_debug  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yy_flex_debug;
}

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

void yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yylval = yylval_param;
}

YYLTYPE *yyget_lloc  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yylloc;
}
    
void yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yylloc = yylloc_param;
}
    
/* User-visible API */

/* 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 yylex_init(yyscan_t* ptr_yy_globals)

{
    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }

    *ptr_yy_globals = (yyscan_t) 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 );
}

/* yylex_init_extra has the same functionality as 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 yyalloc in
 * the yyextra field.
 */

int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )

{
    struct yyguts_t dummy_yyguts;

    yyset_extra (yy_user_defined, &dummy_yyguts);

    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }
	
    *ptr_yy_globals = (yyscan_t) 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));
    
    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 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
     * yylex_init()
     */
    return 0;
}

/* yylex_destroy is for both reentrant and non-reentrant scanners. */
int yylex_destroy  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
		YY_CURRENT_BUFFER_LVALUE = NULL;
		yypop_buffer_state(yyscanner);
	}

	/* Destroy the stack itself. */
	yyfree(yyg->yy_buffer_stack ,yyscanner);
	yyg->yy_buffer_stack = NULL;

    /* Destroy the start condition stack. */
        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
     * yylex() is called, initialization will occur. */
    yy_init_globals( yyscanner);

    /* Destroy the main struct (reentrant only). */
    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)
{
	register 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)
{
	register int n;
	for ( n = 0; s[n]; ++n )
		;

	return n;
}
#endif

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

void *yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
{
	/* 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 yyfree (void * ptr , yyscan_t yyscanner)
{
	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
    pp::Token token;
    yyget_extra(yyscanner)->getPreprocessor().lex(&token);
    yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size();
    if (len < max_size)
        memcpy(buf, token.text.c_str(), len);
    yyset_column(token.location.file,yyscanner);
    yyset_lineno(token.location.line,yyscanner);

    if (len >= max_size)
        YY_FATAL_ERROR("Input buffer overflow");
    else if (len > 0)
        buf[len++] = ' ';
    return len;
}

int check_type(yyscan_t yyscanner) {
    struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
    
    int token = IDENTIFIER;
    TSymbol* symbol = yyextra->symbolTable.find(yytext, yyextra->getShaderVersion());
    if (yyextra->lexAfterType == false && symbol && symbol->isVariable()) {
        TVariable* variable = static_cast<TVariable*>(symbol);
        if (variable->isUserType()) {
            yyextra->lexAfterType = true;
            token = TYPE_NAME;
        }
    }
    yylval->lex.symbol = symbol;
    return token;
}

int reserved_word(yyscan_t yyscanner) {
    struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;

    yyextra->error(*yylloc, "Illegal use of reserved word", yytext, "");
    yyextra->recover();
    return 0;
}

int ES2_reserved_ES3_keyword(TParseContext *context, int token)
{
    yyscan_t yyscanner = (yyscan_t) context->getScanner();

    if (context->getShaderVersion() < 300)
    {
        return reserved_word(yyscanner);
    }

    return token;
}

int ES2_keyword_ES3_reserved(TParseContext *context, int token)
{
    yyscan_t yyscanner = (yyscan_t) context->getScanner();

    if (context->getShaderVersion() >= 300)
    {
        return reserved_word(yyscanner);
    }

    return token;
}

int ES2_identifier_ES3_keyword(TParseContext *context, int token)
{
    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
    yyscan_t yyscanner = (yyscan_t) context->getScanner();

    // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
    if (context->getShaderVersion() < 300)
    {
        yylval->lex.string = NewPoolTString(yytext);
        return check_type(yyscanner);
    }

    return token;
}

int uint_constant(TParseContext *context)
{
    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
    yyscan_t yyscanner = (yyscan_t) context->getScanner();

    if (context->getShaderVersion() < 300)
    {
        context->error(*yylloc, "Unsigned integers are unsupported prior to GLSL ES 3.00", yytext, "");
        context->recover();
        return 0;
    }

    if (!atoi_clamp(yytext, &(yylval->lex.i)))
        yyextra->warning(*yylloc, "Integer overflow", yytext, "");

    return UINTCONSTANT;
}

int floatsuffix_check(TParseContext* context)
{
    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();

    if (context->getShaderVersion() < 300)
    {
        context->error(*yylloc, "Floating-point suffix unsupported prior to GLSL ES 3.00", yytext);
        context->recover();
        return 0;
    }

    if (!atof_clamp(yytext, &(yylval->lex.f)))
        yyextra->warning(*yylloc, "Float overflow", yytext, "");

    return(FLOATCONSTANT);
}

int int_constant(yyscan_t yyscanner) {
    struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;

    if (!atoi_clamp(yytext, &(yylval->lex.i)))
        yyextra->warning(*yylloc, "Integer overflow", yytext, "");
    return INTCONSTANT;
}

int float_constant(yyscan_t yyscanner) {
    struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;

    if (!atof_clamp(yytext, &(yylval->lex.f)))
        yyextra->warning(*yylloc, "Float overflow", yytext, "");
    return FLOATCONSTANT;
}

void yyerror(YYLTYPE* lloc, TParseContext* context, void* scanner, const char* reason) {
    struct yyguts_t* yyg = (struct yyguts_t*) scanner;

    if (context->AfterEOF) {
        context->error(*lloc, reason, "unexpected EOF");
    } else {
        context->error(*lloc, reason, yytext);
    }
    context->recover();
}

int glslang_initialize(TParseContext* context) {
    yyscan_t scanner = NULL;
    if (yylex_init_extra(context,&scanner))
        return 1;

    context->setScanner(scanner);
    return 0;
}

int glslang_finalize(TParseContext* context) {
    yyscan_t scanner = context->getScanner();
    if (scanner == NULL) return 0;
    
    context->setScanner(NULL);
    yylex_destroy(scanner);

    return 0;
}

int glslang_scan(size_t count, const char* const string[], const int length[],
                 TParseContext* context) {
    yyrestart(NULL,context->getScanner());
    yyset_column(0,context->getScanner());
    yyset_lineno(1,context->getScanner());
    context->AfterEOF = false;

    // Initialize preprocessor.
    if (!context->getPreprocessor().init(count, string, length))
        return 1;

    // Define extension macros.
    const TExtensionBehavior& extBehavior = context->extensionBehavior();
    for (TExtensionBehavior::const_iterator iter = extBehavior.begin();
         iter != extBehavior.end(); ++iter)
    {
        context->getPreprocessor().predefineMacro(iter->first.c_str(), 1);
    }

    context->getPreprocessor().predefineMacro("GL_FRAGMENT_PRECISION_HIGH", 1);

    return 0;
}

