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

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

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



#line 25 "./glslang_lex.cpp"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

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

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

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

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

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

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

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

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

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

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

#ifdef __cplusplus

/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST

#else	/* ! __cplusplus */

/* C99 requires __STDC__ to be defined as 1. */
#if defined (__STDC__)

#define YY_USE_CONST

#endif	/* defined (__STDC__) */
#endif	/* ! __cplusplus */

#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif

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

/* Promotes a possibly negative, possibly signed char to an unsigned
 * integer for use as an array index.  If the signed char is negative,
 * we want to instead treat it as an 8-bit unsigned char, hence the
 * double cast.
 */
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)

/* An opaque pointer. */
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif

/* For convenience, these vars (plus the bison vars far below)
   are macros in the reentrant scanner. */
#define yyin yyg->yyin_r
#define yyout yyg->yyout_r
#define yyextra yyg->yyextra_r
#define yyleng yyg->yyleng_r
#define yytext yyg->yytext_r
#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
#define yy_flex_debug yyg->yy_flex_debug_r

/* Enter a start condition.  This macro really ought to take a parameter,
 * but we do it the disgusting crufty way forced on us by the ()-less
 * definition of BEGIN.
 */
#define BEGIN yyg->yy_start = 1 + 2 *

/* Translate the current start state into a value that can be later handed
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
 * compatibility.
 */
#define YY_START ((yyg->yy_start - 1) / 2)
#define YYSTATE YY_START

/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)

/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE 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.
	 */
	yy_size_t yy_buf_size;

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

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

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

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

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */
    
	/* Whether to try to fill the input buffer when we reach the
	 * end of it.
	 */
	int yy_fill_buffer;

	int yy_buffer_status;

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

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

/* We provide macros for accessing buffer states in case in the
 * future we want to put the buffer states in a more general
 * "scanner state".
 *
 * Returns the top of the stack, or NULL.
 */
#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
                          : NULL)

/* Same as previous macro, but useful when we know that the buffer stack is not
 * NULL or when we need an lvalue. For internal use only.
 */
#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]

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

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

#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

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

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

#define yy_new_buffer yy_create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        yyensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}

#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        yyensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}

#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

#define yywrap(yyscanner) (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP

typedef unsigned char YY_CHAR;

typedef int yy_state_type;

#define yytext_ptr yytext_r

static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
static int yy_get_next_buffer (yyscan_t yyscanner );
#if defined(__GNUC__) && __GNUC__ >= 3
__attribute__((__noreturn__))
#endif
static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
	yyg->yytext_ptr = yy_bp; \
	yyleng = (size_t) (yy_cp - yy_bp); \
	yyg->yy_hold_char = *yy_cp; \
	*yy_cp = '\0'; \
	yyg->yy_c_buf_p = yy_cp;

#define YY_NUM_RULES 244
#define YY_END_OF_BUFFER 245
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
	{
	flex_int32_t yy_verify;
	flex_int32_t yy_nxt;
	};
static yyconst flex_int16_t yy_accept[828] =
    {   0,
        0,    0,    0,    0,    0,    0,  245,  243,  242,  242,
      227,  233,  238,  222,  223,  231,  230,  219,  228,  226,
      232,  185,  185,  220,  216,  234,  221,  235,  239,  182,
      224,  225,  237,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
      182,  182,  182,  217,  236,  218,  229,    3,    4,    3,
      241,  244,  240,  213,  199,  218,  207,  202,  197,  205,
      195,  206,  196,  191,    2,    1,  198,  190,  184,  185,
        0,  188,    0,  225,  217,  224,  214,  210,  212,  211,
      215,  182,  203,  209,  182,  182,  182,  182,  182,  182,

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

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

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

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

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

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

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

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

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

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

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static yyconst YY_CHAR yy_meta[73] =
    {   0,
        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    3,    3,    3,    3,    3,    3,
        3,    1,    1,    1,    1,    1,    1,    4,    4,    4,
        4,    3,    3,    5,    5,    5,    5,    5,    5,    5,
        1,    1,    1,    5,    4,    4,    4,    4,    3,    3,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    1,    1,
        1,    1
    } ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      827,  827,  827,  827,  827
    } ;

static yyconst flex_int16_t yy_chk[1106] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    3,    4,   12,   12,   28,   28,    3,    4,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,

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

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

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

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

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

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

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

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

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

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

      827,  827,  827,  827,  827
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[245] =
    {   0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 1, 0, 0,     };

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
/*
// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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

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

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

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

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

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

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

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

#define YY_EXTRA_TYPE TParseContext*

/* Holds the entire state of the reentrant scanner. */
struct yyguts_t
    {

    /* User-defined. Not touched by flex. */
    YY_EXTRA_TYPE yyextra_r;

    /* The rest are the same as the globals declared in the non-reentrant scanner. */
    FILE *yyin_r, *yyout_r;
    size_t yy_buffer_stack_top; /**< index of top of stack. */
    size_t yy_buffer_stack_max; /**< capacity of stack. */
    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
    char yy_hold_char;
    yy_size_t yy_n_chars;
    yy_size_t yyleng_r;
    char *yy_c_buf_p;
    int yy_init;
    int yy_start;
    int yy_did_buffer_switch_on_eof;
    int yy_start_stack_ptr;
    int yy_start_stack_depth;
    int *yy_start_stack;
    yy_state_type yy_last_accepting_state;
    char* yy_last_accepting_cpos;

    int yylineno_r;
    int yy_flex_debug_r;

    char *yytext_r;
    int yy_more_flag;
    int yy_more_len;

    YYSTYPE * yylval_r;

    YYLTYPE * yylloc_r;

    }; /* end struct yyguts_t */

static int yy_init_globals (yyscan_t yyscanner );

    /* This must go here because YYSTYPE and YYLTYPE are included
     * from bison output in section 1.*/
    #    define yylval yyg->yylval_r
    
    #    define yylloc yyg->yylloc_r
    
int yylex_init (yyscan_t* scanner);

int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);

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

int yylex_destroy (yyscan_t yyscanner );

int yyget_debug (yyscan_t yyscanner );

void yyset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner );

void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *yyget_in (yyscan_t yyscanner );

void yyset_in  (FILE * _in_str ,yyscan_t yyscanner );

FILE *yyget_out (yyscan_t yyscanner );

void yyset_out  (FILE * _out_str ,yyscan_t yyscanner );

yy_size_t yyget_leng (yyscan_t yyscanner );

char *yyget_text (yyscan_t yyscanner );

int yyget_lineno (yyscan_t yyscanner );

void yyset_lineno (int _line_number ,yyscan_t yyscanner );

int yyget_column  (yyscan_t yyscanner );

void yyset_column (int _column_no ,yyscan_t yyscanner );

YYSTYPE * yyget_lval (yyscan_t yyscanner );

void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );

       YYLTYPE *yyget_lloc (yyscan_t yyscanner );
    
        void yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
    
/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

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

#ifndef YY_NO_UNPUT
    
#endif

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

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

#ifndef YY_NO_INPUT

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

#endif

    static void yy_push_state (int _new_state ,yyscan_t yyscanner);
    
    static void yy_pop_state (yyscan_t yyscanner );
    
    static int yy_top_state (yyscan_t yyscanner );
    
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#endif

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

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

#endif

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

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

/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
#endif

/* end tables serialization structures and prototypes */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1

extern int 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;

    /* Single-line comments */

	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 >= 828 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 827 );
		yy_cp = yyg->yy_last_accepting_cpos;
		yy_current_state = yyg->yy_last_accepting_state;

yy_find_action:
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
			{
			yy_size_t yyl;
			for ( yyl = 0; yyl < yyleng; ++yyl )
				if ( yytext[yyl] == '\n' )
					   
    do{ yylineno++;
        yycolumn=0;
    }while(0)
;
			}

do_action:	/* This label is used only to access EOF actions. */

		switch ( yy_act )
	{ /* beginning of action switch */
			case 0: /* must back up */
			/* undo the effects of YY_DO_BEFORE_ACTION */
			*yy_cp = yyg->yy_hold_char;
			yy_cp = yyg->yy_last_accepting_cpos;
			yy_current_state = yyg->yy_last_accepting_state;
			goto yy_find_action;

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

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

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

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = yyg->yy_hold_char;
		YY_RESTORE_YY_MORE_OFFSET

		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
			{
			/* We're scanning a new file or input source.  It's
			 * possible that this happened because the user
			 * just pointed yyin at a new source and called
			 * yylex().  If so, then we have to assure
			 * consistency between YY_CURRENT_BUFFER and our
			 * globals.  Here is the right place to do so, because
			 * this is the first action (other than possibly a
			 * back-up) that will match for the new input source.
			 */
			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
			}

		/* Note that here we test for yy_c_buf_p "<=" to the position
		 * of the first EOB in the buffer, since yy_c_buf_p will
		 * already have been incremented past the NUL character
		 * (since all states make transitions on EOB to the
		 * end-of-buffer state).  Contrast this with the test
		 * in input().
		 */
		if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state( yyscanner );

			/* Okay, we're now positioned to make the NUL
			 * transition.  We couldn't have
			 * yy_get_previous_state() go ahead and do it
			 * for us because it doesn't know how to deal
			 * with the possibility of jamming (and we don't
			 * want to build jamming into it because then it
			 * will run more slowly).
			 */

			yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);

			yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;

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

			else
				{
				yy_cp = yyg->yy_last_accepting_cpos;
				yy_current_state = yyg->yy_last_accepting_state;
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer( yyscanner ) )
			{
			case EOB_ACT_END_OF_FILE:
				{
				yyg->yy_did_buffer_switch_on_eof = 0;

				if ( yywrap(yyscanner ) )
					{
					/* Note: because we've taken care in
					 * yy_get_next_buffer() to have set up
					 * yytext, we can now set up
					 * yy_c_buf_p so that if some total
					 * hoser (like flex itself) wants to
					 * call the scanner after we return the
					 * YY_NULL, it'll still work - another
					 * YY_NULL will get returned.
					 */
					yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! yyg->yy_did_buffer_switch_on_eof )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				yyg->yy_c_buf_p =
					yyg->yytext_ptr + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state( yyscanner );

				yy_cp = yyg->yy_c_buf_p;
				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
				goto yy_match;

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

				yy_current_state = yy_get_previous_state( yyscanner );

				yy_cp = yyg->yy_c_buf_p;
				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
				goto yy_find_action;
			}
		break;
		}

	default:
		YY_FATAL_ERROR(
			"fatal flex scanner internal error--no action found" );
	} /* end of action switch */
		} /* end of scanning one token */
	} /* end of user's declarations */
} /* end of yylex */

/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *	EOB_ACT_LAST_MATCH -
 *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *	EOB_ACT_END_OF_FILE - end of file
 */
static int yy_get_next_buffer (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = yyg->yytext_ptr;
	yy_size_t number_to_move, i;
	int ret_val;

	if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
		YY_FATAL_ERROR(
		"fatal flex scanner internal error--end of buffer missed" );

	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
		{ /* Don't try to fill the buffer, so this is an EOF. */
		if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
			{
			/* We matched a single character, the EOB, so
			 * treat this as a final EOF.
			 */
			return EOB_ACT_END_OF_FILE;
			}

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

	/* Try to read more data. */

	/* First move last chars to start of buffer. */
	number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;

	for ( i = 0; i < number_to_move; ++i )
		*(dest++) = *(source++);

	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
		/* don't do the read, it's not guaranteed to return an EOF,
		 * just force an EOF
		 */
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;

	else
		{
			yy_size_t num_to_read =
			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

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

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

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

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

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

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

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

			yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];

			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
						number_to_move - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

		/* Read in more data. */
		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
			yyg->yy_n_chars, num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

	if ( yyg->yy_n_chars == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			yyrestart(yyin  ,yyscanner);
			}

		else
			{
			ret_val = EOB_ACT_LAST_MATCH;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

	if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
	}

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

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

	return ret_val;
}

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

    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
{
	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 >= 828 )
				yy_c = yy_meta[(unsigned int) yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
		}

	return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
{
	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 >= 828 )
			yy_c = yy_meta[(unsigned int) yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
	yy_is_jam = (yy_current_state == 827);

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

#ifndef YY_NO_UNPUT

#endif

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

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

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

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

		else
			{ /* need more input */
			yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
			++yyg->yy_c_buf_p;

			switch ( yy_get_next_buffer( yyscanner ) )
				{
				case EOB_ACT_LAST_MATCH:
					/* This happens because yy_g_n_b()
					 * sees that we've accumulated a
					 * token and flags that we need to
					 * try matching the token before
					 * proceeding.  But for input(),
					 * there's no matching to consider.
					 * So convert the EOB_ACT_LAST_MATCH
					 * to EOB_ACT_END_OF_FILE.
					 */

					/* Reset buffer status. */
					yyrestart(yyin ,yyscanner);

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( yywrap(yyscanner ) )
						return EOF;

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

				case EOB_ACT_CONTINUE_SCAN:
					yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
					break;
				}
			}
		}

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

	if ( c == '\n' )
		   
    do{ yylineno++;
        yycolumn=0;
    }while(0)
;

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

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * @param yyscanner The scanner object.
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void yyrestart  (FILE * input_file , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

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

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

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * @param yyscanner The scanner object.
 */
    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	/* TODO. We should be able to replace this entire function body
	 * with
	 *		yypop_buffer_state();
	 *		yypush_buffer_state(new_buffer);
     */
	yyensure_buffer_stack (yyscanner);
	if ( YY_CURRENT_BUFFER == new_buffer )
		return;

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

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	yy_load_buffer_state(yyscanner );

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

static void yy_load_buffer_state  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	yyg->yy_hold_char = *yyg->yy_c_buf_p;
}

/** Allocate and initialize an input buffer state.
 * @param file A readable stream.
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
 * @param yyscanner The scanner object.
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

	b->yy_buf_size = (yy_size_t)size;

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

	b->yy_is_our_buffer = 1;

	yy_init_buffer(b,file ,yyscanner);

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * @param yyscanner The scanner object.
 */
    void yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	if ( ! b )
		return;

	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;

	if ( b->yy_is_our_buffer )
		yyfree((void *) b->yy_ch_buf ,yyscanner );

	yyfree((void *) b ,yyscanner );
}

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

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

	yy_flush_buffer(b ,yyscanner);

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

    /* If b is the current buffer, then yy_init_buffer was _probably_
     * called from yyrestart() or through yy_get_next_buffer.
     * In that case, we don't want to reset the lineno or column.
     */
    if (b != YY_CURRENT_BUFFER){
        b->yy_bs_lineno = 1;
        b->yy_bs_column = 0;
    }

        b->yy_is_interactive = 0;
    
	errno = oerrno;
}

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * @param yyscanner The scanner object.
 */
    void yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if ( ! b )
		return;

	b->yy_n_chars = 0;

	/* We always need two end-of-buffer characters.  The first causes
	 * a transition to the end-of-buffer state.  The second causes
	 * a jam in that state.
	 */
	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

	b->yy_buf_pos = &b->yy_ch_buf[0];

	b->yy_at_bol = 1;
	b->yy_buffer_status = YY_BUFFER_NEW;

	if ( b == YY_CURRENT_BUFFER )
		yy_load_buffer_state(yyscanner );
}

/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *  @param yyscanner The scanner object.
 */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (new_buffer == NULL)
		return;

	yyensure_buffer_stack(yyscanner);

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

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

	/* copied from yy_switch_to_buffer. */
	yy_load_buffer_state(yyscanner );
	yyg->yy_did_buffer_switch_on_eof = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  @param yyscanner The scanner object.
 */
void yypop_buffer_state (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (!YY_CURRENT_BUFFER)
		return;

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

	if (YY_CURRENT_BUFFER) {
		yy_load_buffer_state(yyscanner );
		yyg->yy_did_buffer_switch_on_eof = 1;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void yyensure_buffer_stack (yyscan_t yyscanner)
{
	yy_size_t num_to_alloc;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	if (!yyg->yy_buffer_stack) {

		/* First allocation is just for 2 elements, since we don't know if this
		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
		 * immediate realloc on the next call.
         */
		num_to_alloc = 1; // 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 0;

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

	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = 0;
	b->yy_n_chars = b->yy_buf_size;
	b->yy_is_interactive = 0;
	b->yy_at_bol = 1;
	b->yy_fill_buffer = 0;
	b->yy_buffer_status = YY_BUFFER_NEW;

	yy_switch_to_buffer(b ,yyscanner );

	return b;
}

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

/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
 * scan from a @e copy of @a bytes.
 * @param yybytes the byte buffer to scan
 * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	yy_size_t i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = _yybytes_len + 2;
	buf = (char *) yyalloc(n ,yyscanner );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

	for ( i = 0; i < _yybytes_len; ++i )
		buf[i] = yybytes[i];

	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;

	b = yy_scan_buffer(buf,n ,yyscanner);
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );

	/* It's okay to grow etc. this buffer, and we should throw it
	 * away when we're done.
	 */
	b->yy_is_our_buffer = 1;

	return b;
}

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

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

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

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

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

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

	BEGIN(_new_state);
}

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

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

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

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	(void) fprintf( stderr, "%s\n", msg );
	exit( YY_EXIT_FAILURE );
}

/* Redefine yyless() so it works in section 3 code. */

#undef yyless
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		yytext[yyleng] = yyg->yy_hold_char; \
		yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
		yyg->yy_hold_char = *yyg->yy_c_buf_p; \
		*yyg->yy_c_buf_p = '\0'; \
		yyleng = yyless_macro_arg; \
		} \
	while ( 0 )

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

/** Get the user-defined data for this scanner.
 * @param yyscanner The scanner object.
 */
YY_EXTRA_TYPE yyget_extra  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyextra;
}

/** Get the current line number.
 * @param yyscanner The scanner object.
 */
int yyget_lineno  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    
        if (! YY_CURRENT_BUFFER)
            return 0;
    
    return yylineno;
}

/** Get the current column number.
 * @param yyscanner The scanner object.
 */
int yyget_column  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    
        if (! YY_CURRENT_BUFFER)
            return 0;
    
    return yycolumn;
}

/** Get the input stream.
 * @param yyscanner The scanner object.
 */
FILE *yyget_in  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyin;
}

/** Get the output stream.
 * @param yyscanner The scanner object.
 */
FILE *yyget_out  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyout;
}

/** Get the length of the current token.
 * @param yyscanner The scanner object.
 */
yy_size_t yyget_leng  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyleng;
}

/** Get the current token.
 * @param yyscanner The scanner object.
 */

char *yyget_text  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yytext;
}

/** Set the user-defined data. This data is never touched by the scanner.
 * @param user_defined The data to be associated with this scanner.
 * @param yyscanner The scanner object.
 */
void yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyextra = user_defined ;
}

/** Set the current line number.
 * @param _line_number 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 = 0;
    yyg->yy_buffer_stack_top = 0;
    yyg->yy_buffer_stack_max = 0;
    yyg->yy_c_buf_p = (char *) 0;
    yyg->yy_init = 0;
    yyg->yy_start = 0;

    yyg->yy_start_stack_ptr = 0;
    yyg->yy_start_stack_depth = 0;
    yyg->yy_start_stack =  NULL;

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = (FILE *) 0;
    yyout = (FILE *) 0;
#endif

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

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

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

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

    /* Destroy the start condition stack. */
        yyfree(yyg->yy_start_stack ,yyscanner );
        yyg->yy_start_stack = NULL;

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

    /* Destroy the main struct (reentrant only). */
    yyfree ( yyscanner , yyscanner );
    yyscanner = NULL;
    return 0;
}

/*
 * Internal utility routines.
 */

#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;

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

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

	return n;
}
#endif

void *yyalloc (yy_size_t  size , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	return (void *) 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 (void *) realloc( (char *) ptr, size );
}

void yyfree (void * ptr , yyscan_t yyscanner)
{
	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	(void)yyg;
	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

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

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

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

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

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

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

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

    return token;
}

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

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

    return token;
}

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

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

    return token;
}

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

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

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

    return UINTCONSTANT;
}

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

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

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

    return(FLOATCONSTANT);
}

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

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

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

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

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

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

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

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

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

    return 0;
}

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

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

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

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

    return 0;
}

