#line 17 "glslang.l"
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_parser.py from glslang.l
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// glslang.l:
//   Lexer for the OpenGL shading language.

// clang-format off

// Ignore errors in auto-generated code.
#if defined(__GNUC__)
#pragma GCC diagnostic ignored "-Wswitch-enum"
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#elif defined(_MSC_VER)
#pragma warning(disable: 4005)
#pragma warning(disable: 4065)
#pragma warning(disable: 4189)
#pragma warning(disable: 4244)
#pragma warning(disable: 4505)
#pragma warning(disable: 4701)
#pragma warning(disable: 4702)
#endif
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
#if defined(__APPLE__)
// Older clang versions don't have -Wextra-semi-stmt, and detecting Apple clang versions is
// difficult because they use different yet overlapping version numbers vs. regular clang.
#pragma clang diagnostic ignored "-Wunknown-warning-option"
#endif
// Flex isn't semi-colon clean.
#pragma clang diagnostic ignored "-Wextra-semi-stmt"
#pragma clang diagnostic ignored "-Wunreachable-code"
#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 247
#define YY_END_OF_BUFFER 248
/* 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[891] =
    {   0,
        0,    0,    0,    0,  248,  246,  245,  245,  229,  235,
      240,  224,  225,  233,  232,  221,  230,  228,  234,  187,
      187,  222,  218,  236,  223,  237,  241,  184,  226,  227,
      239,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  219,  238,  220,  231,  244,  243,  247,
      242,  215,  201,  220,  209,  204,  199,  207,  197,  208,
      198,  193,  200,  192,  186,  187,    0,  190,    0,  227,
      219,  226,  216,  212,  214,  213,  217,  184,  205,  211,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,

      184,  184,  184,  184,   13,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,   16,  184,
      184,   24,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  206,  210,  242,
        0,  196,  192,    0,  195,  189,    0,  191,  185,  202,
      203,  184,  184,  144,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,   14,  184,

      184,  184,  184,  184,  184,  184,  184,  184,  184,   29,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,   25,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,    0,
      193,    0,  192,  194,  188,  184,  184,  184,  184,   32,
      184,  184,  184,   19,  181,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,   17,  147,  184,  184,  184,
      184,   22,  184,  184,  151,  162,  184,  184,  184,  184,

      184,  184,  184,  184,  184,  184,  184,  184,  184,  159,
        4,   37,   38,   39,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  150,
       33,  184,  184,   30,  184,  184,  184,  184,  184,  184,
      184,   49,   50,   51,   31,  184,  184,  184,  184,  184,
      184,  184,  184,   11,  184,   55,   56,   57,  184,  145,
      184,  184,    7,  184,  184,  184,  184,  171,  172,  173,
      184,   34,  184,  163,   28,  174,  175,  176,    2,  168,
      169,  170,  184,  184,  184,   26,  166,  184,  184,  184,

      184,  184,   52,   53,   54,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  112,  184,  184,  184,
      184,  184,  184,  184,  184,  160,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  146,  184,  184,
      183,   58,   59,   60,  184,  184,   15,  184,  184,  184,
      117,  184,  184,    9,  184,  184,  115,  184,  184,  184,
      161,  156,  118,  184,  184,  184,  184,  184,  184,  152,
      184,  184,  184,  184,  184,   87,   40,   43,   45,   44,
       41,   47,   46,   48,   42,  184,  184,  184,  184,  167,
      143,  184,  184,  154,  184,  184,  184,   36,  113,   27,

      180,   23,  155,   86,  184,  165,   18,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,   20,   35,  184,  184,  184,  184,  184,
      184,  119,   92,   98,  184,  184,  184,  184,  184,   89,
       91,    3,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  148,  184,  184,  184,  184,  184,    8,
      184,  184,   10,  184,  184,  184,  184,  184,  184,   21,
      106,   12,  157,  120,   93,  100,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  153,
      184,  184,  184,  104,  110,  107,  184,  184,  184,  184,

      184,  184,  184,  149,  121,   94,   99,  184,  184,  164,
      184,  108,  184,  184,  184,  184,    6,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  103,  158,    1,  184,
      184,  184,  184,  184,  184,  182,  184,  116,    5,  177,
       61,   64,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  105,  184,  184,  184,  184,
      184,  184,  101,  184,  184,  184,  184,  184,  134,   69,
       70,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  114,  184,  184,  184,  102,
      136,   74,   75,  184,  184,  184,  184,  109,  184,  184,

      184,  184,  184,  184,  184,  129,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,   68,  184,  184,
      184,  184,   62,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  130,  122,  184,
       95,  184,  184,  184,   73,  184,  184,   71,  184,  184,
      184,  184,  184,  184,  184,  184,  184,  184,  184,  184,
      184,  184,  131,  184,  184,   78,  184,  184,   76,  184,
      184,  123,   96,  184,  125,  184,  126,  184,  184,  184,
      184,  184,  184,  111,  184,  184,  184,  184,   66,  184,
       65,  140,  184,  184,  124,   97,  184,  184,  184,  184,

      184,  184,  184,  184,  184,  184,  184,  184,  138,  141,
      184,  132,  184,   67,  184,  184,  184,  184,  184,  184,
      184,  184,  139,  142,  184,  184,  184,  184,  135,   72,
      184,  184,  184,  178,  184,  184,  184,   79,  184,  184,
      137,   77,  184,  184,  184,  184,  184,  184,  184,  184,
      184,   83,  184,  184,  184,  184,  184,  184,  184,  184,
       84,  184,  184,  184,  184,   80,  184,   85,   88,  184,
      127,  128,   90,  184,  184,  184,   63,  184,  184,  184,
      179,  184,  133,   81,  184,  184,  184,  184,   82,    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,   21,   22,   23,   24,   25,   26,   27,
       28,   29,   30,    1,   31,   32,   33,   34,   35,   36,
       37,   37,   37,   37,   37,   37,   38,   37,   39,   37,
       37,   40,   41,   42,   43,   37,   37,   44,   45,   37,
       46,    1,   47,   48,   49,    1,   50,   51,   52,   53,

       54,   55,   56,   57,   58,   37,   59,   60,   61,   62,
       63,   64,   37,   65,   66,   67,   68,   69,   70,   71,
       72,   73,   74,   75,   76,   77,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    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[78] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
        1,    2,    3,    1,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    1,    1,    1,    1,    1,    1,
        5,    5,    5,    5,    6,    7,    8,    8,    8,    8,
        8,    8,    9,    8,    8,    1,    1,    1,    8,    5,
        5,    5,    5,    6,    7,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    9,    8,    8,
        8,    8,    8,    1,    1,    1,    1
    } ;

static const flex_int16_t yy_base[900] =
    {   0,
        0,    0,   77,    0, 1094, 1095, 1095, 1095, 1065,  127,
      151, 1095, 1095, 1064,  148, 1095,  147,  145, 1063,  167,
      158, 1061, 1095,  167, 1061,  145, 1095,    0, 1095, 1095,
      149, 1039,  147,  135,  155,  162,  146,  174, 1024,  172,
      178,  179,  169,  196, 1018,  198, 1031,  200,  197,  213,
      202,  113, 1016, 1095,  153, 1095, 1095, 1095, 1095, 1095,
        0, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095,
     1095,  237, 1095,  241,  237,  271,  243, 1095,    0, 1095,
     1095, 1095, 1055, 1095, 1095, 1095, 1054,    0, 1095, 1095,
     1015, 1013, 1018,  197, 1015, 1023, 1021, 1021, 1008, 1011,

     1022,  226, 1016, 1004, 1001, 1014, 1001,  998,  998, 1004,
      136,  235,  998, 1008,  994, 1000, 1003, 1004,    0,  996,
     1006,  230, 1005,  986,  999,  980,  216,  984,  997,  988,
      243,  981,  237,  993,  995,  250,  984,  259,  971,  980,
      253,  259,  984,  980,  982,  971,  974,  250,  255,  269,
      983,  971,  983,  266,  976,  975,  963, 1095, 1095,    0,
      318, 1095,  296,  323, 1095, 1095,  325,  324,  206, 1095,
     1095,  981,  972,    0,  968,  963,  967,  976,  970,  972,
      298,  956,  956,  967,  959,  271,  969,  966,  966,  964,
      961,  953,  959,  946,  944,  956,  942,  958,    0,  955,

      943,  950,  947,  951,  952,  945,  942,  931,  930,  943,
      946,  934,  945,  941,  929,  935,  926,  336,  931,  934,
      925,  932,  921,  925,  916,  930,  929,  920,  926,  294,
      910,  913,  911,  910,  920,  910,  905,  903,  905,  915,
      901,  903,  900,  911,  910,  913,  895,  301,  903,  899,
      897,  906,  885,  349,  903,  905,  894,  886,  919,  354,
      370,  368,  383, 1095, 1095,  890,  881,  891,  890,    0,
      888,  892,  379,    0,    0,  880,  878,  878,  879,  874,
      882,  871,  888,  877,  382,    0,    0,  871,  881,  880,
      880,    0,  865,  385,    0,    0,  867,  390,  874,  875,

      866,  860,  859,  860,  859,  859,  337,  393,  854,    0,
        0,  850,  849,  848,  850,  851,  856,  850,  846,  859,
      854,  854,  852,  851,  845,  839,  841,  840,  844,  849,
      835,  838,  833,  841,  846,  834,  831,  843,  834,    0,
        0,  840,  836,    0,  828,  828,  833,  824,  831,  396,
      828,    0,    0,    0,    0,  818,  830,  829,  816,  817,
      826,  827,  827,    0,  812,    0,    0,    0,  813,    0,
      821,  812,    0,  811,  812,  806,  816,    0,    0,    0,
      807,    0,  803,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  813,  400,  812,    0,    0,  810,  806,  803,

      847,  846,    0,    0,    0,  793,  403,  409,  412,  798,
      794,  799,  790,  788,  801,  786,    0,  786,  799,  788,
      784,  790,  785,  792,  792,    0,  789,  786,  790,  774,
      772,  775,  781,  787,  782,  781,  769,    0,  771,  772,
        0,    0,    0,    0,  769,  772,    0,  766,  776,  767,
        0,  777,  757,    0,  766,  761,    0,  754,  754,  767,
        0,  769,    0,  418,  784,  783,  782,  747,  746,    0,
      763,  762,  757,  794,  785,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,  744,  757,  744,  741,    0,
        0,  746,  745,    0,  742,  749,  748,    0,  734,    0,

        0,    0,    0,    0,  731,    0,    0,  730,  741,  423,
      734,  740,  739,  736,  731,  728,  748,  734,  719,  719,
      732,  717,  729,    0,    0,  722,  747,  746,  745,  710,
      709,  406,  411,    0,  721,  724,  722,  711,  707,  722,
        0,    0,  718,  715,  714,  704,  703,  693,  710,  696,
      427,  704,  707,    0,  726,  725,  724,  689,  688,    0,
      702,  689,    0,  699,  692,  684,  685,  691,  694,    0,
        0,    0,    0,  716,  715,    0,  690,  693,  678,  685,
      676,  683,  684,  684,  683,  669,  447,  680,  680,    0,
      681,  670,  669,    0,    0,    0,  696,  695,  694,  659,

      658,  654,  662,    0,  692,  691,    0,  666,  669,    0,
      450,    0,  647,  668,  682,  654,    0,  650,  649,  658,
      658,  646,  660,  644,  658,  653,    0,    0,    0,  672,
      671,  670,  635,  634,  633,    0,  633,    0,    0,  417,
      446,  659,  643,  646,  629,  641,  629,  628,  637,  637,
      656,  655,  654,  619,  618,    0,  623,  613,  616,  617,
      616,  626,    0,  629,  625,  627,  623,  610,  643,  438,
        0,  618,  621,  611,  612,  604,  611,  602,  625,  611,
      607,  609,  607,  607,  606,    0,  594,  593,  603,    0,
      625,  450,    0,  600,  603,  600,  585,    0,  601,  600,

      584,  576,  584,  574,  582,    0,  579,  578,  601,  587,
      585,  585,  578,  568,  571,  585,  569,  602,  580,  581,
      578,  575,  587,  562,  576,  575,  559,  558,  557,  580,
      566,  564,  564,  567,  562,  543,  542,    0,  572,  542,
      570,  540,  544,  543,  576,  554,  551,    0,  555,  548,
      549,  539,  538,  519,  502,  515,  499,  162,  258,  258,
      257,  290,    0,  298,  316,  363,  353,  369,    0,  359,
      381,    0,    0,  392,    0,  396,    0,  404,  407,  396,
      403,  406,  407,    0,  401,  411,  403,  420,  448,  428,
        0,    0,  442,  443,    0,    0,  444,  445,  431,  430,

      433,  446,  438,  451,  452,  431,  432,  440,    0,    0,
      456,  466,  438,  468,  460,  454,  442,  460,  454,  443,
      444,  452,    0,    0,  483,  469,  467,  468,    0,    0,
      472,  461,  467,    0,  468,  454,  477,    0,  465,  490,
        0,    0,  480,  487,  472,  470,  471,  463,  480,  487,
      488,    0,  486,  470,  506,  470,  501,  527,  475,  476,
        0,  493,  495,  496,  487,    0,  510,    0,    0,  518,
        0,    0,    0,  490,  491,  485,    0,  511,  487,  488,
        0,  542,    0,    0,  515,  526,  518,  521,    0, 1095,
      561,  567,  573,  579,  583,  589,  590,  596,  599

    } ;

static const flex_int16_t yy_def[900] =
    {   0,
      890,    1,  890,    3,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      891,  890,  890,  890,  890,  890,  890,  892,  890,  890,
      890,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  890,  890,  890,  890,  890,  890,  890,
      893,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  894,  890,  895,   20,  891,  896,  890,  897,  890,
      890,  890,  890,  890,  890,  890,  890,  892,  890,  890,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  890,  890,  893,
      898,  890,  895,  899,  890,  890,  890,  896,  897,  890,
      890,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  890,
      898,  890,  899,  890,  890,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,

      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
      892,  892,  892,  892,  892,  892,  892,  892,  892,    0,
      890,  890,  890,  890,  890,  890,  890,  890,  890

    } ;

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

       58,   58,   58,   58,   58,   58,   58,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   58,   58,   58,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       58,   58,   58,   58,   63,   64,   65,   68,   70,   72,
       72,   72,   72,   72,   72,   72,   72,   72,   72,  155,
       74,   81,   86,   87,   71,   69,   89,  156,   66,   74,
      158,   75,   75,   75,   75,   75,   75,   75,   75,   76,
       76,   82,   77,   83,   84,  195,   90,   95,   92,   96,

       78,   77,   97,   98,   99,  107,  196,  108,  100,   78,
       79,   77,   93,   94,  101,  103,  109,  102,  128,  104,
       77,  116,  129,  110,  105,   78,  792,  159,  126,  117,
      106,  111,  119,  112,   78,  120,  113,   79,  121,  122,
      118,  127,  114,  123,  124,  130,  125,  133,  265,  137,
      144,  152,  167,  145,  167,  153,  138,  139,  131,  175,
      140,  146,  134,  176,  154,  135,  141,  142,  147,  143,
      148,  161,  162,  265,  149,  164,  165,  216,  150,  166,
      890,  151,  184,   74,  197,  217,  185,  186,  224,  207,
      161,  162,  208,  209,  164,  165,  210,  198,  211,  229,

      221,  225,  237,  226,  166,   77,  222,  890,  233,  239,
      246,  247,  248,   78,  793,  230,  231,  238,  250,  794,
      249,  234,  240,  255,   77,  256,  251,  260,  795,  260,
      164,  165,  262,  890,  262,  890,  280,  281,   78,  168,
      168,  168,  168,  168,  168,  168,  168,  168,  168,  164,
      165,  274,  312,  313,  314,  345,  326,  401,  402,  264,
      327,  796,  797,  346,  275,  352,  353,  354,  261,  261,
      261,  261,  261,  261,  261,  261,  261,  261,  264,  890,
      798,  890,  263,  263,  263,  263,  263,  263,  263,  263,
      263,  263,  890,  799,  890,  366,  367,  368,  378,  379,

      380,  386,  387,  388,  800,  162,  390,  391,  392,  403,
      404,  405,  442,  443,  444,  465,  466,  467,  165,  477,
      478,  479,  801,  802,  162,  480,  481,  482,  483,  484,
      485,  468,  469,  527,  528,  529,  579,  165,  555,  556,
      557,  581,  597,  598,  599,  803,  580,  676,  804,  530,
      531,  582,  805,  806,  558,  559,  807,  677,  600,  601,
      808,  602,  630,  631,  632,  651,  652,  653,  708,  809,
      810,  811,  812,  813,  814,  709,  678,  710,  633,  634,
      729,  654,  655,  679,  815,  680,  681,  730,  816,  731,
      817,  818,  819,  820,  821,  822,  823,  824,  825,  826,

      827,  828,  829,  830,  831,  832,  833,  834,  835,  836,
      837,  838,  839,  840,  841,  842,  843,  844,  845,  846,
      847,  848,  849,  850,  851,  852,  853,  854,  855,  856,
      857,  858,  859,  860,  861,  862,  863,  864,  865,  866,
      867,  868,  869,  870,  871,  872,  873,  874,  875,  876,
      877,  878,  879,  880,  881,  882,  883,  884,  885,  886,
      887,  888,  889,   76,   76,  791,   76,  790,  789,   76,
       88,   88,   88,   88,   88,   88,  160,  160,  160,  160,
      160,  160,   72,  788,   72,   72,  163,  787,  163,  163,
      168,  786,  168,  169,  169,  169,  169,  261,  785,  261,

      263,  784,  263,  783,  782,  781,  780,  779,  778,  777,
      776,  775,  774,  773,  772,  771,  770,  769,  768,  767,
      766,  765,  764,  763,  762,  761,  760,  759,  758,  757,
      756,  755,  754,  753,  752,  751,  750,  749,  748,  747,
      746,  745,  744,  743,  742,  741,  740,  739,  738,  737,
      736,  735,  734,  733,  732,  728,  727,  726,  725,  724,
      723,  722,  721,  720,  719,  718,  717,  716,  715,  714,
      713,  712,  711,  707,  706,  705,  704,  703,  702,  701,
      700,  699,  698,  697,  696,  695,  694,  693,  692,  691,
      690,  689,  688,  687,  686,  685,  684,  683,  682,  675,

      674,  673,  672,  671,  670,  669,  668,  667,  666,  665,
      664,  663,  662,  661,  660,  659,  658,  657,  656,  650,
      649,  648,  647,  646,  645,  644,  643,  642,  641,  640,
      639,  638,  637,  636,  635,  629,  628,  627,  626,  625,
      624,  623,  622,  621,  620,  619,  618,  617,  616,  615,
      614,  613,  612,  611,  610,  609,  608,  607,  606,  605,
      604,  603,  596,  595,  594,  593,  592,  591,  590,  589,
      588,  587,  586,  585,  584,  583,  578,  577,  576,  575,
      574,  573,  572,  571,  570,  569,  568,  567,  566,  565,
      564,  563,  562,  561,  560,  554,  553,  552,  551,  550,

      549,  548,  547,  546,  545,  544,  543,  542,  541,  540,
      539,  538,  537,  536,  535,  534,  533,  532,  526,  525,
      524,  523,  522,  521,  520,  519,  518,  517,  516,  515,
      514,  513,  512,  511,  510,  509,  508,  507,  506,  505,
      504,  503,  502,  501,  500,  499,  498,  497,  496,  495,
      494,  493,  492,  491,  490,  489,  488,  487,  486,  476,
      475,  474,  473,  472,  471,  470,  464,  463,  462,  461,
      460,  459,  458,  457,  456,  455,  454,  453,  452,  451,
      450,  449,  448,  447,  446,  445,  441,  440,  439,  438,
      437,  436,  435,  434,  433,  432,  431,  430,  429,  428,

      427,  426,  425,  424,  423,  422,  421,  420,  419,  418,
      417,  416,  415,  414,  413,  412,  411,  410,  409,  408,
      407,  406,  400,  399,  398,  397,  396,  395,  394,  393,
      389,  385,  384,  383,  382,  381,  377,  376,  375,  374,
      373,  372,  371,  370,  369,  365,  364,  363,  362,  361,
      360,  359,  358,  357,  356,  355,  351,  350,  349,  348,
      347,  344,  343,  342,  341,  340,  339,  338,  337,  336,
      335,  334,  333,  332,  331,  330,  329,  328,  325,  324,
      323,  322,  321,  320,  319,  318,  317,  316,  315,  311,
      310,  309,  308,  307,  306,  305,  304,  303,  302,  301,

      300,  299,  298,  297,  296,  295,  294,  293,  292,  291,
      290,  289,  288,  287,  286,  285,  284,  283,  282,  279,
      278,  277,  276,  273,  272,  271,  270,  269,  268,  267,
      266,  259,  258,  257,  254,  253,  252,  245,  244,  243,
      242,  241,  236,  235,  232,  228,  227,  223,  220,  219,
      218,  215,  214,  213,  212,  206,  205,  204,  203,  202,
      201,  200,  199,  194,  193,  192,  191,  190,  189,  188,
      187,  183,  182,  181,  180,  179,  178,  177,  174,  173,
      172,  171,  170,  157,  136,  132,  115,   91,   85,   80,
       73,   67,   62,  890,    5,  890,  890,  890,  890,  890,

      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890
    } ;

static const flex_int16_t yy_chk[1173] =
    {   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,    1,    1,    1,    1,    1,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,

        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,   10,   10,   11,   15,   17,   18,
       18,   18,   18,   18,   18,   18,   18,   18,   18,   52,
       21,   24,   26,   26,   17,   15,   31,   52,   11,   20,
       55,   20,   20,   20,   20,   20,   20,   20,   20,   20,
       20,   24,   21,   24,   24,  111,   31,   34,   33,   34,

       21,   20,   34,   34,   35,   37,  111,   37,   35,   20,
       20,   21,   33,   33,   35,   36,   37,   35,   43,   36,
       20,   40,   43,   38,   36,   21,  758,   55,   42,   40,
       36,   38,   41,   38,   20,   41,   38,   20,   41,   41,
       40,   42,   38,   41,   41,   44,   41,   46,  169,   48,
       49,   51,   77,   49,   77,   51,   48,   48,   44,   94,
       48,   49,   46,   94,   51,   46,   48,   48,   49,   48,
       50,   72,   72,  169,   50,   74,   74,  127,   50,   75,
       75,   50,  102,   76,  112,  127,  102,  102,  133,  122,
       72,   72,  122,  122,   74,   74,  122,  112,  122,  136,

      131,  133,  141,  133,   75,   76,  131,   75,  138,  142,
      148,  148,  149,   76,  759,  136,  136,  141,  150,  760,
      149,  138,  142,  154,   76,  154,  150,  161,  761,  161,
      163,  163,  164,  168,  164,  168,  186,  186,   76,  167,
      167,  167,  167,  167,  167,  167,  167,  167,  167,  163,
      163,  181,  218,  218,  218,  248,  230,  307,  307,  168,
      230,  762,  764,  248,  181,  254,  254,  254,  260,  260,
      260,  260,  260,  260,  260,  260,  260,  260,  168,  261,
      765,  261,  262,  262,  262,  262,  262,  262,  262,  262,
      262,  262,  263,  766,  263,  273,  273,  273,  285,  285,

      285,  294,  294,  294,  767,  261,  298,  298,  298,  308,
      308,  308,  350,  350,  350,  394,  394,  394,  263,  407,
      407,  407,  768,  770,  261,  408,  408,  408,  409,  409,
      409,  394,  394,  464,  464,  464,  532,  263,  510,  510,
      510,  533,  551,  551,  551,  771,  532,  640,  774,  464,
      464,  533,  776,  778,  510,  510,  779,  640,  551,  551,
      780,  551,  587,  587,  587,  611,  611,  611,  670,  781,
      782,  783,  785,  786,  787,  670,  641,  670,  587,  587,
      692,  611,  611,  641,  788,  641,  641,  692,  789,  692,
      790,  793,  794,  797,  798,  799,  800,  801,  802,  803,

      804,  805,  806,  807,  808,  811,  812,  813,  814,  815,
      816,  817,  818,  819,  820,  821,  822,  825,  826,  827,
      828,  831,  832,  833,  835,  836,  837,  839,  840,  843,
      844,  845,  846,  847,  848,  849,  850,  851,  853,  854,
      855,  856,  857,  858,  859,  860,  862,  863,  864,  865,
      867,  870,  874,  875,  876,  878,  879,  880,  882,  885,
      886,  887,  888,  891,  891,  757,  891,  756,  755,  891,
      892,  892,  892,  892,  892,  892,  893,  893,  893,  893,
      893,  893,  894,  754,  894,  894,  895,  753,  895,  895,
      896,  752,  896,  897,  897,  897,  897,  898,  751,  898,

      899,  750,  899,  749,  747,  746,  745,  744,  743,  742,
      741,  740,  739,  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,  705,  704,  703,  702,  701,  700,
      699,  697,  696,  695,  694,  691,  689,  688,  687,  685,
      684,  683,  682,  681,  680,  679,  678,  677,  676,  675,
      674,  673,  672,  669,  668,  667,  666,  665,  664,  662,
      661,  660,  659,  658,  657,  655,  654,  653,  652,  651,
      650,  649,  648,  647,  646,  645,  644,  643,  642,  637,

      635,  634,  633,  632,  631,  630,  626,  625,  624,  623,
      622,  621,  620,  619,  618,  616,  615,  614,  613,  609,
      608,  606,  605,  603,  602,  601,  600,  599,  598,  597,
      593,  592,  591,  589,  588,  586,  585,  584,  583,  582,
      581,  580,  579,  578,  577,  575,  574,  569,  568,  567,
      566,  565,  564,  562,  561,  559,  558,  557,  556,  555,
      553,  552,  550,  549,  548,  547,  546,  545,  544,  543,
      540,  539,  538,  537,  536,  535,  531,  530,  529,  528,
      527,  526,  523,  522,  521,  520,  519,  518,  517,  516,
      515,  514,  513,  512,  511,  509,  508,  505,  499,  497,

      496,  495,  493,  492,  489,  488,  487,  486,  475,  474,
      473,  472,  471,  469,  468,  467,  466,  465,  462,  460,
      459,  458,  456,  455,  453,  452,  450,  449,  448,  446,
      445,  440,  439,  437,  436,  435,  434,  433,  432,  431,
      430,  429,  428,  427,  425,  424,  423,  422,  421,  420,
      419,  418,  416,  415,  414,  413,  412,  411,  410,  406,
      402,  401,  400,  399,  398,  395,  393,  383,  381,  377,
      376,  375,  374,  372,  371,  369,  365,  363,  362,  361,
      360,  359,  358,  357,  356,  351,  349,  348,  347,  346,
      345,  343,  342,  339,  338,  337,  336,  335,  334,  333,

      332,  331,  330,  329,  328,  327,  326,  325,  324,  323,
      322,  321,  320,  319,  318,  317,  316,  315,  314,  313,
      312,  309,  306,  305,  304,  303,  302,  301,  300,  299,
      297,  293,  291,  290,  289,  288,  284,  283,  282,  281,
      280,  279,  278,  277,  276,  272,  271,  269,  268,  267,
      266,  259,  258,  257,  256,  255,  253,  252,  251,  250,
      249,  247,  246,  245,  244,  243,  242,  241,  240,  239,
      238,  237,  236,  235,  234,  233,  232,  231,  229,  228,
      227,  226,  225,  224,  223,  222,  221,  220,  219,  217,
      216,  215,  214,  213,  212,  211,  210,  209,  208,  207,

      206,  205,  204,  203,  202,  201,  200,  198,  197,  196,
      195,  194,  193,  192,  191,  190,  189,  188,  187,  185,
      184,  183,  182,  180,  179,  178,  177,  176,  175,  173,
      172,  157,  156,  155,  153,  152,  151,  147,  146,  145,
      144,  143,  140,  139,  137,  135,  134,  132,  130,  129,
      128,  126,  125,  124,  123,  121,  120,  118,  117,  116,
      115,  114,  113,  110,  109,  108,  107,  106,  105,  104,
      103,  101,  100,   99,   98,   97,   96,   95,   93,   92,
       91,   87,   83,   53,   47,   45,   39,   32,   25,   22,
       19,   14,    9,    5,  890,  890,  890,  890,  890,  890,

      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890,  890,  890,  890,  890,  890,  890,  890,  890,
      890,  890
    } ;


/* Table of booleans, true if rule could match eol. */
static const flex_int32_t yy_rule_can_match_eol[248] =
    {   0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 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 2002 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

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

IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN scripts/run_code_generation.py
WHICH GENERATES THE GLSL ES LEXER (glslang_lex_autogen.cpp).
*/

#include "compiler/translator/glslang.h"
#include "compiler/translator/ParseContext.h"
#include "compiler/preprocessor/Token.h"
#include "compiler/translator/util.h"
#include "compiler/translator/length_limits.h"

using namespace sh;

#include "glslang_tab_autogen.h"

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

// Workaround for flex using the register keyword, deprecated in C++11.
#ifdef __cplusplus
#if __cplusplus > 199711L
#define register
#endif
#endif

#define YY_NO_INPUT
#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);
// Tests if an extension is enabled.  If the extension is promoted to core, this function returns true.
static bool is_extension_enabled_or_is_core(TParseContext *context,
        int extension_version, TExtension extension, int promotion_version);
// Helpers to determine if a symbol is reserved, keyword in extension or core, or identifier.
// Formatted as:
//
//    [V1_reserved_][V2_extension_][V3_keyword]
//
// which means in version V1, the symbol is reserved, and remains reserved until V3.  From versions
// V2 until V3, it's a keyword if the extension is enabled.  From version V3 on, it's a keyword in
// the spec itself.  Prior to V1, the symbol can be used as identifier.
static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
static int ES3_keyword(TParseContext *context, int token);
static int ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES3_1_keyword(TParseContext *context, int token);
static int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token);
static int ES3_extension(TParseContext *context, TExtension extension, int token);
static int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
static int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token);
static int uint_constant(TParseContext *context);
static int int_constant(TParseContext *context);
static int float_constant(yyscan_t yyscanner);
static int floatsuffix_check(TParseContext* context);
static int yuvcscstandardext_constant(TParseContext *context);




#define INITIAL 0
#define FIELDS 1






#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 >= 891 )
					yy_c = yy_meta[yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 890 );
		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 ES3_1_keyword(context, BUFFER); }
	YY_BREAK
case 10:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, VARYING); }
	YY_BREAK
case 11:
YY_RULE_SETUP
{ return BREAK; }
	YY_BREAK
case 12:
YY_RULE_SETUP
{ return CONTINUE; }
	YY_BREAK
case 13:
YY_RULE_SETUP
{ return DO; }
	YY_BREAK
case 14:
YY_RULE_SETUP
{ return FOR; }
	YY_BREAK
case 15:
YY_RULE_SETUP
{ return WHILE; }
	YY_BREAK
case 16:
YY_RULE_SETUP
{ return IF; }
	YY_BREAK
case 17:
YY_RULE_SETUP
{ return ELSE; }
	YY_BREAK
case 18:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SWITCH); }
	YY_BREAK
case 19:
YY_RULE_SETUP
{ return ES3_keyword(context, CASE); }
	YY_BREAK
case 20:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, DEFAULT); }
	YY_BREAK
case 21:
YY_RULE_SETUP
{ return ES3_keyword(context, CENTROID); }
	YY_BREAK
case 22:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, FLAT); }
	YY_BREAK
case 23:
YY_RULE_SETUP
{ return ES3_keyword(context, SMOOTH); }
	YY_BREAK
case 24:
YY_RULE_SETUP
{ return IN_QUAL; }
	YY_BREAK
case 25:
YY_RULE_SETUP
{ return OUT_QUAL; }
	YY_BREAK
case 26:
YY_RULE_SETUP
{ return INOUT_QUAL; }
	YY_BREAK
case 27:
YY_RULE_SETUP
{ return ES3_1_keyword(context, SHARED); }
	YY_BREAK
case 28:
YY_RULE_SETUP
{ return FLOAT_TYPE; }
	YY_BREAK
case 29:
YY_RULE_SETUP
{ return INT_TYPE; }
	YY_BREAK
case 30:
YY_RULE_SETUP
{ return ES3_keyword(context, UINT_TYPE); }
	YY_BREAK
case 31:
YY_RULE_SETUP
{ return VOID_TYPE; }
	YY_BREAK
case 32:
YY_RULE_SETUP
{ return BOOL_TYPE; }
	YY_BREAK
case 33:
YY_RULE_SETUP
{ yylval->lex.b = true;  return BOOLCONSTANT; }
	YY_BREAK
case 34:
YY_RULE_SETUP
{ yylval->lex.b = false; return BOOLCONSTANT; }
	YY_BREAK
case 35:
YY_RULE_SETUP
{ return DISCARD; }
	YY_BREAK
case 36:
YY_RULE_SETUP
{ return RETURN; }
	YY_BREAK
case 37:
YY_RULE_SETUP
{ return MATRIX2; }
	YY_BREAK
case 38:
YY_RULE_SETUP
{ return MATRIX3; }
	YY_BREAK
case 39:
YY_RULE_SETUP
{ return MATRIX4; }
	YY_BREAK
case 40:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX2); }
	YY_BREAK
case 41:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX3); }
	YY_BREAK
case 42:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX4); }
	YY_BREAK
case 43:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX2x3); }
	YY_BREAK
case 44:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX3x2); }
	YY_BREAK
case 45:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX2x4); }
	YY_BREAK
case 46:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX4x2); }
	YY_BREAK
case 47:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX3x4); }
	YY_BREAK
case 48:
YY_RULE_SETUP
{ return ES3_keyword(context, MATRIX4x3); }
	YY_BREAK
case 49:
YY_RULE_SETUP
{ return VEC2; }
	YY_BREAK
case 50:
YY_RULE_SETUP
{ return VEC3; }
	YY_BREAK
case 51:
YY_RULE_SETUP
{ return VEC4; }
	YY_BREAK
case 52:
YY_RULE_SETUP
{ return IVEC2; }
	YY_BREAK
case 53:
YY_RULE_SETUP
{ return IVEC3; }
	YY_BREAK
case 54:
YY_RULE_SETUP
{ return IVEC4; }
	YY_BREAK
case 55:
YY_RULE_SETUP
{ return BVEC2; }
	YY_BREAK
case 56:
YY_RULE_SETUP
{ return BVEC3; }
	YY_BREAK
case 57:
YY_RULE_SETUP
{ return BVEC4; }
	YY_BREAK
case 58:
YY_RULE_SETUP
{ return ES3_keyword(context, UVEC2); }
	YY_BREAK
case 59:
YY_RULE_SETUP
{ return ES3_keyword(context, UVEC3); }
	YY_BREAK
case 60:
YY_RULE_SETUP
{ return ES3_keyword(context, UVEC4); }
	YY_BREAK
case 61:
YY_RULE_SETUP
{ return SAMPLER2D; }
	YY_BREAK
case 62:
YY_RULE_SETUP
{ return SAMPLERCUBE; }
	YY_BREAK
case 63:
YY_RULE_SETUP
{ return SAMPLER_EXTERNAL_OES; }
	YY_BREAK
case 64:
YY_RULE_SETUP
{ return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::OES_texture_3D, SAMPLER3D); }
	YY_BREAK
case 65:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
	YY_BREAK
case 66:
YY_RULE_SETUP
{ return SAMPLER2DRECT; }
	YY_BREAK
case 67:
YY_RULE_SETUP
{ return ES3_keyword(context, SAMPLER2DARRAY); }
	YY_BREAK
case 68:
YY_RULE_SETUP
{ return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); }
	YY_BREAK
case 69:
YY_RULE_SETUP
{ return ES3_keyword(context, ISAMPLER2D); }
	YY_BREAK
case 70:
YY_RULE_SETUP
{ return ES3_keyword(context, ISAMPLER3D); }
	YY_BREAK
case 71:
YY_RULE_SETUP
{ return ES3_keyword(context, ISAMPLERCUBE); }
	YY_BREAK
case 72:
YY_RULE_SETUP
{ return ES3_keyword(context, ISAMPLER2DARRAY); }
	YY_BREAK
case 73:
YY_RULE_SETUP
{ return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); }
	YY_BREAK
case 74:
YY_RULE_SETUP
{ return ES3_keyword(context, USAMPLER2D); }
	YY_BREAK
case 75:
YY_RULE_SETUP
{ return ES3_keyword(context, USAMPLER3D); }
	YY_BREAK
case 76:
YY_RULE_SETUP
{ return ES3_keyword(context, USAMPLERCUBE); }
	YY_BREAK
case 77:
YY_RULE_SETUP
{ return ES3_keyword(context, USAMPLER2DARRAY); }
	YY_BREAK
case 78:
YY_RULE_SETUP
{ return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); }
	YY_BREAK
case 79:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
	YY_BREAK
case 80:
YY_RULE_SETUP
{ return ES3_keyword(context, SAMPLERCUBESHADOW); }
	YY_BREAK
case 81:
YY_RULE_SETUP
{ return ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
	YY_BREAK
case 82:
YY_RULE_SETUP
{ return ES3_extension(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); }
	YY_BREAK
case 83:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); }
	YY_BREAK
case 84:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); }
	YY_BREAK
case 85:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); }
	YY_BREAK
case 86:
YY_RULE_SETUP
{ return STRUCT; }
	YY_BREAK
case 87:
YY_RULE_SETUP
{ return ES3_keyword(context, LAYOUT); }
	YY_BREAK
case 88:
YY_RULE_SETUP
{ return ES3_extension(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); }
	YY_BREAK
case 89:
YY_RULE_SETUP
{ return yuvcscstandardext_constant(context); }
	YY_BREAK
case 90:
YY_RULE_SETUP
{ return yuvcscstandardext_constant(context); }
	YY_BREAK
case 91:
YY_RULE_SETUP
{ return yuvcscstandardext_constant(context); }
	YY_BREAK
case 92:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
	YY_BREAK
case 93:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
	YY_BREAK
case 94:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
	YY_BREAK
case 95:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
	YY_BREAK
case 96:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
	YY_BREAK
case 97:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
	YY_BREAK
case 98:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
	YY_BREAK
case 99:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
	YY_BREAK
case 100:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
	YY_BREAK
case 101:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
	YY_BREAK
case 102:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
	YY_BREAK
case 103:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
	YY_BREAK
case 104:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, READONLY); }
	YY_BREAK
case 105:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
	YY_BREAK
case 106:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, COHERENT); }
	YY_BREAK
case 107:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, RESTRICT); }
	YY_BREAK
case 108:
YY_RULE_SETUP
{ return ES2_reserved_ES3_1_keyword(context, VOLATILE); }
	YY_BREAK
case 109:
YY_RULE_SETUP
{ return ES3_reserved_ES3_1_keyword(context, ATOMICUINT); }
	YY_BREAK
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
case 110:
case 111:
case 112:
case 113:
case 114:
case 115:
case 116:
case 117:
case 118:
case 119:
case 120:
case 121:
case 122:
case 123:
case 124:
case 125:
case 126:
case 127:
case 128:
case 129:
case 130:
case 131:
case 132:
case 133:
case 134:
case 135:
case 136:
case 137:
case 138:
case 139:
case 140:
case 141:
case 142:
YY_RULE_SETUP
{
    if (context->getShaderVersion() < 300) {
        yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
        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 143:
YY_RULE_SETUP
{
    if (context->getShaderVersion() >= 300)
    {
        yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
        return check_type(yyscanner);
    }

    return reserved_word(yyscanner);
}
	YY_BREAK
/* Reserved keywords */
case 144:
case 145:
case 146:
case 147:
case 148:
case 149:
case 150:
case 151:
case 152:
case 153:
case 154:
case 155:
case 156:
case 157:
case 158:
case 159:
case 160:
case 161:
case 162:
case 163:
case 164:
case 165:
case 166:
case 167:
case 168:
case 169:
case 170:
case 171:
case 172:
case 173:
case 174:
case 175:
case 176:
case 177:
case 178:
case 179:
case 180:
case 181:
case 182:
case 183:
YY_RULE_SETUP
{ return reserved_word(yyscanner); }
	YY_BREAK
case 184:
YY_RULE_SETUP
{
   yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
   return check_type(yyscanner);
}
	YY_BREAK
case 185:
YY_RULE_SETUP
{ return int_constant(context); }
	YY_BREAK
case 186:
YY_RULE_SETUP
{ return int_constant(context); }
	YY_BREAK
case 187:
YY_RULE_SETUP
{ return int_constant(context); }
	YY_BREAK
case 188:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 189:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 190:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 191:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 192:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 193:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 194:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 195:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 196:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 197:
YY_RULE_SETUP
{ return ADD_ASSIGN; }
	YY_BREAK
case 198:
YY_RULE_SETUP
{ return SUB_ASSIGN; }
	YY_BREAK
case 199:
YY_RULE_SETUP
{ return MUL_ASSIGN; }
	YY_BREAK
case 200:
YY_RULE_SETUP
{ return DIV_ASSIGN; }
	YY_BREAK
case 201:
YY_RULE_SETUP
{ return MOD_ASSIGN; }
	YY_BREAK
case 202:
YY_RULE_SETUP
{ return LEFT_ASSIGN; }
	YY_BREAK
case 203:
YY_RULE_SETUP
{ return RIGHT_ASSIGN; }
	YY_BREAK
case 204:
YY_RULE_SETUP
{ return AND_ASSIGN; }
	YY_BREAK
case 205:
YY_RULE_SETUP
{ return XOR_ASSIGN; }
	YY_BREAK
case 206:
YY_RULE_SETUP
{ return OR_ASSIGN; }
	YY_BREAK
case 207:
YY_RULE_SETUP
{ return INC_OP; }
	YY_BREAK
case 208:
YY_RULE_SETUP
{ return DEC_OP; }
	YY_BREAK
case 209:
YY_RULE_SETUP
{ return AND_OP; }
	YY_BREAK
case 210:
YY_RULE_SETUP
{ return OR_OP; }
	YY_BREAK
case 211:
YY_RULE_SETUP
{ return XOR_OP; }
	YY_BREAK
case 212:
YY_RULE_SETUP
{ return LE_OP; }
	YY_BREAK
case 213:
YY_RULE_SETUP
{ return GE_OP; }
	YY_BREAK
case 214:
YY_RULE_SETUP
{ return EQ_OP; }
	YY_BREAK
case 215:
YY_RULE_SETUP
{ return NE_OP; }
	YY_BREAK
case 216:
YY_RULE_SETUP
{ return LEFT_OP; }
	YY_BREAK
case 217:
YY_RULE_SETUP
{ return RIGHT_OP; }
	YY_BREAK
case 218:
YY_RULE_SETUP
{ return SEMICOLON; }
	YY_BREAK
case 219:
YY_RULE_SETUP
{ return LEFT_BRACE; }
	YY_BREAK
case 220:
YY_RULE_SETUP
{ return RIGHT_BRACE; }
	YY_BREAK
case 221:
YY_RULE_SETUP
{ return COMMA; }
	YY_BREAK
case 222:
YY_RULE_SETUP
{ return COLON; }
	YY_BREAK
case 223:
YY_RULE_SETUP
{ return EQUAL; }
	YY_BREAK
case 224:
YY_RULE_SETUP
{ return LEFT_PAREN; }
	YY_BREAK
case 225:
YY_RULE_SETUP
{ return RIGHT_PAREN; }
	YY_BREAK
case 226:
YY_RULE_SETUP
{ return LEFT_BRACKET; }
	YY_BREAK
case 227:
YY_RULE_SETUP
{ return RIGHT_BRACKET; }
	YY_BREAK
case 228:
YY_RULE_SETUP
{ BEGIN(FIELDS); return DOT; }
	YY_BREAK
case 229:
YY_RULE_SETUP
{ return BANG; }
	YY_BREAK
case 230:
YY_RULE_SETUP
{ return DASH; }
	YY_BREAK
case 231:
YY_RULE_SETUP
{ return TILDE; }
	YY_BREAK
case 232:
YY_RULE_SETUP
{ return PLUS; }
	YY_BREAK
case 233:
YY_RULE_SETUP
{ return STAR; }
	YY_BREAK
case 234:
YY_RULE_SETUP
{ return SLASH; }
	YY_BREAK
case 235:
YY_RULE_SETUP
{ return PERCENT; }
	YY_BREAK
case 236:
YY_RULE_SETUP
{ return LEFT_ANGLE; }
	YY_BREAK
case 237:
YY_RULE_SETUP
{ return RIGHT_ANGLE; }
	YY_BREAK
case 238:
YY_RULE_SETUP
{ return VERTICAL_BAR; }
	YY_BREAK
case 239:
YY_RULE_SETUP
{ return CARET; }
	YY_BREAK
case 240:
YY_RULE_SETUP
{ return AMPERSAND; }
	YY_BREAK
case 241:
YY_RULE_SETUP
{ return QUESTION; }
	YY_BREAK
case 242:
YY_RULE_SETUP
{
    BEGIN(INITIAL);
    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
    return FIELD_SELECTION;
}
	YY_BREAK
case 243:
YY_RULE_SETUP
{}
	YY_BREAK
case 244:
YY_RULE_SETUP
{
    yyextra->error(*yylloc, "Illegal character at fieldname start", yytext);
    return 0;
}
	YY_BREAK
case 245:
/* rule 245 can match eol */
YY_RULE_SETUP
{ }
	YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(FIELDS):
{ yyterminate(); }
	YY_BREAK
case 246:
YY_RULE_SETUP
{ assert(false); return 0; }
	YY_BREAK
case 247:
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_size_t ret = 0;
		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
			ret, num_to_read );
		yyg->yy_n_chars = static_cast<int>(ret);

		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 >= 891 )
				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 >= 891 )
			yy_c = yy_meta[yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
	yy_is_jam = (yy_current_state == 890);

	(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) {
    angle::pp::Token token;
    yyget_extra(yyscanner)->getPreprocessor().lex(&token);
    yy_size_t len = token.type == angle::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;
    // Note that the ImmutableString used here isn't static or pool allocated - but it's fine since yytext is valid for the duration of its use.
    const TSymbol* symbol = yyextra->symbolTable.find(ImmutableString(yytext, yyleng), yyextra->getShaderVersion());
    if (symbol && symbol->isStruct())
    {
        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);
    return 0;
}

static bool is_extension_enabled_or_is_core(TParseContext *context,
        int extension_version, TExtension extension, int promotion_version)
{
    int version = context->getShaderVersion();

    // If version is at least promotion_version, symbol is definitely keyword.  Otherwise it's a
    // keyword if version is at least extension_version (where the extension was introduced) and
    // the extension is enabled.
    return version >= promotion_version ||
        (version >= extension_version && context->isExtensionEnabled(extension));
}

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 ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
{
    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
    yyscan_t yyscanner = (yyscan_t) context->getScanner();

    if (context->getShaderVersion() < 300)
    {
        yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
        return check_type(yyscanner);
    }
    else if (context->getShaderVersion() == 300)
    {
        return reserved_word(yyscanner);
    }

    return token;
}

int 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 = AllocatePoolCharArray(yytext, yyleng);
        return check_type(yyscanner);
    }

    return token;
}

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

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

    return token;
}

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

    // A keyword in GLSL ES 3.10.
    if (context->getShaderVersion() >= 310)
    {
        return token;
    }

    // Otherwise can be used as an identifier/type name
    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
    return check_type(yyscanner);
}

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

    // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
    if (is_extension_enabled_or_is_core(context, 100, extension, 300))
    {
        return token;
    }

    // Reserved otherwise.
    return reserved_word(yyscanner);
}

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

    // a keyword word in GLSL ES 3.00 with enabled extension.
    if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension))
    {
        return token;
    }

    // Otherwise can be used as an identifier/type name
    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
    return check_type(yyscanner);
}

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

    // a keyword in GLSL ES 3.10 with enabled extension
    if (is_extension_enabled_or_is_core(context, 310, extension, 320))
    {
        return token;
    }
    // a reserved word in GLSL ES 3.00+
    if (context->getShaderVersion() >= 300)
    {
        return reserved_word(yyscanner);
    }

    // Otherwise can be used as an identifier/type name
    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
    return check_type(yyscanner);
}

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

    // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10
    if (is_extension_enabled_or_is_core(context, 300, extension, 310))
    {
        return token;
    }

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

    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
    return check_type(yyscanner);
}

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);
        return 0;
    }

    if (!atoi_clamp(yytext, &(yylval->lex.u)))
        yyextra->error(*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);
        return 0;
    }

    std::string text = yytext;
    text.resize(text.size() - 1);
    if (!strtof_clamp(text, &(yylval->lex.f)))
        yyextra->warning(*yylloc, "Float overflow", yytext);

    return(FLOATCONSTANT);
}

void yyerror(YYLTYPE* lloc, TParseContext* context, void *scanner, const char* reason) {
    context->error(*lloc, reason, yyget_text(scanner));
}

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

    unsigned int u;
    if (!atoi_clamp(yytext, &u))
    {
        if (context->getShaderVersion() >= 300)
            yyextra->error(*yylloc, "Integer overflow", yytext);
        else
            yyextra->warning(*yylloc, "Integer overflow", yytext);
    }
    yylval->lex.i = static_cast<int>(u);
    return INTCONSTANT;
}

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

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

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

    // a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name
    if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(TExtension::EXT_YUV_target))
    {
        yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
        return YUVCSCSTANDARDEXTCONSTANT;
    }

    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
    return check_type(yyscanner);
}

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());

    // Initialize preprocessor.
    angle::pp::Preprocessor *preprocessor = &context->getPreprocessor();

    if (!preprocessor->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) {
        preprocessor->predefineMacro(GetExtensionNameString(iter->first), 1);
    }
    if (context->getFragmentPrecisionHigh())
        preprocessor->predefineMacro("GL_FRAGMENT_PRECISION_HIGH", 1);

    preprocessor->setMaxTokenSize(sh::GetGlobalMaxTokenSize(context->getShaderSpec()));

    return 0;
}

