#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 6
#define YY_FLEX_SUBMINOR_VERSION 0
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

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

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

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

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

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

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

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

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

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

#ifdef __cplusplus

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

#else	/* ! __cplusplus */

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

#define YY_USE_CONST

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

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

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

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

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

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

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

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

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

/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE yyrestart(yyin ,yyscanner )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
 * Ditto for the __ia64__ case accordingly.
 */
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#endif

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

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

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

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2

    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
     *       access to the local variable yy_act. Since yyless() is a macro, it would break
     *       existing scanners that call yyless() from OUTSIDE yylex. 
     *       One obvious solution it to make yy_act a global. I tried that, and saw
     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
     *       normally declared as a register variable-- so it is not worth it.
     */
    #define  YY_LESS_LINENO(n) \
            do { \
                int yyl;\
                for ( yyl = n; yyl < yyleng; ++yyl )\
                    if ( yytext[yyl] == '\n' )\
                        --yylineno;\
            }while(0)
    #define YY_LINENO_REWIND_TO(dst) \
            do {\
                const char *p;\
                for ( p = yy_cp-1; p >= (dst); --p)\
                    if ( *p == '\n' )\
                        --yylineno;\
            }while(0)
    
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		*yy_cp = yyg->yy_hold_char; \
		YY_RESTORE_YY_MORE_OFFSET \
		yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
		} \
	while ( 0 )

#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
	{
	FILE *yy_input_file;

	char *yy_ch_buf;		/* input buffer */
	char *yy_buf_pos;		/* current position in input buffer */

	/* Size of input buffer in bytes, not including room for EOB
	 * characters.
	 */
	yy_size_t yy_buf_size;

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

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

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

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

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

	int yy_buffer_status;

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

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

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

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

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

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

#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

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

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

#define yy_new_buffer yy_create_buffer

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

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

#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

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

typedef unsigned char YY_CHAR;

typedef int yy_state_type;

#define yytext_ptr yytext_r

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      827,  827,  827,  827,  827
    } ;

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

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

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

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

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

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

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

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

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

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

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

      827,  827,  827,  827,  827
    } ;

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

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

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

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

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

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

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

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

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

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

#define YY_EXTRA_TYPE TParseContext*

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

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

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

    int yylineno_r;
    int yy_flex_debug_r;

    char *yytext_r;
    int yy_more_flag;
    int yy_more_len;

    YYSTYPE * yylval_r;

    YYLTYPE * yylloc_r;

    }; /* end struct yyguts_t */

static int yy_init_globals (yyscan_t yyscanner );

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

int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);

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

int yylex_destroy (yyscan_t yyscanner );

int yyget_debug (yyscan_t yyscanner );

void yyset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner );

void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *yyget_in (yyscan_t yyscanner );

void yyset_in  (FILE * _in_str ,yyscan_t yyscanner );

FILE *yyget_out (yyscan_t yyscanner );

void yyset_out  (FILE * _out_str ,yyscan_t yyscanner );

yy_size_t yyget_leng (yyscan_t yyscanner );

char *yyget_text (yyscan_t yyscanner );

int yyget_lineno (yyscan_t yyscanner );

void yyset_lineno (int _line_number ,yyscan_t yyscanner );

int yyget_column  (yyscan_t yyscanner );

void yyset_column (int _column_no ,yyscan_t yyscanner );

YYSTYPE * yyget_lval (yyscan_t yyscanner );

void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );

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

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

#ifndef YY_NO_UNPUT
    
#endif

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

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

#ifndef YY_NO_INPUT

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

#endif

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

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

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

#endif

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

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

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

/* end tables serialization structures and prototypes */

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

extern int yylex \
               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);

#define YY_DECL int yylex \
               (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
#endif /* !YY_DECL */

/* Code executed at the beginning of each rule, after yytext and yyleng
 * have been set up.
 */
#ifndef YY_USER_ACTION
#define YY_USER_ACTION
#endif

/* Code executed at the end of each rule. */
#ifndef YY_BREAK
#define YY_BREAK /*LINTED*/break;
#endif

#define YY_RULE_SETUP \
	YY_USER_ACTION

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

    yylval = yylval_param;

    yylloc = yylloc_param;

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

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

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

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

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

		yy_load_buffer_state(yyscanner );
		}

	{

    TParseContext* context = yyextra;

    /* Single-line comments */

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

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

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

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

yy_find_action:
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

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

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

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

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

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

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

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

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

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

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

			yy_current_state = yy_get_previous_state( yyscanner );

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

			yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);

			yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;

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

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

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

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

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

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

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

				yy_current_state = yy_get_previous_state( yyscanner );

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

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

				yy_current_state = yy_get_previous_state( yyscanner );

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

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

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

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

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

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

	/* Try to read more data. */

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

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

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

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

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

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

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

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

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

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

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

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

			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
						number_to_move - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

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

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

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

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

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

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

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

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

	return ret_val;
}

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

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

	yy_current_state = yyg->yy_start;

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

	return yy_current_state;
}

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

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

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

#ifndef YY_NO_UNPUT

#endif

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

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

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

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

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

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

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

					/*FALLTHROUGH*/

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

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

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

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

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

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

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

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

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

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

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

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

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	yy_load_buffer_state(yyscanner );

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

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

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

	b->yy_buf_size = (yy_size_t)size;

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

	b->yy_is_our_buffer = 1;

	yy_init_buffer(b,file ,yyscanner);

	return b;
}

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

	if ( ! b )
		return;

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

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

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

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

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

	yy_flush_buffer(b ,yyscanner);

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

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

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

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

	b->yy_n_chars = 0;

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

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

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

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

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

	yyensure_buffer_stack(yyscanner);

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

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

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

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

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

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

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

	if (!yyg->yy_buffer_stack) {

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

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

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

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

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

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

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

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

	yy_switch_to_buffer(b ,yyscanner );

	return b;
}

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

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

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

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

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

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

	return b;
}

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

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

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

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

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

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

	BEGIN(_new_state);
}

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

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

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

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

/** Set the current line number.
 * @param _line_number line number
 * @param yyscanner The scanner object.
 */
void yyset_lineno (int  _line_number , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        /* lineno is only valid if an input buffer exists. */
        if (! YY_CURRENT_BUFFER )
           YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
    
    yylineno = _line_number;
}

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

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

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

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

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

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

/* Accessor methods for yylval and yylloc */

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

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

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

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

int yylex_init(yyscan_t* ptr_yy_globals)

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

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

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

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

    return yy_init_globals ( *ptr_yy_globals );
}

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

int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )

{
    struct yyguts_t dummy_yyguts;

    yyset_extra (yy_user_defined, &dummy_yyguts);

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

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

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

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

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

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

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

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

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

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

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

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

/*
 * Internal utility routines.
 */

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

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

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

	return n;
}
#endif

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

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

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

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

#define YYTABLES_NAME "yytables"

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

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

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

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

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

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

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

    return token;
}

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

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

    return token;
}

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

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

    return token;
}

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

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

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

    return UINTCONSTANT;
}

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

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

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

    return(FLOATCONSTANT);
}

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

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

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

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

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

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

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

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

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

    return 0;
}

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

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

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

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

    return 0;
}

