#line 25 "./glslang.l"
// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// 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



#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */










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

















    
#ifdef yyget_lval
#define yyget_lval_ALREADY_DEFINED
#else
#define yyget_lval yyget_lval
#endif

    
#ifdef yyset_lval
#define yyset_lval_ALREADY_DEFINED
#else
#define yyset_lval yyset_lval
#endif




    
#ifdef yyget_lloc
#define yyget_lloc_ALREADY_DEFINED
#else
#define yyget_lloc yyget_lloc
#endif

    
#ifdef yyset_lloc
#define yyset_lloc_ALREADY_DEFINED
#else
#define yyset_lloc yyset_lloc
#endif











/* First, we deal with  platform-specific or compiler-specific issues. */

/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L

/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
 * if you want the limit (max/min) macros for int types. 
 */
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif

#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t; 
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;

/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN               (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN              (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN              (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX               (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX              (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX              (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX              (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX             (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX             (4294967295U)
#endif

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

#endif /* ! C99 */

#endif /* ! FLEXINT_H */


/* begin standard C++ headers. */

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

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

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


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





/* 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
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
 * Ditto for the __ia64__ case accordingly.
 */
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#endif


/* The state buf must be large enough to hold one state per character in the main buffer.
 */
#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))



#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif




#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2
    
    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
     *       access to the local variable yy_act. Since yyless() is a macro, it would break
     *       existing scanners that call yyless() from OUTSIDE 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.
	 */
	int yy_buf_size;

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	int yy_n_chars;

	/* Whether we "own" the buffer - i.e., we know we created it,
	 * and can realloc() it to grow it, and should free() it to
	 * delete it.
	 */
	int yy_is_our_buffer;

	/* Whether this is an "interactive" input source; if so, and
	 * if we're using stdio for input, then we want to use getc()
	 * instead of fread(), to make sure we stop fetching input after
	 * each newline.
	 */
	int yy_is_interactive;

	/* Whether we're considered to be at the beginning of a line.
	 * If so, '^' rules will be active on the next match, otherwise
	 * not.
	 */
	int yy_at_bol;

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */


	/* Whether to try to fill the input buffer when we reach the
	 * end of it.
	 */
	int yy_fill_buffer;

	int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via yyrestart()), so that the user can continue scanning by
	 * just pointing yyin at a new input file.
	 */
#define YY_BUFFER_EOF_PENDING 2

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */




/* 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 ( const char *yy_str , yyscan_t yyscanner );
YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int 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) (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
typedef flex_uint8_t 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 yynoreturn yy_fatal_error ( const 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 = (int) (yy_cp - yy_bp); \
	yyg->yy_hold_char = *yy_cp; \
	*yy_cp = '\0'; \
	yyg->yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 239
#define YY_END_OF_BUFFER 240
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
	{
	flex_int32_t yy_verify;
	flex_int32_t yy_nxt;
	};
static const flex_int16_t yy_accept[821] =
    {   0,
        0,    0,    0,    0,    0,    0,  240,  238,  237,  237,
      222,  228,  233,  217,  218,  226,  225,  214,  223,  221,
      227,  180,  180,  215,  211,  229,  216,  230,  234,  177,
      219,  220,  232,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  212,  231,  213,  224,  239,  236,  235,
      208,  194,  213,  202,  197,  192,  200,  190,  201,  191,
      186,  193,  185,  179,  180,    0,  183,    0,  220,  212,
      219,  209,  205,  207,  206,  210,  177,  198,  204,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,

      177,   12,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,   15,  177,  177,   23,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  199,  203,  235,    0,  189,  185,    0,  188,
      182,    0,  184,  178,  195,  196,  177,  136,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,   13,  177,  177,  177,  177,  177,  177,  177,  177,

      177,  177,   27,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,   24,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,    0,
      186,    0,  185,  187,  181,  177,  177,  177,   30,  177,
      177,   18,  174,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,   16,  139,  177,  177,  177,  177,   21,
      177,  177,  143,  155,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  152,    4,   35,   36,

       37,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  142,   31,  177,  177,   28,
      177,  177,  177,  177,  177,  177,  177,   47,   48,   49,
       29,  177,  177,  177,  177,  177,  177,   10,   56,   57,
       58,  177,  137,  177,  177,    7,  177,  177,  177,  177,
      164,  165,  166,  177,   32,  177,  156,   26,  167,  168,
      169,    2,  161,  162,  163,  177,  177,  177,   25,  159,
      177,  177,  177,   50,   51,   52,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,   86,  177,  177,

      177,  177,  177,  177,  177,  153,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  138,  177,  177,
      176,   53,   54,   55,  177,  177,   14,  177,   91,  177,
      177,  177,  177,   89,  177,  177,  177,  154,  149,   92,
      177,  177,  177,  177,  177,  177,  144,  177,  177,  177,
       78,   38,   41,   43,   42,   39,   45,   44,   46,   40,
      177,  177,  177,  177,  160,  135,  177,  177,  147,  177,
      177,  177,   34,   87,  173,   22,  148,   77,  177,  158,
       17,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,   19,   33,  177,  177,  177,

      177,  177,  177,   93,   94,   95,  177,  177,  177,  177,
      177,    3,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  140,  177,  177,  177,  177,  177,    8,
      177,  177,    9,  177,  177,  177,  177,   20,   79,   11,
      150,   97,   98,   99,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  145,  177,  177,  177,
       81,   83,   80,  177,  177,  177,  177,  177,  177,  177,
      141,  101,  102,  103,  177,  177,  157,  177,  146,  177,
      177,    6,  177,  177,  177,  177,  177,  177,  177,  177,
      177,   96,  151,    1,  177,  177,  177,  177,  177,  175,

      177,   90,    5,  170,   59,   63,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  177,   82,
      177,  177,  177,  177,  100,  177,  177,  177,  177,  177,
      120,   66,   67,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,   88,  177,  177,  177,
      104,  122,   70,   71,  177,  177,   84,  177,  177,  177,
      177,  177,  177,  177,  115,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  129,  177,  177,  177,  177,
       60,  177,  177,  177,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  116,  105,  177,  106,  177,  177,  177,

      130,  177,  177,   68,  177,  177,  177,  177,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  117,  177,  177,
      131,  177,  177,   72,  107,  108,  177,  111,  177,  112,
      177,  177,  177,  177,  177,   85,  177,  177,  177,  177,
       61,  177,   64,  126,  177,  177,  109,  110,  177,  177,
      177,  177,  177,  177,  177,  177,  177,  177,  124,  127,
      118,  177,   65,  177,  177,  177,  177,  177,  177,  177,
      177,  125,  128,  177,  177,  121,   69,  177,  177,  171,
      177,  177,  177,   74,  177,  177,  123,   73,  177,  177,
      177,  177,  177,  177,  132,  177,  177,  177,  177,  177,

      177,  133,  177,  177,  177,   75,  177,  134,  113,  114,
      177,  177,  177,   62,  177,  177,  172,  119,   76,    0
    } ;

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

static const flex_int16_t yy_base[827] =
    {   0,
        0,    0, 1019, 1018,   72,    0, 1020, 1023, 1023, 1023,
      994,  120,  141, 1023, 1023,  993,  138, 1023,  137,  135,
      992,  154,  208,  990, 1023,  154,  990,  132, 1023,    0,
     1023, 1023,  139,  130,  123,  140,  147,  133,  177,  956,
      186,  151,  139,  116,  161,  950,  173,  963,  193,  199,
      208,  215,  108, 1023,  184, 1023, 1023, 1023, 1023,    0,
     1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
      230, 1023,  235,  235,    0,  271, 1023,    0, 1023, 1023,
     1023,  986, 1023, 1023, 1023,  985,    0, 1023, 1023,  947,
      952,  152,  949,  957,  956,  943,  946,  957,  243,  951,

      939,  936,  949,  936,  933,  933,  939,  147,  248,  933,
      943,  929,  935,  938,  939,    0,  931,  941,  249,  940,
      935,  916,  177,  920,  933,  924,  184,  917,  250,  929,
      931,  257,  920,  917,  906,  915,  249,  257,  919,  915,
      917,  906,  909,  196,  217,  269,  918,  906,  918,  262,
      911,  910, 1023, 1023,    0,  311, 1023,  292,  328, 1023,
     1023,  335,  342,  257, 1023, 1023,  909,    0,  905,  900,
      904,  913,  910,  315,  894,  894,  905,  897,  215,  907,
      904,  904,  902,  899,  891,  897,  884,  882,  894,  880,
      896,    0,  893,  881,  888,  885,  889,  890,  883,  880,

      869,  868,  881,  884,  872,  880,  868,  874,  865,  316,
      870,  873,  864,  871,  860,  864,  855,  869,  868,  859,
      865,  307,  849,  852,  850,  860,  850,  845,  843,  845,
      855,  841,  843,  840,  851,  850,  853,  835,  316,  843,
      839,  837,  846,  825,  353,  843,  845,  834,  826,  363,
      370,  378,  389, 1023, 1023,  823,  833,  832,    0,  830,
      383,    0,    0,  823,  821,  821,  822,  817,  825,  814,
      831,  820,  394,    0,    0,  814,  824,  823,  823,    0,
      808,  397,    0,    0,  810,  400,  817,  818,  809,  803,
      802,  803,  802,  802,  406,  797,    0,    0,  793,  792,

      791,  793,  794,  799,  793,  789,  802,  797,  797,  795,
      794,  788,  782,  784,  783,  787,  779,  782,  777,  785,
      790,  778,  775,  787,  778,    0,    0,  784,  780,    0,
      772,  772,  777,  768,  775,  409,  772,    0,    0,    0,
        0,  762,  774,  773,  772,  773,  773,    0,    0,    0,
        0,  760,    0,  768,  759,    0,  758,  759,  753,  763,
        0,    0,    0,  754,    0,  750,    0,    0,    0,    0,
        0,    0,    0,    0,    0,  760,  413,  759,    0,    0,
      757,  753,  750,    0,    0,    0,  742,  415,  418,  427,
      747,  743,  748,  739,  737,  750,  735,    0,  735,  748,

      737,  733,  739,  734,  741,    0,  739,  736,  740,  724,
      722,  725,  731,  737,  732,  731,  719,    0,  721,  722,
        0,    0,    0,    0,  719,  722,    0,  716,    0,  729,
      709,  718,  713,    0,  706,  706,  719,    0,  721,    0,
      431,  734,  733,  732,  699,  698,    0,  715,  714,  709,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
      698,  711,  698,  695,    0,    0,  700,  699,    0,  696,
      703,  702,    0,  688,    0,    0,    0,    0,  685,    0,
        0,  684,  695,  434,  688,  694,  693,  690,  685,  682,
      675,  675,  688,  673,  685,    0,    0,  678,  701,  700,

      699,  666,  665,  427,  428,    0,  677,  680,  678,  667,
      663,    0,  675,  672,  671,  661,  660,  650,  667,  653,
      441,  661,  664,    0,  681,  680,  679,  646,  645,    0,
      659,  646,    0,  656,  649,  650,  653,    0,    0,    0,
        0,  673,  672,    0,  649,  652,  637,  644,  635,  642,
      643,  643,  642,  628,  451,  640,    0,  641,  630,  629,
        0,    0,    0,  654,  653,  652,  619,  618,  614,  622,
        0,  650,  649,    0,  626,  629,    0,  458,    0,  607,
      616,    0,  612,  611,  620,  620,  608,  622,  606,  620,
      615,    0,    0,    0,  632,  631,  630,  597,  596,    0,

      596,    0,    0,  434,  454,  620,  606,  609,  592,  604,
      592,  591,  600,  600,  617,  616,  615,  582,  581,    0,
      581,  582,  581,  591,    0,  594,  590,  592,  588,  575,
      606,  449,    0,  583,  586,  578,  570,  577,  568,  589,
      577,  573,  575,  573,  573,  572,    0,  560,  559,  569,
        0,  589,  462,    0,  566,  569,    0,  569,  568,  552,
      544,  552,  542,  550,    0,  547,  546,  567,  555,  553,
      553,  537,  540,  554,  538,  569,  549,  550,  547,  544,
      554,  531,  545,  544,  528,  527,  526,  547,  535,  533,
      533,  514,  513,    0,  541,  513,  539,  511,  515,  514,

      545,  525,  522,    0,  521,  524,  520,  522,  506,  503,
      516,  501,  502,  509,  503,  492,  491,    0,  497,  496,
      527,  507,  504,    0,    0,    0,  500,    0,  499,    0,
      505,  504,  488,  485,  486,    0,  478,  486,  476,  482,
      503,  482,    0,    0,  494,  493,    0,    0,  492,  491,
      475,  472,  473,  487,  486,  463,  462,  468,    0,    0,
      489,  461,  487,  479,  128,  151,  196,  227,  238,  269,
      277,    0,    0,  291,  319,    0,    0,  323,  321,    0,
      324,  354,  393,    0,  382,  405,    0,    0,  408,  396,
      420,  412,  438,  440,    0,  445,  429,  463,  429,  433,

      435,    0,  453,  454,  445,    0,  466,    0,    0,    0,
      447,  448,  442,    0,  443,  444,    0,    0,    0, 1023,
      509,  512,  515,  518,  519,  520
    } ;

static const flex_int16_t yy_def[827] =
    {   0,
      820,    1,  821,  821,  820,    5,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  822,
      820,  820,  820,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  820,  820,  820,  820,  820,  820,  823,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      824,  820,  825,   22,   23,  820,  820,  826,  820,  820,
      820,  820,  820,  820,  820,  820,  822,  820,  820,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  820,  820,  823,  820,  820,  825,  820,  820,
      820,  820,  820,  826,  820,  820,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  820,
      820,  820,  820,  820,  820,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,

      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
      822,  822,  822,  822,  822,  822,  822,  822,  822,    0,
      820,  820,  820,  820,  820,  820
    } ;

static const flex_int16_t yy_nxt[1096] =
    {   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,    8,   59,   58,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    8,    8,   60,

       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
       60,   60,    8,    8,    8,   60,   60,   60,   60,   60,
       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
        8,    8,    8,    8,   62,   63,   64,   67,   69,   71,
       71,   71,   71,   71,   71,   71,   85,   86,   80,  151,
      124,   70,   68,   88,  125,   65,   73,  152,   74,   74,
       74,   74,   74,   74,   75,   81,   90,   82,   83,  783,
       93,   89,   94,  122,   96,   76,   95,  104,   97,  105,
       91,   92,   77,   78,   98,  100,  123,   99,  106,  101,

      116,  188,   76,  117,  102,  126,  118,  119,  153,  169,
      103,  120,  189,  170,  121,  784,   77,  129,  127,   78,
       73,  107,   75,   75,   75,   75,   75,   75,   75,  108,
      113,  109,  130,  208,  110,  131,  213,  133,  114,   76,
      111,  209,  214,  785,  134,  135,   77,  140,  136,  115,
      141,  237,  238,  154,  137,  138,   76,  139,  142,  148,
      144,  156,  157,  149,  145,  143,  159,  160,  146,  239,
       77,  147,  150,  161,  820,  268,  269,  240,  156,  157,
      162,  786,  162,  159,  160,  163,  163,  163,  163,  163,
      163,  163,  190,  228,  177,  255,  216,  161,  178,  179,

      820,  221,  230,  200,  787,  191,  201,  202,  229,  217,
      203,  218,  204,  241,  246,  231,  247,  222,  223,  255,
      250,  242,  250,  159,  160,  251,  251,  251,  251,  251,
      251,  251,  299,  300,  301,  788,  789,  252,  790,  252,
      159,  160,  253,  253,  253,  253,  253,  253,  253,  163,
      163,  163,  163,  163,  163,  163,  163,  163,  163,  163,
      163,  163,  163,  262,  313,  331,  791,  792,  314,  338,
      339,  340,  793,  332,  254,  794,  263,  251,  251,  251,
      251,  251,  251,  251,  251,  251,  251,  251,  251,  251,
      251,  254,  253,  253,  253,  253,  253,  253,  253,  349,

      350,  351,  157,  253,  253,  253,  253,  253,  253,  253,
      361,  362,  363,  369,  370,  371,  373,  374,  375,  157,
      795,  160,  384,  385,  386,  422,  423,  424,  442,  443,
      444,  452,  453,  454,  455,  456,  457,  796,  160,  797,
      798,  445,  446,  458,  459,  460,  499,  500,  501,  525,
      526,  527,  799,  800,  547,  549,  564,  565,  566,  502,
      503,  637,  528,  529,  548,  550,  595,  596,  597,  567,
      568,  638,  569,  615,  616,  617,  667,  801,  802,  598,
      599,  639,  803,  668,  804,  669,  618,  619,  640,  687,
      641,  642,  805,  806,  807,  808,  688,  809,  689,  810,

      811,  812,  813,  814,  815,  816,  817,  818,  819,    8,
        8,    8,    8,   87,   87,   87,  155,  155,  155,   71,
      158,  164,  164,  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,  696,
      695,  694,  693,  692,  691,  690,  686,  685,  684,  683,
      682,  681,  680,  679,  678,  677,  676,  675,  674,  673,
      672,  671,  670,  666,  665,  664,  663,  662,  661,  660,
      659,  658,  657,  656,  655,  654,  653,  652,  651,  650,
      649,  648,  647,  646,  645,  644,  643,  636,  635,  634,
      633,  632,  631,  630,  629,  628,  627,  626,  625,  624,
      623,  622,  621,  620,  614,  613,  612,  611,  610,  609,
      608,  607,  606,  605,  604,  603,  602,  601,  600,  594,
      593,  592,  591,  590,  589,  588,  587,  586,  585,  584,

      583,  582,  581,  580,  579,  578,  577,  576,  575,  574,
      573,  572,  571,  570,  563,  562,  561,  560,  559,  558,
      557,  556,  555,  554,  553,  552,  551,  546,  545,  544,
      543,  542,  541,  540,  539,  538,  537,  536,  535,  534,
      533,  532,  531,  530,  524,  523,  522,  521,  520,  519,
      518,  517,  516,  515,  514,  513,  512,  511,  510,  509,
      508,  507,  506,  505,  504,  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,  467,  466,  465,  464,

      463,  462,  461,  451,  450,  449,  448,  447,  441,  440,
      439,  438,  437,  436,  435,  434,  433,  432,  431,  430,
      429,  428,  427,  426,  425,  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,  393,  392,  391,  390,  389,  388,  387,
      383,  382,  381,  380,  379,  378,  377,  376,  372,  368,
      367,  366,  365,  364,  360,  359,  358,  357,  356,  355,
      354,  353,  352,  348,  347,  346,  345,  344,  343,  342,
      341,  337,  336,  335,  334,  333,  330,  329,  328,  327,

      326,  325,  324,  323,  322,  321,  320,  319,  318,  317,
      316,  315,  312,  311,  310,  309,  308,  307,  306,  305,
      304,  303,  302,  298,  297,  296,  295,  294,  293,  292,
      291,  290,  289,  288,  287,  286,  285,  284,  283,  282,
      281,  280,  279,  278,  277,  276,  275,  274,  273,  272,
      271,  270,  267,  266,  265,  264,  261,  260,  259,  258,
      257,  256,  249,  248,  245,  244,  243,  236,  235,  234,
      233,  232,  227,  226,  225,  224,  220,  219,  215,  212,
      211,  210,  207,  206,  205,  199,  198,  197,  196,  195,
      194,  193,  192,  187,  186,  185,  184,  183,  182,  181,

      180,  176,  175,  174,  173,  172,  171,  168,  167,  166,
      165,  132,  128,  112,   84,   79,   72,   66,   61,  820,
       58,   58,    7,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820

    } ;

static const flex_int16_t yy_chk[1096] =
    {   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,    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,   12,   12,   13,   17,   19,   20,
       20,   20,   20,   20,   20,   20,   28,   28,   26,   53,
       44,   19,   17,   33,   44,   13,   22,   53,   22,   22,
       22,   22,   22,   22,   22,   26,   34,   26,   26,  765,
       35,   33,   35,   43,   36,   22,   35,   38,   36,   38,
       34,   34,   22,   22,   36,   37,   43,   36,   38,   37,

       42,  108,   22,   42,   37,   45,   42,   42,   55,   92,
       37,   42,  108,   92,   42,  766,   22,   47,   45,   22,
       23,   39,   23,   23,   23,   23,   23,   23,   23,   39,
       41,   39,   47,  123,   39,   47,  127,   49,   41,   23,
       39,  123,  127,  767,   49,   49,   23,   50,   49,   41,
       50,  144,  144,   55,   49,   49,   23,   49,   50,   52,
       51,   71,   71,   52,   51,   50,   73,   73,   51,  145,
       23,   51,   52,   74,   74,  179,  179,  145,   71,   71,
       76,  768,   76,   73,   73,   76,   76,   76,   76,   76,
       76,   76,  109,  137,   99,  164,  129,   74,   99,   99,

       74,  132,  138,  119,  769,  109,  119,  119,  137,  129,
      119,  129,  119,  146,  150,  138,  150,  132,  132,  164,
      156,  146,  156,  158,  158,  156,  156,  156,  156,  156,
      156,  156,  210,  210,  210,  770,  771,  159,  774,  159,
      158,  158,  159,  159,  159,  159,  159,  159,  159,  162,
      162,  162,  162,  162,  162,  162,  163,  163,  163,  163,
      163,  163,  163,  174,  222,  239,  775,  778,  222,  245,
      245,  245,  779,  239,  163,  781,  174,  250,  250,  250,
      250,  250,  250,  250,  251,  251,  251,  251,  251,  251,
      251,  163,  252,  252,  252,  252,  252,  252,  252,  261,

      261,  261,  251,  253,  253,  253,  253,  253,  253,  253,
      273,  273,  273,  282,  282,  282,  286,  286,  286,  251,
      782,  253,  295,  295,  295,  336,  336,  336,  377,  377,
      377,  388,  388,  388,  389,  389,  389,  783,  253,  785,
      786,  377,  377,  390,  390,  390,  441,  441,  441,  484,
      484,  484,  789,  790,  504,  505,  521,  521,  521,  441,
      441,  604,  484,  484,  504,  505,  555,  555,  555,  521,
      521,  604,  521,  578,  578,  578,  632,  791,  792,  555,
      555,  605,  793,  632,  794,  632,  578,  578,  605,  653,
      605,  605,  796,  797,  798,  799,  653,  800,  653,  801,

      803,  804,  805,  807,  811,  812,  813,  815,  816,  821,
      821,  821,  821,  822,  822,  822,  823,  823,  823,  824,
      825,  826,  826,  764,  763,  762,  761,  758,  757,  756,
      755,  754,  753,  752,  751,  750,  749,  746,  745,  742,
      741,  740,  739,  738,  737,  735,  734,  733,  732,  731,
      729,  727,  723,  722,  721,  720,  719,  717,  716,  715,
      714,  713,  712,  711,  710,  709,  708,  707,  706,  705,
      703,  702,  701,  700,  699,  698,  697,  696,  695,  693,
      692,  691,  690,  689,  688,  687,  686,  685,  684,  683,
      682,  681,  680,  679,  678,  677,  676,  675,  674,  673,

      672,  671,  670,  669,  668,  667,  666,  664,  663,  662,
      661,  660,  659,  658,  656,  655,  652,  650,  649,  648,
      646,  645,  644,  643,  642,  641,  640,  639,  638,  637,
      636,  635,  634,  631,  630,  629,  628,  627,  626,  624,
      623,  622,  621,  619,  618,  617,  616,  615,  614,  613,
      612,  611,  610,  609,  608,  607,  606,  601,  599,  598,
      597,  596,  595,  591,  590,  589,  588,  587,  586,  585,
      584,  583,  581,  580,  576,  575,  573,  572,  570,  569,
      568,  567,  566,  565,  564,  560,  559,  558,  556,  554,
      553,  552,  551,  550,  549,  548,  547,  546,  545,  543,

      542,  537,  536,  535,  534,  532,  531,  529,  528,  527,
      526,  525,  523,  522,  520,  519,  518,  517,  516,  515,
      514,  513,  511,  510,  509,  508,  507,  503,  502,  501,
      500,  499,  498,  495,  494,  493,  492,  491,  490,  489,
      488,  487,  486,  485,  483,  482,  479,  474,  472,  471,
      470,  468,  467,  464,  463,  462,  461,  450,  449,  448,
      446,  445,  444,  443,  442,  439,  437,  436,  435,  433,
      432,  431,  430,  428,  426,  425,  420,  419,  417,  416,
      415,  414,  413,  412,  411,  410,  409,  408,  407,  405,
      404,  403,  402,  401,  400,  399,  397,  396,  395,  394,

      393,  392,  391,  387,  383,  382,  381,  378,  376,  366,
      364,  360,  359,  358,  357,  355,  354,  352,  347,  346,
      345,  344,  343,  342,  337,  335,  334,  333,  332,  331,
      329,  328,  325,  324,  323,  322,  321,  320,  319,  318,
      317,  316,  315,  314,  313,  312,  311,  310,  309,  308,
      307,  306,  305,  304,  303,  302,  301,  300,  299,  296,
      294,  293,  292,  291,  290,  289,  288,  287,  285,  281,
      279,  278,  277,  276,  272,  271,  270,  269,  268,  267,
      266,  265,  264,  260,  258,  257,  256,  249,  248,  247,
      246,  244,  243,  242,  241,  240,  238,  237,  236,  235,

      234,  233,  232,  231,  230,  229,  228,  227,  226,  225,
      224,  223,  221,  220,  219,  218,  217,  216,  215,  214,
      213,  212,  211,  209,  208,  207,  206,  205,  204,  203,
      202,  201,  200,  199,  198,  197,  196,  195,  194,  193,
      191,  190,  189,  188,  187,  186,  185,  184,  183,  182,
      181,  180,  178,  177,  176,  175,  173,  172,  171,  170,
      169,  167,  152,  151,  149,  148,  147,  143,  142,  141,
      140,  139,  136,  135,  134,  133,  131,  130,  128,  126,
      125,  124,  122,  121,  120,  118,  117,  115,  114,  113,
      112,  111,  110,  107,  106,  105,  104,  103,  102,  101,

      100,   98,   97,   96,   95,   94,   93,   91,   90,   86,
       82,   48,   46,   40,   27,   24,   21,   16,   11,    7,
        4,    3,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820

    } ;


/* Table of booleans, true if rule could match eol. */
static const flex_int32_t yy_rule_can_match_eol[240] =
    {   0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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;
    int yy_n_chars;
    int 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 );



			int 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 YY_NO_UNPUT
    
#endif


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

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

#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput ( yyscan_t yyscanner );
#else
static int input ( yyscan_t yyscanner );
#endif

#endif








/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#endif


/* Copy whatever the last rule matched to the standard output. */
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
 * we now use fwrite().
 */
#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
#endif



/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		int n; \
		for ( n = 0; n < max_size && \
			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
			buf[n] = (char) c; \
		if ( c == '\n' ) \
			buf[n++] = (char) c; \
		if ( c == EOF && ferror( yyin ) ) \
			YY_FATAL_ERROR( "input in flex scanner failed" ); \
		result = n; \
		} \
	else \
		{ \
		errno=0; \
		while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(yyin); \
			} \
		}\
\

#endif



/* No semi-colon after return; correct usage is to write "yyterminate();" -
 * we don't want an extra ';' after the "return" because that will cause
 * some compilers to complain about unreachable statements.
 */
#ifndef yyterminate
#define yyterminate() return YY_NULL
#endif


/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif


/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , 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 /*LINTED*/break;
#endif



#define YY_RULE_SETUP \
	YY_USER_ACTION


/** The main scanner function which does all the work.
 */
YY_DECL
{
	yy_state_type yy_current_state;
	char *yy_cp, *yy_bp;
	int yy_act;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;




    yylval = yylval_param;



    yylloc = yylloc_param;


	if ( !yyg->yy_init )
		{
		yyg->yy_init = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif



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

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

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

		yy_load_buffer_state( yyscanner );
		}

	{



    TParseContext* context = yyextra;



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

		/* Support of yytext. */
		*yy_cp = yyg->yy_hold_char;

		/* yy_bp points to the position in yy_ch_buf of the start of
		 * the current run.
		 */
		yy_bp = yy_cp;

		yy_current_state = yyg->yy_start;
yy_match:
		do
			{
			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
			if ( yy_accept[yy_current_state] )
				{
				yyg->yy_last_accepting_state = yy_current_state;
				yyg->yy_last_accepting_cpos = yy_cp;
				}
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 821 )
					yy_c = yy_meta[yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 820 );
		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] )
			{
			int 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
{ return(INVARIANT); }
	YY_BREAK
case 2:
YY_RULE_SETUP
{ return(HIGH_PRECISION); }
	YY_BREAK
case 3:
YY_RULE_SETUP
{ return(MEDIUM_PRECISION); }
	YY_BREAK
case 4:
YY_RULE_SETUP
{ return(LOW_PRECISION); }
	YY_BREAK
case 5:
YY_RULE_SETUP
{ return(PRECISION); }
	YY_BREAK
case 6:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, ATTRIBUTE); }
	YY_BREAK
case 7:
YY_RULE_SETUP
{ return(CONST_QUAL); }
	YY_BREAK
case 8:
YY_RULE_SETUP
{ return(UNIFORM); }
	YY_BREAK
case 9:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, VARYING); }
	YY_BREAK
case 10:
YY_RULE_SETUP
{ return(BREAK); }
	YY_BREAK
case 11:
YY_RULE_SETUP
{ return(CONTINUE); }
	YY_BREAK
case 12:
YY_RULE_SETUP
{ return(DO); }
	YY_BREAK
case 13:
YY_RULE_SETUP
{ return(FOR); }
	YY_BREAK
case 14:
YY_RULE_SETUP
{ return(WHILE); }
	YY_BREAK
case 15:
YY_RULE_SETUP
{ return(IF); }
	YY_BREAK
case 16:
YY_RULE_SETUP
{ return(ELSE); }
	YY_BREAK
case 17:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SWITCH); }
	YY_BREAK
case 18:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, CASE); }
	YY_BREAK
case 19:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, DEFAULT); }
	YY_BREAK
case 20:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, CENTROID); }
	YY_BREAK
case 21:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, FLAT); }
	YY_BREAK
case 22:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SMOOTH); }
	YY_BREAK
case 23:
YY_RULE_SETUP
{ return(IN_QUAL); }
	YY_BREAK
case 24:
YY_RULE_SETUP
{ return(OUT_QUAL); }
	YY_BREAK
case 25:
YY_RULE_SETUP
{ return(INOUT_QUAL); }
	YY_BREAK
case 26:
YY_RULE_SETUP
{ context->lexAfterType = true; return(FLOAT_TYPE); }
	YY_BREAK
case 27:
YY_RULE_SETUP
{ context->lexAfterType = true; return(INT_TYPE); }
	YY_BREAK
case 28:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UINT_TYPE); }
	YY_BREAK
case 29:
YY_RULE_SETUP
{ context->lexAfterType = true; return(VOID_TYPE); }
	YY_BREAK
case 30:
YY_RULE_SETUP
{ context->lexAfterType = true; return(BOOL_TYPE); }
	YY_BREAK
case 31:
YY_RULE_SETUP
{ yylval->lex.b = true;  return(BOOLCONSTANT); }
	YY_BREAK
case 32:
YY_RULE_SETUP
{ yylval->lex.b = false; return(BOOLCONSTANT); }
	YY_BREAK
case 33:
YY_RULE_SETUP
{ return(DISCARD); }
	YY_BREAK
case 34:
YY_RULE_SETUP
{ return(RETURN); }
	YY_BREAK
case 35:
YY_RULE_SETUP
{ context->lexAfterType = true; return(MATRIX2); }
	YY_BREAK
case 36:
YY_RULE_SETUP
{ context->lexAfterType = true; return(MATRIX3); }
	YY_BREAK
case 37:
YY_RULE_SETUP
{ context->lexAfterType = true; return(MATRIX4); }
	YY_BREAK
case 38:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX2); }
	YY_BREAK
case 39:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX3); }
	YY_BREAK
case 40:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX4); }
	YY_BREAK
case 41:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX2x3); }
	YY_BREAK
case 42:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX3x2); }
	YY_BREAK
case 43:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX2x4); }
	YY_BREAK
case 44:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX4x2); }
	YY_BREAK
case 45:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX3x4); }
	YY_BREAK
case 46:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, MATRIX4x3); }
	YY_BREAK
case 47:
YY_RULE_SETUP
{ context->lexAfterType = true; return (VEC2); }
	YY_BREAK
case 48:
YY_RULE_SETUP
{ context->lexAfterType = true; return (VEC3); }
	YY_BREAK
case 49:
YY_RULE_SETUP
{ context->lexAfterType = true; return (VEC4); }
	YY_BREAK
case 50:
YY_RULE_SETUP
{ context->lexAfterType = true; return (IVEC2); }
	YY_BREAK
case 51:
YY_RULE_SETUP
{ context->lexAfterType = true; return (IVEC3); }
	YY_BREAK
case 52:
YY_RULE_SETUP
{ context->lexAfterType = true; return (IVEC4); }
	YY_BREAK
case 53:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UVEC2); }
	YY_BREAK
case 54:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UVEC3); }
	YY_BREAK
case 55:
YY_RULE_SETUP
{ return ES2_identifier_ES3_keyword(context, UVEC4); }
	YY_BREAK
case 56:
YY_RULE_SETUP
{ context->lexAfterType = true; return (BVEC2); }
	YY_BREAK
case 57:
YY_RULE_SETUP
{ context->lexAfterType = true; return (BVEC3); }
	YY_BREAK
case 58:
YY_RULE_SETUP
{ context->lexAfterType = true; return (BVEC4); }
	YY_BREAK
case 59:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER2D; }
	YY_BREAK
case 60:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLERCUBE; }
	YY_BREAK
case 61:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER2DRECT; }
	YY_BREAK
case 62:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER_EXTERNAL_OES; }
	YY_BREAK
case 63:
YY_RULE_SETUP
{ context->lexAfterType = true; return SAMPLER3D; }
	YY_BREAK
case 64:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
	YY_BREAK
case 65:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAY); }
	YY_BREAK
case 66:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2D); }
	YY_BREAK
case 67:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLER3D); }
	YY_BREAK
case 68:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLERCUBE); }
	YY_BREAK
case 69:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, ISAMPLER2DARRAY); }
	YY_BREAK
case 70:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLER2D); }
	YY_BREAK
case 71:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLER3D); }
	YY_BREAK
case 72:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLERCUBE); }
	YY_BREAK
case 73:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, USAMPLER2DARRAY); }
	YY_BREAK
case 74:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
	YY_BREAK
case 75:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, SAMPLERCUBESHADOW); }
	YY_BREAK
case 76:
YY_RULE_SETUP
{ return  ES2_identifier_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
	YY_BREAK
case 77:
YY_RULE_SETUP
{ context->lexAfterType = true; return(STRUCT); }
	YY_BREAK
case 78:
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 79:
case 80:
case 81:
case 82:
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:
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 135:
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 136:
case 137:
case 138:
case 139:
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:
YY_RULE_SETUP
{ return reserved_word(yyscanner); }
	YY_BREAK
case 177:
YY_RULE_SETUP
{
   yylval->lex.string = NewPoolTString(yytext); 
   return check_type(yyscanner);
}
	YY_BREAK
case 178:
YY_RULE_SETUP
{ return int_constant(yyscanner); }
	YY_BREAK
case 179:
YY_RULE_SETUP
{ return int_constant(yyscanner); }
	YY_BREAK
case 180:
YY_RULE_SETUP
{ return int_constant(yyscanner); }
	YY_BREAK
case 181:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 182:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 183:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 184:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 185:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 186:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 187:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 188:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 189:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 190:
YY_RULE_SETUP
{  return(ADD_ASSIGN); }
	YY_BREAK
case 191:
YY_RULE_SETUP
{  return(SUB_ASSIGN); }
	YY_BREAK
case 192:
YY_RULE_SETUP
{  return(MUL_ASSIGN); }
	YY_BREAK
case 193:
YY_RULE_SETUP
{  return(DIV_ASSIGN); }
	YY_BREAK
case 194:
YY_RULE_SETUP
{  return(MOD_ASSIGN); }
	YY_BREAK
case 195:
YY_RULE_SETUP
{  return(LEFT_ASSIGN); }
	YY_BREAK
case 196:
YY_RULE_SETUP
{  return(RIGHT_ASSIGN); }
	YY_BREAK
case 197:
YY_RULE_SETUP
{  return(AND_ASSIGN); }
	YY_BREAK
case 198:
YY_RULE_SETUP
{  return(XOR_ASSIGN); }
	YY_BREAK
case 199:
YY_RULE_SETUP
{  return(OR_ASSIGN); }
	YY_BREAK
case 200:
YY_RULE_SETUP
{  return(INC_OP); }
	YY_BREAK
case 201:
YY_RULE_SETUP
{  return(DEC_OP); }
	YY_BREAK
case 202:
YY_RULE_SETUP
{  return(AND_OP); }
	YY_BREAK
case 203:
YY_RULE_SETUP
{  return(OR_OP); }
	YY_BREAK
case 204:
YY_RULE_SETUP
{  return(XOR_OP); }
	YY_BREAK
case 205:
YY_RULE_SETUP
{  return(LE_OP); }
	YY_BREAK
case 206:
YY_RULE_SETUP
{  return(GE_OP); }
	YY_BREAK
case 207:
YY_RULE_SETUP
{  return(EQ_OP); }
	YY_BREAK
case 208:
YY_RULE_SETUP
{  return(NE_OP); }
	YY_BREAK
case 209:
YY_RULE_SETUP
{  return(LEFT_OP); }
	YY_BREAK
case 210:
YY_RULE_SETUP
{  return(RIGHT_OP); }
	YY_BREAK
case 211:
YY_RULE_SETUP
{ context->lexAfterType = false; return(SEMICOLON); }
	YY_BREAK
case 212:
YY_RULE_SETUP
{ context->lexAfterType = false; return(LEFT_BRACE); }
	YY_BREAK
case 213:
YY_RULE_SETUP
{ return(RIGHT_BRACE); }
	YY_BREAK
case 214:
YY_RULE_SETUP
{ if (context->inTypeParen) context->lexAfterType = false; return(COMMA); }
	YY_BREAK
case 215:
YY_RULE_SETUP
{ return(COLON); }
	YY_BREAK
case 216:
YY_RULE_SETUP
{ context->lexAfterType = false; return(EQUAL); }
	YY_BREAK
case 217:
YY_RULE_SETUP
{ context->lexAfterType = false; context->inTypeParen = true; return(LEFT_PAREN); }
	YY_BREAK
case 218:
YY_RULE_SETUP
{ context->inTypeParen = false; return(RIGHT_PAREN); }
	YY_BREAK
case 219:
YY_RULE_SETUP
{ return(LEFT_BRACKET); }
	YY_BREAK
case 220:
YY_RULE_SETUP
{ return(RIGHT_BRACKET); }
	YY_BREAK
case 221:
YY_RULE_SETUP
{ BEGIN(FIELDS);  return(DOT); }
	YY_BREAK
case 222:
YY_RULE_SETUP
{ return(BANG); }
	YY_BREAK
case 223:
YY_RULE_SETUP
{ return(DASH); }
	YY_BREAK
case 224:
YY_RULE_SETUP
{ return(TILDE); }
	YY_BREAK
case 225:
YY_RULE_SETUP
{ return(PLUS); }
	YY_BREAK
case 226:
YY_RULE_SETUP
{ return(STAR); }
	YY_BREAK
case 227:
YY_RULE_SETUP
{ return(SLASH); }
	YY_BREAK
case 228:
YY_RULE_SETUP
{ return(PERCENT); }
	YY_BREAK
case 229:
YY_RULE_SETUP
{ return(LEFT_ANGLE); }
	YY_BREAK
case 230:
YY_RULE_SETUP
{ return(RIGHT_ANGLE); }
	YY_BREAK
case 231:
YY_RULE_SETUP
{ return(VERTICAL_BAR); }
	YY_BREAK
case 232:
YY_RULE_SETUP
{ return(CARET); }
	YY_BREAK
case 233:
YY_RULE_SETUP
{ return(AMPERSAND); }
	YY_BREAK
case 234:
YY_RULE_SETUP
{ return(QUESTION); }
	YY_BREAK
case 235:
YY_RULE_SETUP
{ 
    BEGIN(INITIAL);
    yylval->lex.string = NewPoolTString(yytext); 
    return FIELD_SELECTION;
}
	YY_BREAK
case 236:
YY_RULE_SETUP
{}
	YY_BREAK
case 237:
/* rule 237 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 238:
YY_RULE_SETUP
{ context->warning(*yylloc, "Unknown char", yytext, ""); return 0; }
	YY_BREAK
case 239:
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;
	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = yyg->yytext_ptr;
	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
		{
			int num_to_read =
			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */

			/* just a shorter name for the current buffer */
			YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;

			int yy_c_buf_p_offset =
				(int) (yyg->yy_c_buf_p - b->yy_ch_buf);

			if ( b->yy_is_our_buffer )
				{
				int new_size = b->yy_buf_size * 2;

				if ( new_size <= 0 )
					b->yy_buf_size += b->yy_buf_size / 8;
				else
					b->yy_buf_size *= 2;

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					yyrealloc( (void *) b->yy_ch_buf,
							 (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
				}
			else
				/* Can't grow it, we don't own it. */
				b->yy_ch_buf = NULL;

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

			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 ((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. */
		int 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, (yy_size_t) new_size , yyscanner );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
		/* "- 2" to take care of EOB's */
		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
	}

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

	yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];

	return ret_val;
}


/* yy_get_previous_state - get the state just before the EOB char was reached */

    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
{
	yy_state_type yy_current_state;
	char *yy_cp;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	yy_current_state = yyg->yy_start;

	for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
		{
		YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
		if ( yy_accept[yy_current_state] )
			{
			yyg->yy_last_accepting_state = yy_current_state;
			yyg->yy_last_accepting_cpos = yy_cp;
			}
		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
			{
			yy_current_state = (int) yy_def[yy_current_state];
			if ( yy_current_state >= 821 )
				yy_c = yy_meta[yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
		}

	return yy_current_state;
}


/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
{
	int yy_is_jam;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
	char *yy_cp = yyg->yy_c_buf_p;

	YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		yyg->yy_last_accepting_state = yy_current_state;
		yyg->yy_last_accepting_cpos = yy_cp;
		}
	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
		{
		yy_current_state = (int) yy_def[yy_current_state];
		if ( yy_current_state >= 821 )
			yy_c = yy_meta[yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
	yy_is_jam = (yy_current_state == 820);

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


#ifndef YY_NO_UNPUT

#endif

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

{
	int c;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

	if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
		{
		/* yy_c_buf_p now points to the character we want to return.
		 * If this occurs *before* the EOB characters, then it's a
		 * valid NUL; if not, then we've hit the end of the buffer.
		 */
		if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
			/* This was really a NUL. */
			*yyg->yy_c_buf_p = '\0';

		else
			{ /* need more input */
			int offset = (int) (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 0;

					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( (yy_size_t) (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; /* After all that talk, this was set to 1 anyways... */
		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. */
		yy_size_t grow_size = 8 /* arbitrary grow size */;

		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)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 NULL;

	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 = (int) (size - 2);	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = NULL;
	b->yy_n_chars = b->yy_buf_size;
	b->yy_is_interactive = 0;
	b->yy_at_bol = 1;
	b->yy_fill_buffer = 0;
	b->yy_buffer_status = YY_BUFFER_NEW;

	yy_switch_to_buffer( b , 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 (const char * yystr , yyscan_t yyscanner)
{
    
	return yy_scan_bytes( yystr, (int) 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  (const char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = (yy_size_t) (_yybytes_len + 2);
	buf = (char *) yyalloc( n , 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;
}











#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	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.
 */
int 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 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 _column_no column 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 = NULL;
    yyg->yy_buffer_stack_top = 0;
    yyg->yy_buffer_stack_max = 0;
    yyg->yy_c_buf_p = NULL;
    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 = NULL;
    yyout = NULL;
#endif

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


/* yylex_destroy is for both reentrant and non-reentrant scanners. */
int yylex_destroy  (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, const char * s2, int n , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;

	int i;
	for ( i = 0; i < n; ++i )
		s1[i] = s2[i];
}
#endif



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

	return n;
}
#endif



void *yyalloc (yy_size_t  size , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	return malloc(size);
}



void *yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;

	/* The cast to (char *) in the following accommodates both
	 * implementations that use char* generic pointers, and those
	 * that use void* generic pointers.  It works with the latter
	 * because both ANSI C and C++ allow castless assignment from
	 * any pointer type to void*, and deal with argument conversions
	 * as though doing an assignment.
	 */
	return realloc(ptr, size);
}



void yyfree (void * ptr , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	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();

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

    if (!atou_clamp(yytext, &(yylval->lex.u)))
        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;
    }

    std::string text = yytext;
    text.resize(text.size() - 1);  // Drop the suffix
    if(!atof_clamp(text.c_str(), &(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;
}


