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

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

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



#line 25 "./glslang_lex.cpp"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 35
#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

#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)
    
/* 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_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif

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

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

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

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

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

	int yy_buffer_status;

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

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

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

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

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

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

#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

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

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

#define yy_new_buffer yy_create_buffer

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

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

#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

#define yywrap(n) 1
#define YY_SKIP_YYWRAP

typedef unsigned char YY_CHAR;

typedef int yy_state_type;

#define yytext_ptr yytext_r

static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
static int yy_get_next_buffer (yyscan_t yyscanner );
static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      827,  827,  827,  827,  827
    } ;

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

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

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

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

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

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

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

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

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

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

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

      827,  827,  827,  827,  827
    } ;

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

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
/*
//
// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

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

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

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

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

#define YY_USER_ACTION yylval->lex.line = yylineno;
#define YY_INPUT(buf, result, max_size) \
    result = string_input(buf, max_size, yyscanner);

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

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

#define YY_EXTRA_TYPE TParseContext*

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

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

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

    int yylineno_r;
    int yy_flex_debug_r;

    char *yytext_r;
    int yy_more_flag;
    int yy_more_len;

    YYSTYPE * yylval_r;

    YYLTYPE * yylloc_r;

    }; /* end struct yyguts_t */

static int yy_init_globals (yyscan_t yyscanner );

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

int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);

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

int yylex_destroy (yyscan_t yyscanner );

int yyget_debug (yyscan_t yyscanner );

void yyset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner );

void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *yyget_in (yyscan_t yyscanner );

void yyset_in  (FILE * in_str ,yyscan_t yyscanner );

FILE *yyget_out (yyscan_t yyscanner );

void yyset_out  (FILE * out_str ,yyscan_t yyscanner );

int yyget_leng (yyscan_t yyscanner );

char *yyget_text (yyscan_t yyscanner );

int yyget_lineno (yyscan_t yyscanner );

void yyset_lineno (int line_number ,yyscan_t yyscanner );

YYSTYPE * yyget_lval (yyscan_t yyscanner );

void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );

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

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

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

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

#ifndef YY_NO_INPUT

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

#endif

    static void yy_push_state (int new_state ,yyscan_t yyscanner);
    
    static void yy_pop_state (yyscan_t yyscanner );
    
    static int yy_top_state (yyscan_t yyscanner );
    
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#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 break;
#endif

#define YY_RULE_SETUP \
	YY_USER_ACTION

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

    TParseContext* context = yyextra;

    /* Single-line comments */

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

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

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

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

		yy_current_state = yyg->yy_start;
yy_match:
		do
			{
			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
			if ( yy_accept[yy_current_state] )
				{
				yyg->yy_last_accepting_state = yy_current_state;
				yyg->yy_last_accepting_cpos = yy_cp;
				}
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 828 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 827 );
		yy_cp = yyg->yy_last_accepting_cpos;
		yy_current_state = yyg->yy_last_accepting_state;

yy_find_action:
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

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

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

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

case 1:
YY_RULE_SETUP
;
	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->shaderVersion < 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->shaderVersion >= 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 yylex */

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

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

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

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

	/* Try to read more data. */

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

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

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

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

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

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

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

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

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

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					yyrealloc((void *) b->yy_ch_buf,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, (size_t) num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

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

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

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

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

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

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

	return ret_val;
}

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

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

	yy_current_state = yyg->yy_start;

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

	return yy_current_state;
}

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

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

	return yy_is_jam ? 0 : yy_current_state;
}

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

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

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

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

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

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

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

					/*FALLTHROUGH*/

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

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

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

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

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

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

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

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

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

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

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

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

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	yy_load_buffer_state(yyscanner );

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

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

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

	b->yy_buf_size = size;

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

	b->yy_is_our_buffer = 1;

	yy_init_buffer(b,file ,yyscanner);

	return b;
}

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

	if ( ! b )
		return;

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

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

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

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

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

	yy_flush_buffer(b ,yyscanner);

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

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

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

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

	b->yy_n_chars = 0;

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

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

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

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

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

	yyensure_buffer_stack(yyscanner);

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

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

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

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

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

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

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

	if (!yyg->yy_buffer_stack) {

		/* First allocation is just for 2 elements, since we don't know if this
		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
		 * immediate realloc on the next call.
         */
		num_to_alloc = 1;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								, yyscanner);
		if ( ! yyg->yy_buffer_stack )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
								  
		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
				
		yyg->yy_buffer_stack_max = num_to_alloc;
		yyg->yy_buffer_stack_top = 0;
		return;
	}

	if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){

		/* Increase the buffer to prepare for a possible push. */
		int grow_size = 8 /* arbitrary grow size */;

		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
								(yyg->yy_buffer_stack,
								num_to_alloc * sizeof(struct yy_buffer_state*)
								, yyscanner);
		if ( ! yyg->yy_buffer_stack )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		/* zero only the new slots.*/
		memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
		yyg->yy_buffer_stack_max = num_to_alloc;
	}
}

/** Setup the input buffer state to scan directly from a user-specified character buffer.
 * @param base the character buffer
 * @param size the size in bytes of the character buffer
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object. 
 */
YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	if ( size < 2 ||
	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
	     base[size-1] != YY_END_OF_BUFFER_CHAR )
		/* They forgot to leave room for the EOB's. */
		return 0;

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

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

	yy_switch_to_buffer(b ,yyscanner );

	return b;
}

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

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

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

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

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

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

	return b;
}

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

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

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

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

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

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

	BEGIN(new_state);
}

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

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

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

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

/** Set the current line number.
 * @param line_number
 * @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" , yyscanner); 
    
    yylineno = line_number;
}

/** Set the current column.
 * @param line_number
 * @param yyscanner The scanner object.
 */
void yyset_column (int  column_no , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        /* column is only valid if an input buffer exists. */
        if (! YY_CURRENT_BUFFER )
           yy_fatal_error( "yyset_column called with no buffer" , yyscanner); 
    
    yycolumn = column_no;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param in_str A readable stream.
 * @param yyscanner The scanner object.
 * @see yy_switch_to_buffer
 */
void yyset_in (FILE *  in_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyin = in_str ;
}

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

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

void yyset_debug (int  bdebug , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yy_flex_debug = bdebug ;
}

/* Accessor methods for yylval and yylloc */

YYSTYPE * yyget_lval  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yylval;
}

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

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

/* yylex_init is special because it creates the scanner itself, so it is
 * the ONLY reentrant function that doesn't take the scanner as the last argument.
 * That's why we explicitly handle the declaration, instead of using our macros.
 */

int yylex_init(yyscan_t* ptr_yy_globals)

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

    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );

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

    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));

    return yy_init_globals ( *ptr_yy_globals );
}

/* yylex_init_extra has the same functionality as yylex_init, but follows the
 * convention of taking the scanner as the last argument. Note however, that
 * this is a *pointer* to a scanner, as it will be allocated by this call (and
 * is the reason, too, why this function also must handle its own declaration).
 * The user defined value in the first argument will be available to yyalloc in
 * the yyextra field.
 */

int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )

{
    struct yyguts_t dummy_yyguts;

    yyset_extra (yy_user_defined, &dummy_yyguts);

    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }
	
    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
	
    if (*ptr_yy_globals == NULL){
        errno = ENOMEM;
        return 1;
    }
    
    /* By setting to 0xAA, we expose bugs in
    yy_init_globals. Leave at 0x00 for releases. */
    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
    
    yyset_extra (yy_user_defined, *ptr_yy_globals);
    
    return yy_init_globals ( *ptr_yy_globals );
}

static int yy_init_globals (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from yylex_destroy(), so don't allocate here.
     */

    yyg->yy_buffer_stack = 0;
    yyg->yy_buffer_stack_top = 0;
    yyg->yy_buffer_stack_max = 0;
    yyg->yy_c_buf_p = (char *) 0;
    yyg->yy_init = 0;
    yyg->yy_start = 0;

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

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

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

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

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

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

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

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

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

/*
 * Internal utility routines.
 */

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

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

	return n;
}
#endif

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

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

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

#define YYTABLES_NAME "yytables"

yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
    pp::Token token;
    yyget_extra(yyscanner)->preprocessor.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_lineno(EncodeSourceLoc(token.location.file, 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->shaderVersion);
    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->scanner;

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

    return token;
}

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

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

    return token;
}

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

    // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
    if (context->shaderVersion < 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->scanner;
    yyscan_t yyscanner = (yyscan_t) context->scanner;

    if (context->shaderVersion < 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->scanner;

    if (context->shaderVersion < 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, const char* reason) {
    struct yyguts_t* yyg = (struct yyguts_t*) context->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->scanner = scanner;
    return 0;
}

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

    return 0;
}

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

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

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

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

    return 0;
}

