#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!

/* clang-format off */

// 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: 4005)
#pragma warning(disable: 4065)
#pragma warning(disable: 4189)
#pragma warning(disable: 4244)
#pragma warning(disable: 4505)
#pragma warning(disable: 4701)
#pragma warning(disable: 4702)
#endif



#line 30 "./glslang_lex.cpp"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 39
#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;
typedef uint64_t flex_uint64_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
#define YY_BUF_SIZE 16384
#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

#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 { \
                yy_size_t yyl;\
                for ( yyl = n; yyl < static_cast<yy_site_t>(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) 1
#define YY_SKIP_YYWRAP

typedef unsigned char YY_CHAR;

typedef int yy_state_type;

#define yytext_ptr yytext_r

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

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

#define YY_NUM_RULES 246
#define YY_END_OF_BUFFER 247
/* 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[886] =
    {   0,
        0,    0,    0,    0,  247,  245,  244,  244,  228,  234,
      239,  223,  224,  232,  231,  220,  229,  227,  233,  186,
      186,  221,  217,  235,  222,  236,  240,  183,  225,  226,
      238,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  218,  237,  219,  230,  243,  242,  246,
      241,  214,  200,  219,  208,  203,  198,  206,  196,  207,
      197,  192,  199,  191,  185,  186,    0,  189,    0,  226,
      218,  225,  215,  211,  213,  212,  216,  183,  204,  210,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,

      183,  183,  183,   12,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,   15,  183,  183,
       23,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  205,  209,  241,    0,
      195,  191,    0,  194,  188,    0,  190,  184,  201,  202,
      183,  183,  143,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,   13,  183,  183,  183,

      183,  183,  183,  183,  183,  183,  183,   28,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
       24,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,    0,  192,    0,
      191,  193,  187,  183,  183,  183,  183,   31,  183,  183,
       18,  180,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,   16,  146,  183,  183,  183,  183,   21,  183,
      183,  150,  161,  183,  183,  183,  183,  183,  183,  183,

      183,  183,  183,  183,  183,  183,  158,    4,   36,   37,
       38,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  149,   32,  183,  183,
       29,  183,  183,  183,  183,  183,  183,  183,   48,   49,
       50,   30,  183,  183,  183,  183,  183,  183,  183,  183,
       10,   54,   55,   56,  183,  144,  183,  183,    7,  183,
      183,  183,  183,  170,  171,  172,  183,   33,  183,  162,
       27,  173,  174,  175,    2,  167,  168,  169,  183,  183,
      183,   25,  165,  183,  183,  183,  183,  183,   51,   52,

       53,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  108,  183,  183,  183,  183,  183,  183,  183,
      183,  159,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  145,  183,  183,  182,   57,   58,   59,
      183,  183,   14,  183,  183,  183,  113,  183,  183,  183,
      183,  111,  183,  183,  183,  160,  155,  114,  183,  183,
      183,  183,  183,  183,  151,  183,  183,  183,  183,  183,
       83,   39,   42,   44,   43,   40,   46,   45,   47,   41,
      183,  183,  183,  183,  166,  142,  183,  183,  153,  183,
      183,  183,   35,  109,   26,  179,   22,  154,   82,  183,

      164,   17,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,   19,   34,
      183,  183,  183,  183,  183,  183,  115,   88,   94,  183,
      183,  183,  183,  183,   85,   87,    3,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  147,  183,
      183,  183,  183,  183,    8,  183,  183,    9,  183,  183,
      183,  183,  183,  183,   20,  102,   11,  156,  116,   89,
       96,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  152,  183,  183,  183,  100,  105,
      103,  183,  183,  183,  183,  183,  183,  183,  148,  117,

       90,   95,  183,  183,  163,  183,  104,  183,  183,  183,
      183,    6,  183,  183,  183,  183,  183,  183,  183,  183,
      183,   99,  157,    1,  183,  183,  183,  183,  183,  183,
      181,  183,  112,    5,  176,   60,   63,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      101,  183,  183,  183,  183,  183,  183,   97,  183,  183,
      183,  183,  183,  130,   68,   69,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      110,  183,  183,  183,   98,  132,   73,   74,  183,  183,
      183,  183,  106,  183,  183,  183,  183,  183,  183,  183,

      125,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,   67,  183,  183,  183,  183,   61,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  126,  118,  183,   91,  183,  183,  183,   72,
      183,  183,   70,  183,  183,  183,  183,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  183,  127,  183,  183,
       77,  183,  183,   75,  183,  183,  119,   92,  183,  121,
      183,  122,  183,  183,  183,  183,  183,  183,  107,  183,
      183,  183,  183,   65,  183,   64,  136,  183,  183,  120,
       93,  183,  183,  183,  183,  183,  183,  183,  183,  183,

      183,  183,  183,  134,  137,  183,  128,  183,   66,  183,
      183,  183,  183,  183,  183,  183,  183,  135,  138,  183,
      183,  183,  183,  131,   71,  183,  183,  183,  177,  183,
      183,  183,   78,  183,  183,  133,   76,  183,  183,  183,
      183,  183,  183,  183,  183,  183,  139,  183,  183,  183,
      183,  183,  183,  183,  183,  140,  183,  183,  183,  183,
       79,  183,  141,   84,  183,  123,  124,   86,  183,  183,
      183,   62,  183,  183,  183,  178,  183,  129,   80,  183,
      183,  183,  183,   81,    0
    } ;

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

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

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

static yyconst flex_int32_t yy_meta[78] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
        1,    2,    3,    1,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    1,    1,    1,    1,    1,    1,
        5,    5,    5,    5,    6,    7,    8,    8,    8,    8,
        8,    8,    9,    8,    8,    1,    1,    1,    8,    5,
        5,    5,    5,    6,    7,    8,    8,    8,    8,    8,
        8,    8,    8,    8,    8,    8,    8,    9,    8,    8,
        8,    8,    8,    1,    1,    1,    1
    } ;

static yyconst flex_int16_t yy_base[895] =
    {   0,
        0,    0,   77,    0, 1089, 1090, 1090, 1090, 1060,  127,
      151, 1090, 1090, 1059,  148, 1090,  147,  145, 1058,  167,
      158, 1056, 1090,  167, 1056,  145, 1090,    0, 1090, 1090,
      149, 1034,  147,  135,  155,  162,  146,  174, 1019,  172,
      178,  179,  153,  196, 1013,  198, 1026,  200,  197,  213,
      202,  113, 1011, 1090,  153, 1090, 1090, 1090, 1090, 1090,
        0, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090,
     1090,  237, 1090,  241,  237,  271,  243, 1090,    0, 1090,
     1090, 1090, 1050, 1090, 1090, 1090, 1049,    0, 1090, 1090,
     1010, 1008, 1013,  156, 1010, 1018, 1017, 1004, 1007, 1018,

      226, 1012, 1000,  997, 1010,  997,  994,  994, 1000,  189,
      235,  994, 1004,  990,  996,  999, 1000,    0,  992, 1002,
      230, 1001,  982,  995,  976,  216,  980,  993,  984,  243,
      977,  237,  989,  991,  250,  980,  259,  967,  976,  253,
      259,  980,  976,  978,  967,  970,  250,  255,  269,  979,
      967,  979,  266,  972,  971,  959, 1090, 1090,    0,  318,
     1090,  296,  323, 1090, 1090,  325,  324,  286, 1090, 1090,
      977,  968,    0,  964,  959,  963,  972,  969,  298,  953,
      953,  964,  956,  271,  966,  963,  963,  961,  958,  950,
      956,  943,  941,  953,  939,  955,    0,  952,  940,  947,

      944,  948,  949,  942,  939,  928,  927,  940,  943,  931,
      942,  938,  926,  932,  923,  338,  928,  931,  922,  929,
      918,  922,  913,  927,  926,  917,  923,  295,  907,  910,
      908,  907,  917,  907,  902,  900,  902,  912,  898,  900,
      897,  908,  907,  910,  892,  298,  900,  896,  894,  903,
      882,  349,  900,  902,  891,  883,  916,  354,  370,  368,
      383, 1090, 1090,  887,  878,  888,  887,    0,  885,  379,
        0,    0,  878,  876,  876,  877,  872,  880,  869,  886,
      875,  382,    0,    0,  869,  879,  878,  878,    0,  863,
      385,    0,    0,  865,  390,  872,  873,  864,  858,  857,

      858,  857,  857,  342,  393,  852,    0,    0,  848,  847,
      846,  848,  849,  854,  848,  844,  857,  852,  852,  850,
      849,  843,  837,  839,  838,  842,  847,  833,  836,  831,
      839,  844,  832,  829,  841,  832,    0,    0,  838,  834,
        0,  826,  826,  831,  822,  829,  396,  826,    0,    0,
        0,    0,  816,  828,  827,  814,  815,  824,  825,  825,
        0,    0,    0,    0,  812,    0,  820,  811,    0,  810,
      811,  805,  815,    0,    0,    0,  806,    0,  802,    0,
        0,    0,    0,    0,    0,    0,    0,    0,  812,  400,
      811,    0,    0,  809,  805,  802,  846,  845,    0,    0,

        0,  792,  403,  409,  412,  797,  793,  798,  789,  787,
      800,  785,    0,  785,  798,  787,  783,  789,  784,  791,
      791,    0,  788,  785,  789,  773,  771,  774,  780,  786,
      781,  780,  768,    0,  770,  771,    0,    0,    0,    0,
      768,  771,    0,  765,  775,  766,    0,  776,  756,  765,
      760,    0,  753,  753,  766,    0,  768,    0,  418,  783,
      782,  781,  746,  745,    0,  762,  761,  756,  793,  784,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
      743,  756,  743,  740,    0,    0,  745,  744,    0,  741,
      748,  747,    0,  733,    0,    0,    0,    0,    0,  730,

        0,    0,  729,  740,  423,  733,  739,  738,  735,  730,
      727,  747,  733,  718,  718,  731,  716,  728,    0,    0,
      721,  746,  745,  744,  709,  708,  233,  406,    0,  720,
      723,  721,  710,  706,  721,    0,    0,  717,  714,  713,
      703,  702,  692,  709,  695,  426,  703,  706,    0,  725,
      724,  723,  688,  687,    0,  701,  688,    0,  698,  691,
      683,  684,  690,  693,    0,    0,    0,    0,  715,  714,
        0,  689,  692,  677,  684,  675,  682,  683,  683,  682,
      668,  436,  679,  679,    0,  680,  669,  668,    0,    0,
        0,  695,  694,  693,  658,  657,  653,  661,    0,  691,

      690,    0,  665,  668,    0,  446,    0,  646,  667,  681,
      653,    0,  649,  648,  657,  657,  645,  659,  643,  657,
      652,    0,    0,    0,  671,  670,  669,  634,  633,  632,
        0,  632,    0,    0,  426,  434,  658,  642,  645,  628,
      640,  628,  627,  636,  636,  655,  654,  653,  618,  617,
        0,  622,  612,  615,  616,  615,  625,    0,  628,  624,
      626,  622,  609,  642,  442,    0,  617,  620,  610,  611,
      603,  610,  601,  624,  610,  606,  608,  606,  606,  605,
        0,  593,  592,  602,    0,  624,  445,    0,  599,  602,
      599,  584,    0,  600,  599,  583,  575,  583,  573,  581,

        0,  578,  577,  600,  586,  584,  584,  577,  567,  570,
      584,  568,  601,  579,  580,  577,  574,  586,  561,  575,
      574,  558,  557,  556,  579,  565,  563,  563,  566,  561,
      542,  541,    0,  571,  541,  569,  539,  543,  542,  575,
      553,  550,    0,  554,  548,  551,  547,  549,  532,  527,
      534,  516,  514,  507,  501,  489,  124,    0,  162,  250,
      289,  307,  327,    0,  329,  340,    0,    0,  366,    0,
      367,    0,  395,  396,  383,  382,  395,  401,    0,  398,
      408,  405,  416,  443,  423,    0,    0,  437,  438,    0,
        0,  439,  440,  426,  425,  428,  441,  433,  446,  447,

      426,  427,  435,    0,    0,  451,  461,  433,  463,  455,
      449,  437,  455,  449,  438,  439,  447,    0,    0,  478,
      464,  462,  463,    0,    0,  467,  456,  462,    0,  463,
      449,  472,    0,  460,  485,    0,    0,  475,  482,  467,
      465,  466,  458,  475,  482,  483,    0,  481,  465,  501,
      465,  496,  522,  470,  471,    0,  488,  490,  491,  482,
        0,  505,    0,    0,  513,    0,    0,    0,  485,  486,
      480,    0,  506,  482,  483,    0,  537,    0,    0,  510,
      521,  513,  516,    0, 1090,  556,  562,  568,  574,  578,
      584,  585,  591,  594

    } ;

static yyconst flex_int16_t yy_def[895] =
    {   0,
      885,    1,  885,    3,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      886,  885,  885,  885,  885,  885,  885,  887,  885,  885,
      885,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  885,  885,  885,  885,  885,  885,  885,
      888,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  889,  885,  890,   20,  886,  891,  885,  892,  885,
      885,  885,  885,  885,  885,  885,  885,  887,  885,  885,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  885,  885,  888,  893,
      885,  890,  894,  885,  885,  885,  891,  892,  885,  885,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  885,  893,  885,
      894,  885,  885,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,

      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
      887,  887,  887,  887,    0,  885,  885,  885,  885,  885,
      885,  885,  885,  885

    } ;

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

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

       78,   77,  127,   97,   98,  106,  128,  107,   99,   78,
       79,   77,   93,   94,  100,  102,  108,  101,  174,  103,
       77,  115,  175,  109,  104,   78,  792,  158,  125,  116,
      105,  110,  118,  111,   78,  119,  112,   79,  120,  121,
      117,  126,  113,  122,  123,  129,  124,  132,  193,  136,
      143,  151,  166,  144,  166,  152,  137,  138,  130,  194,
      139,  145,  133,  574,  153,  134,  140,  141,  146,  142,
      147,  160,  161,  575,  148,  163,  164,  214,  149,  165,
      885,  150,  182,   74,  195,  215,  183,  184,  222,  205,
      160,  161,  206,  207,  163,  164,  208,  196,  209,  227,

      219,  223,  235,  224,  165,   77,  220,  885,  231,  237,
      244,  245,  246,   78,  793,  228,  229,  236,  248,  794,
      247,  232,  238,  253,   77,  254,  249,  258,  263,  258,
      163,  164,  260,  885,  260,  885,  277,  278,   78,  167,
      167,  167,  167,  167,  167,  167,  167,  167,  167,  163,
      164,  271,  342,  263,  309,  310,  311,  323,  795,  262,
      343,  324,  397,  398,  272,  349,  350,  351,  259,  259,
      259,  259,  259,  259,  259,  259,  259,  259,  262,  885,
      796,  885,  261,  261,  261,  261,  261,  261,  261,  261,
      261,  261,  885,  797,  885,  362,  363,  364,  374,  375,

      376,  382,  383,  384,  798,  161,  386,  387,  388,  399,
      400,  401,  438,  439,  440,  460,  461,  462,  164,  472,
      473,  474,  799,  800,  161,  475,  476,  477,  478,  479,
      480,  463,  464,  522,  523,  524,  576,  164,  550,  551,
      552,  592,  593,  594,  801,  802,  577,  803,  804,  525,
      526,  625,  626,  627,  553,  554,  671,  595,  596,  805,
      597,  646,  647,  648,  673,  806,  672,  628,  629,  807,
      808,  674,  703,  675,  676,  724,  809,  649,  650,  704,
      810,  705,  725,  811,  726,  812,  813,  814,  815,  816,
      817,  818,  819,  820,  821,  822,  823,  824,  825,  826,

      827,  828,  829,  830,  831,  832,  833,  834,  835,  836,
      837,  838,  839,  840,  841,  842,  843,  844,  845,  846,
      847,  848,  849,  850,  851,  852,  853,  854,  855,  856,
      857,  858,  859,  860,  861,  862,  863,  864,  865,  866,
      867,  868,  869,  870,  871,  872,  873,  874,  875,  876,
      877,  878,  879,  880,  881,  882,  883,  884,   76,   76,
      790,   76,  789,  788,   76,   88,   88,   88,   88,   88,
       88,  159,  159,  159,  159,  159,  159,   72,  787,   72,
       72,  162,  786,  162,  162,  167,  785,  167,  168,  168,
      168,  168,  259,  784,  259,  261,  783,  261,  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,  723,  722,  721,  720,  719,  718,
      717,  716,  715,  714,  713,  712,  711,  710,  709,  708,
      707,  706,  702,  701,  700,  699,  698,  697,  696,  695,
      694,  693,  692,  691,  690,  689,  688,  687,  686,  685,
      684,  683,  682,  681,  680,  679,  678,  677,  670,  669,

      668,  667,  666,  665,  664,  663,  662,  661,  660,  659,
      658,  657,  656,  655,  654,  653,  652,  651,  645,  644,
      643,  642,  641,  640,  639,  638,  637,  636,  635,  634,
      633,  632,  631,  630,  624,  623,  622,  621,  620,  619,
      618,  617,  616,  615,  614,  613,  612,  611,  610,  609,
      608,  607,  606,  605,  604,  603,  602,  601,  600,  599,
      598,  591,  590,  589,  588,  587,  586,  585,  584,  583,
      582,  581,  580,  579,  578,  573,  572,  571,  570,  569,
      568,  567,  566,  565,  564,  563,  562,  561,  560,  559,
      558,  557,  556,  555,  549,  548,  547,  546,  545,  544,

      543,  542,  541,  540,  539,  538,  537,  536,  535,  534,
      533,  532,  531,  530,  529,  528,  527,  521,  520,  519,
      518,  517,  516,  515,  514,  513,  512,  511,  510,  509,
      508,  507,  506,  505,  504,  503,  502,  501,  500,  499,
      498,  497,  496,  495,  494,  493,  492,  491,  490,  489,
      488,  487,  486,  485,  484,  483,  482,  481,  471,  470,
      469,  468,  467,  466,  465,  459,  458,  457,  456,  455,
      454,  453,  452,  451,  450,  449,  448,  447,  446,  445,
      444,  443,  442,  441,  437,  436,  435,  434,  433,  432,
      431,  430,  429,  428,  427,  426,  425,  424,  423,  422,

      421,  420,  419,  418,  417,  416,  415,  414,  413,  412,
      411,  410,  409,  408,  407,  406,  405,  404,  403,  402,
      396,  395,  394,  393,  392,  391,  390,  389,  385,  381,
      380,  379,  378,  377,  373,  372,  371,  370,  369,  368,
      367,  366,  365,  361,  360,  359,  358,  357,  356,  355,
      354,  353,  352,  348,  347,  346,  345,  344,  341,  340,
      339,  338,  337,  336,  335,  334,  333,  332,  331,  330,
      329,  328,  327,  326,  325,  322,  321,  320,  319,  318,
      317,  316,  315,  314,  313,  312,  308,  307,  306,  305,
      304,  303,  302,  301,  300,  299,  298,  297,  296,  295,

      294,  293,  292,  291,  290,  289,  288,  287,  286,  285,
      284,  283,  282,  281,  280,  279,  276,  275,  274,  273,
      270,  269,  268,  267,  266,  265,  264,  257,  256,  255,
      252,  251,  250,  243,  242,  241,  240,  239,  234,  233,
      230,  226,  225,  221,  218,  217,  216,  213,  212,  211,
      210,  204,  203,  202,  201,  200,  199,  198,  197,  192,
      191,  190,  189,  188,  187,  186,  185,  181,  180,  179,
      178,  177,  176,  173,  172,  171,  170,  169,  156,  135,
      131,  114,   91,   85,   80,   73,   67,   62,  885,    5,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,

      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885
    } ;

static yyconst flex_int16_t yy_chk[1168] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,

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

       21,   20,   43,   34,   35,   37,   43,   37,   35,   20,
       20,   21,   33,   33,   35,   36,   37,   35,   94,   36,
       20,   40,   94,   38,   36,   21,  759,   55,   42,   40,
       36,   38,   41,   38,   20,   41,   38,   20,   41,   41,
       40,   42,   38,   41,   41,   44,   41,   46,  110,   48,
       49,   51,   77,   49,   77,   51,   48,   48,   44,  110,
       48,   49,   46,  527,   51,   46,   48,   48,   49,   48,
       50,   72,   72,  527,   50,   74,   74,  126,   50,   75,
       75,   50,  101,   76,  111,  126,  101,  101,  132,  121,
       72,   72,  121,  121,   74,   74,  121,  111,  121,  135,

      130,  132,  140,  132,   75,   76,  130,   75,  137,  141,
      147,  147,  148,   76,  760,  135,  135,  140,  149,  761,
      148,  137,  141,  153,   76,  153,  149,  160,  168,  160,
      162,  162,  163,  167,  163,  167,  184,  184,   76,  166,
      166,  166,  166,  166,  166,  166,  166,  166,  166,  162,
      162,  179,  246,  168,  216,  216,  216,  228,  762,  167,
      246,  228,  304,  304,  179,  252,  252,  252,  258,  258,
      258,  258,  258,  258,  258,  258,  258,  258,  167,  259,
      763,  259,  260,  260,  260,  260,  260,  260,  260,  260,
      260,  260,  261,  765,  261,  270,  270,  270,  282,  282,

      282,  291,  291,  291,  766,  259,  295,  295,  295,  305,
      305,  305,  347,  347,  347,  390,  390,  390,  261,  403,
      403,  403,  769,  771,  259,  404,  404,  404,  405,  405,
      405,  390,  390,  459,  459,  459,  528,  261,  505,  505,
      505,  546,  546,  546,  773,  774,  528,  775,  776,  459,
      459,  582,  582,  582,  505,  505,  635,  546,  546,  777,
      546,  606,  606,  606,  636,  778,  635,  582,  582,  780,
      781,  636,  665,  636,  636,  687,  782,  606,  606,  665,
      783,  665,  687,  784,  687,  785,  788,  789,  792,  793,
      794,  795,  796,  797,  798,  799,  800,  801,  802,  803,

      806,  807,  808,  809,  810,  811,  812,  813,  814,  815,
      816,  817,  820,  821,  822,  823,  826,  827,  828,  830,
      831,  832,  834,  835,  838,  839,  840,  841,  842,  843,
      844,  845,  846,  848,  849,  850,  851,  852,  853,  854,
      855,  857,  858,  859,  860,  862,  865,  869,  870,  871,
      873,  874,  875,  877,  880,  881,  882,  883,  886,  886,
      756,  886,  755,  754,  886,  887,  887,  887,  887,  887,
      887,  888,  888,  888,  888,  888,  888,  889,  753,  889,
      889,  890,  752,  890,  890,  891,  751,  891,  892,  892,
      892,  892,  893,  750,  893,  894,  749,  894,  748,  747,

      746,  745,  744,  742,  741,  740,  739,  738,  737,  736,
      735,  734,  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,  700,  699,  698,  697,  696,  695,  694,
      692,  691,  690,  689,  686,  684,  683,  682,  680,  679,
      678,  677,  676,  675,  674,  673,  672,  671,  670,  669,
      668,  667,  664,  663,  662,  661,  660,  659,  657,  656,
      655,  654,  653,  652,  650,  649,  648,  647,  646,  645,
      644,  643,  642,  641,  640,  639,  638,  637,  632,  630,

      629,  628,  627,  626,  625,  621,  620,  619,  618,  617,
      616,  615,  614,  613,  611,  610,  609,  608,  604,  603,
      601,  600,  598,  597,  596,  595,  594,  593,  592,  588,
      587,  586,  584,  583,  581,  580,  579,  578,  577,  576,
      575,  574,  573,  572,  570,  569,  564,  563,  562,  561,
      560,  559,  557,  556,  554,  553,  552,  551,  550,  548,
      547,  545,  544,  543,  542,  541,  540,  539,  538,  535,
      534,  533,  532,  531,  530,  526,  525,  524,  523,  522,
      521,  518,  517,  516,  515,  514,  513,  512,  511,  510,
      509,  508,  507,  506,  504,  503,  500,  494,  492,  491,

      490,  488,  487,  484,  483,  482,  481,  470,  469,  468,
      467,  466,  464,  463,  462,  461,  460,  457,  455,  454,
      453,  451,  450,  449,  448,  446,  445,  444,  442,  441,
      436,  435,  433,  432,  431,  430,  429,  428,  427,  426,
      425,  424,  423,  421,  420,  419,  418,  417,  416,  415,
      414,  412,  411,  410,  409,  408,  407,  406,  402,  398,
      397,  396,  395,  394,  391,  389,  379,  377,  373,  372,
      371,  370,  368,  367,  365,  360,  359,  358,  357,  356,
      355,  354,  353,  348,  346,  345,  344,  343,  342,  340,
      339,  336,  335,  334,  333,  332,  331,  330,  329,  328,

      327,  326,  325,  324,  323,  322,  321,  320,  319,  318,
      317,  316,  315,  314,  313,  312,  311,  310,  309,  306,
      303,  302,  301,  300,  299,  298,  297,  296,  294,  290,
      288,  287,  286,  285,  281,  280,  279,  278,  277,  276,
      275,  274,  273,  269,  267,  266,  265,  264,  257,  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,  229,  227,  226,  225,  224,  223,
      222,  221,  220,  219,  218,  217,  215,  214,  213,  212,
      211,  210,  209,  208,  207,  206,  205,  204,  203,  202,

      201,  200,  199,  198,  196,  195,  194,  193,  192,  191,
      190,  189,  188,  187,  186,  185,  183,  182,  181,  180,
      178,  177,  176,  175,  174,  172,  171,  156,  155,  154,
      152,  151,  150,  146,  145,  144,  143,  142,  139,  138,
      136,  134,  133,  131,  129,  128,  127,  125,  124,  123,
      122,  120,  119,  117,  116,  115,  114,  113,  112,  109,
      108,  107,  106,  105,  104,  103,  102,  100,   99,   98,
       97,   96,   95,   93,   92,   91,   87,   83,   53,   47,
       45,   39,   32,   25,   22,   19,   14,    9,    5,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,

      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885,  885,  885,  885,
      885,  885,  885,  885,  885,  885,  885
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[247] =
    {   0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    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-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 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 "compiler/translator/glslang.h"
#include "compiler/translator/ParseContext.h"
#include "compiler/preprocessor/Token.h"
#include "compiler/translator/util.h"
#include "compiler/translator/length_limits.h"

using namespace sh;

#include "glslang_tab.h"

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

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

#define YY_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_ident_ES3_keyword(TParseContext *context, int token);
static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token);
static int ES3_extension_keyword_else_ident(TParseContext *context, const char *extension, int token);
static int uint_constant(TParseContext *context);
static int int_constant(TParseContext *context);
static int float_constant(yyscan_t yyscanner);
static int floatsuffix_check(TParseContext* context);
static int yuvcscstandardext_constant(TParseContext *context);

#define INITIAL 0
#define FIELDS 1

#define YY_EXTRA_TYPE TParseContext*

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

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

    /* The rest are the same as the globals declared in the non-reentrant scanner. */
    FILE *yyin_r, *yyout_r;
    size_t yy_buffer_stack_top; /**< index of top of stack. */
    size_t yy_buffer_stack_max; /**< capacity of stack. */
    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
    char yy_hold_char;
    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 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

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif

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

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

#endif

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

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

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

/* end tables serialization structures and prototypes */

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

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

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

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

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

#define YY_RULE_SETUP \
	YY_USER_ACTION

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

    yylval = yylval_param;

    yylloc = yylloc_param;

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

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

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

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

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

		yy_load_buffer_state(yyscanner );
		}

	{

    TParseContext* context = yyextra;

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

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

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

		yy_current_state = yyg->yy_start;
yy_match:
		do
			{
			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
			if ( yy_accept[yy_current_state] )
				{
				yyg->yy_last_accepting_state = yy_current_state;
				yyg->yy_last_accepting_cpos = yy_cp;
				}
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 886 )
					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 != 885 );
		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 < static_cast<yy_size_t>(yyleng); ++yyl )
				if ( yytext[yyl] == '\n' )
					   
    do{ yylineno++;
        yycolumn=0;
    }while(0)
;
			}

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

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

case 1:
YY_RULE_SETUP
{ return INVARIANT; }
	YY_BREAK
case 2:
YY_RULE_SETUP
{ return HIGH_PRECISION; }
	YY_BREAK
case 3:
YY_RULE_SETUP
{ return MEDIUM_PRECISION; }
	YY_BREAK
case 4:
YY_RULE_SETUP
{ return LOW_PRECISION; }
	YY_BREAK
case 5:
YY_RULE_SETUP
{ return PRECISION; }
	YY_BREAK
case 6:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, ATTRIBUTE); }
	YY_BREAK
case 7:
YY_RULE_SETUP
{ return CONST_QUAL; }
	YY_BREAK
case 8:
YY_RULE_SETUP
{ return UNIFORM; }
	YY_BREAK
case 9:
YY_RULE_SETUP
{ return ES2_keyword_ES3_reserved(context, VARYING); }
	YY_BREAK
case 10:
YY_RULE_SETUP
{ return BREAK; }
	YY_BREAK
case 11:
YY_RULE_SETUP
{ return CONTINUE; }
	YY_BREAK
case 12:
YY_RULE_SETUP
{ return DO; }
	YY_BREAK
case 13:
YY_RULE_SETUP
{ return FOR; }
	YY_BREAK
case 14:
YY_RULE_SETUP
{ return WHILE; }
	YY_BREAK
case 15:
YY_RULE_SETUP
{ return IF; }
	YY_BREAK
case 16:
YY_RULE_SETUP
{ return ELSE; }
	YY_BREAK
case 17:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SWITCH); }
	YY_BREAK
case 18:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, CASE); }
	YY_BREAK
case 19:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, DEFAULT); }
	YY_BREAK
case 20:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, CENTROID); }
	YY_BREAK
case 21:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, FLAT); }
	YY_BREAK
case 22:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SMOOTH); }
	YY_BREAK
case 23:
YY_RULE_SETUP
{ return IN_QUAL; }
	YY_BREAK
case 24:
YY_RULE_SETUP
{ return OUT_QUAL; }
	YY_BREAK
case 25:
YY_RULE_SETUP
{ return INOUT_QUAL; }
	YY_BREAK
case 26:
YY_RULE_SETUP
{ return ES2_and_ES3_ident_ES3_1_keyword(context, SHARED); }
	YY_BREAK
case 27:
YY_RULE_SETUP
{ return FLOAT_TYPE; }
	YY_BREAK
case 28:
YY_RULE_SETUP
{ return INT_TYPE; }
	YY_BREAK
case 29:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UINT_TYPE); }
	YY_BREAK
case 30:
YY_RULE_SETUP
{ return VOID_TYPE; }
	YY_BREAK
case 31:
YY_RULE_SETUP
{ return BOOL_TYPE; }
	YY_BREAK
case 32:
YY_RULE_SETUP
{ yylval->lex.b = true;  return BOOLCONSTANT; }
	YY_BREAK
case 33:
YY_RULE_SETUP
{ yylval->lex.b = false; return BOOLCONSTANT; }
	YY_BREAK
case 34:
YY_RULE_SETUP
{ return DISCARD; }
	YY_BREAK
case 35:
YY_RULE_SETUP
{ return RETURN; }
	YY_BREAK
case 36:
YY_RULE_SETUP
{ return MATRIX2; }
	YY_BREAK
case 37:
YY_RULE_SETUP
{ return MATRIX3; }
	YY_BREAK
case 38:
YY_RULE_SETUP
{ return MATRIX4; }
	YY_BREAK
case 39:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX2); }
	YY_BREAK
case 40:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX3); }
	YY_BREAK
case 41:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX4); }
	YY_BREAK
case 42:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX2x3); }
	YY_BREAK
case 43:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX3x2); }
	YY_BREAK
case 44:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX2x4); }
	YY_BREAK
case 45:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX4x2); }
	YY_BREAK
case 46:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX3x4); }
	YY_BREAK
case 47:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX4x3); }
	YY_BREAK
case 48:
YY_RULE_SETUP
{ return VEC2; }
	YY_BREAK
case 49:
YY_RULE_SETUP
{ return VEC3; }
	YY_BREAK
case 50:
YY_RULE_SETUP
{ return VEC4; }
	YY_BREAK
case 51:
YY_RULE_SETUP
{ return IVEC2; }
	YY_BREAK
case 52:
YY_RULE_SETUP
{ return IVEC3; }
	YY_BREAK
case 53:
YY_RULE_SETUP
{ return IVEC4; }
	YY_BREAK
case 54:
YY_RULE_SETUP
{ return BVEC2; }
	YY_BREAK
case 55:
YY_RULE_SETUP
{ return BVEC3; }
	YY_BREAK
case 56:
YY_RULE_SETUP
{ return BVEC4; }
	YY_BREAK
case 57:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UVEC2); }
	YY_BREAK
case 58:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UVEC3); }
	YY_BREAK
case 59:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UVEC4); }
	YY_BREAK
case 60:
YY_RULE_SETUP
{ return SAMPLER2D; }
	YY_BREAK
case 61:
YY_RULE_SETUP
{ return SAMPLERCUBE; }
	YY_BREAK
case 62:
YY_RULE_SETUP
{ return SAMPLER_EXTERNAL_OES; }
	YY_BREAK
case 63:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER3D); }
	YY_BREAK
case 64:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
	YY_BREAK
case 65:
YY_RULE_SETUP
{ return SAMPLER2DRECT; }
	YY_BREAK
case 66:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLER2DARRAY); }
	YY_BREAK
case 67:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, SAMPLER2DMS); }
	YY_BREAK
case 68:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER2D); }
	YY_BREAK
case 69:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER3D); }
	YY_BREAK
case 70:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); }
	YY_BREAK
case 71:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); }
	YY_BREAK
case 72:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, ISAMPLER2DMS); }
	YY_BREAK
case 73:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER2D); }
	YY_BREAK
case 74:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER3D); }
	YY_BREAK
case 75:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLERCUBE); }
	YY_BREAK
case 76:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); }
	YY_BREAK
case 77:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, USAMPLER2DMS); }
	YY_BREAK
case 78:
YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
	YY_BREAK
case 79:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); }
	YY_BREAK
case 80:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
	YY_BREAK
case 81:
YY_RULE_SETUP
{ return ES3_extension_keyword_else_ident(context, "GL_EXT_YUV_target", SAMPLEREXTERNAL2DY2YEXT); }
	YY_BREAK
case 82:
YY_RULE_SETUP
{ return STRUCT; }
	YY_BREAK
case 83:
YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, LAYOUT); }
	YY_BREAK
case 84:
YY_RULE_SETUP
{ return ES3_extension_keyword_else_ident(context, "GL_EXT_YUV_target", YUVCSCSTANDARDEXT); }
	YY_BREAK
case 85:
YY_RULE_SETUP
{ return yuvcscstandardext_constant(context); }
	YY_BREAK
case 86:
YY_RULE_SETUP
{ return yuvcscstandardext_constant(context); }
	YY_BREAK
case 87:
YY_RULE_SETUP
{ return yuvcscstandardext_constant(context); }
	YY_BREAK
case 88:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
	YY_BREAK
case 89:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
	YY_BREAK
case 90:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
	YY_BREAK
case 91:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
	YY_BREAK
case 92:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
	YY_BREAK
case 93:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
	YY_BREAK
case 94:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
	YY_BREAK
case 95:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
	YY_BREAK
case 96:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
	YY_BREAK
case 97:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
	YY_BREAK
case 98:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
	YY_BREAK
case 99:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
	YY_BREAK
case 100:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); }
	YY_BREAK
case 101:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
	YY_BREAK
case 102:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); }
	YY_BREAK
case 103:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); }
	YY_BREAK
case 104:
YY_RULE_SETUP
{ return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); }
	YY_BREAK
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
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:
case 139:
case 140:
case 141:
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 142:
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 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:
case 182:
YY_RULE_SETUP
{ return reserved_word(yyscanner); }
	YY_BREAK
case 183:
YY_RULE_SETUP
{
   yylval->lex.string = NewPoolTString(yytext); 
   return check_type(yyscanner);
}
	YY_BREAK
case 184:
YY_RULE_SETUP
{ return int_constant(context); }
	YY_BREAK
case 185:
YY_RULE_SETUP
{ return int_constant(context); }
	YY_BREAK
case 186:
YY_RULE_SETUP
{ return int_constant(context); }
	YY_BREAK
case 187:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 188:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 189:
YY_RULE_SETUP
{ return uint_constant(context); }
	YY_BREAK
case 190:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 191:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 192:
YY_RULE_SETUP
{ return float_constant(yyscanner); }
	YY_BREAK
case 193:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 194:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 195:
YY_RULE_SETUP
{ return floatsuffix_check(context); }
	YY_BREAK
case 196:
YY_RULE_SETUP
{ return ADD_ASSIGN; }
	YY_BREAK
case 197:
YY_RULE_SETUP
{ return SUB_ASSIGN; }
	YY_BREAK
case 198:
YY_RULE_SETUP
{ return MUL_ASSIGN; }
	YY_BREAK
case 199:
YY_RULE_SETUP
{ return DIV_ASSIGN; }
	YY_BREAK
case 200:
YY_RULE_SETUP
{ return MOD_ASSIGN; }
	YY_BREAK
case 201:
YY_RULE_SETUP
{ return LEFT_ASSIGN; }
	YY_BREAK
case 202:
YY_RULE_SETUP
{ return RIGHT_ASSIGN; }
	YY_BREAK
case 203:
YY_RULE_SETUP
{ return AND_ASSIGN; }
	YY_BREAK
case 204:
YY_RULE_SETUP
{ return XOR_ASSIGN; }
	YY_BREAK
case 205:
YY_RULE_SETUP
{ return OR_ASSIGN; }
	YY_BREAK
case 206:
YY_RULE_SETUP
{ return INC_OP; }
	YY_BREAK
case 207:
YY_RULE_SETUP
{ return DEC_OP; }
	YY_BREAK
case 208:
YY_RULE_SETUP
{ return AND_OP; }
	YY_BREAK
case 209:
YY_RULE_SETUP
{ return OR_OP; }
	YY_BREAK
case 210:
YY_RULE_SETUP
{ return XOR_OP; }
	YY_BREAK
case 211:
YY_RULE_SETUP
{ return LE_OP; }
	YY_BREAK
case 212:
YY_RULE_SETUP
{ return GE_OP; }
	YY_BREAK
case 213:
YY_RULE_SETUP
{ return EQ_OP; }
	YY_BREAK
case 214:
YY_RULE_SETUP
{ return NE_OP; }
	YY_BREAK
case 215:
YY_RULE_SETUP
{ return LEFT_OP; }
	YY_BREAK
case 216:
YY_RULE_SETUP
{ return RIGHT_OP; }
	YY_BREAK
case 217:
YY_RULE_SETUP
{ return SEMICOLON; }
	YY_BREAK
case 218:
YY_RULE_SETUP
{ return LEFT_BRACE; }
	YY_BREAK
case 219:
YY_RULE_SETUP
{ return RIGHT_BRACE; }
	YY_BREAK
case 220:
YY_RULE_SETUP
{ return COMMA; }
	YY_BREAK
case 221:
YY_RULE_SETUP
{ return COLON; }
	YY_BREAK
case 222:
YY_RULE_SETUP
{ return EQUAL; }
	YY_BREAK
case 223:
YY_RULE_SETUP
{ return LEFT_PAREN; }
	YY_BREAK
case 224:
YY_RULE_SETUP
{ return RIGHT_PAREN; }
	YY_BREAK
case 225:
YY_RULE_SETUP
{ return LEFT_BRACKET; }
	YY_BREAK
case 226:
YY_RULE_SETUP
{ return RIGHT_BRACKET; }
	YY_BREAK
case 227:
YY_RULE_SETUP
{ BEGIN(FIELDS); return DOT; }
	YY_BREAK
case 228:
YY_RULE_SETUP
{ return BANG; }
	YY_BREAK
case 229:
YY_RULE_SETUP
{ return DASH; }
	YY_BREAK
case 230:
YY_RULE_SETUP
{ return TILDE; }
	YY_BREAK
case 231:
YY_RULE_SETUP
{ return PLUS; }
	YY_BREAK
case 232:
YY_RULE_SETUP
{ return STAR; }
	YY_BREAK
case 233:
YY_RULE_SETUP
{ return SLASH; }
	YY_BREAK
case 234:
YY_RULE_SETUP
{ return PERCENT; }
	YY_BREAK
case 235:
YY_RULE_SETUP
{ return LEFT_ANGLE; }
	YY_BREAK
case 236:
YY_RULE_SETUP
{ return RIGHT_ANGLE; }
	YY_BREAK
case 237:
YY_RULE_SETUP
{ return VERTICAL_BAR; }
	YY_BREAK
case 238:
YY_RULE_SETUP
{ return CARET; }
	YY_BREAK
case 239:
YY_RULE_SETUP
{ return AMPERSAND; }
	YY_BREAK
case 240:
YY_RULE_SETUP
{ return QUESTION; }
	YY_BREAK
case 241:
YY_RULE_SETUP
{
    BEGIN(INITIAL);
    yylval->lex.string = NewPoolTString(yytext);
    return FIELD_SELECTION;
}
	YY_BREAK
case 242:
YY_RULE_SETUP
{}
	YY_BREAK
case 243:
YY_RULE_SETUP
{
    yyextra->error(*yylloc, "Illegal character at fieldname start", yytext);
    return 0;
}
	YY_BREAK
case 244:
/* rule 244 can match eol */
YY_RULE_SETUP
{ }
	YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(FIELDS):
{ yyterminate(); }
	YY_BREAK
case 245:
YY_RULE_SETUP
{ assert(false); return 0; }
	YY_BREAK
case 246:
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;
	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	register char *source = yyg->yytext_ptr;
	register int number_to_move, i;
	int ret_val;

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

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

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

	/* Try to read more data. */

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

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

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

	else
		{
			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 -
						static_cast<int>(number_to_move) - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

		/* Read in more data. */
        size_t result = 0;
		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
            result, num_to_read );
        yyg->yy_n_chars = static_cast<int>(result);

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

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

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

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

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

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

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

	return ret_val;
}

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

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

	yy_current_state = yyg->yy_start;

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

	return yy_current_state;
}

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

	register YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		yyg->yy_last_accepting_state = yy_current_state;
		yyg->yy_last_accepting_cpos = yy_cp;
		}
	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
		{
		yy_current_state = (int) yy_def[yy_current_state];
		if ( yy_current_state >= 886 )
			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 == 885);

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

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

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

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

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

		else
			{ /* need more input */
			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 = 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;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								, yyscanner);
		if ( ! yyg->yy_buffer_stack )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
								  
		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
				
		yyg->yy_buffer_stack_max = num_to_alloc;
		yyg->yy_buffer_stack_top = 0;
		return;
	}

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

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

		num_to_alloc = static_cast<int>(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 = static_cast<int>(size) - 2;	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = 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 < static_cast<yy_size_t>(_yybytes_len); ++i )
		buf[i] = yybytes[i];

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

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

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

	return b;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

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

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

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

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

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

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

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

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

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

/** Get the length of the current token.
 * @param yyscanner The scanner object.
 */
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
 * @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 line_number
 * @param yyscanner The scanner object.
 */
void yyset_column (int  column_no , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

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

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

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

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

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

/* Accessor methods for yylval and yylloc */

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

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

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

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

int yylex_init(yyscan_t* ptr_yy_globals)

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

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

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

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

    return yy_init_globals ( *ptr_yy_globals );
}

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

int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )

{
    struct yyguts_t dummy_yyguts;

    yyset_extra (yy_user_defined, &dummy_yyguts);

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

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

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

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

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

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

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

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

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

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

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

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

/*
 * Internal utility routines.
 */

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

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

	return n;
}
#endif

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

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

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

#define YYTABLES_NAME "yytables"

yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
    pp::Token token;
    yyget_extra(yyscanner)->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 (symbol && symbol->isVariable()) {
        TVariable* variable = static_cast<TVariable*>(symbol);
        if (variable->isUserType()) {
            token = TYPE_NAME;
        }
    }
    yylval->lex.symbol = symbol;
    return token;
}

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

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

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

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

    return token;
}

int ES2_ident_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 ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
{
    yyscan_t yyscanner = (yyscan_t) context->getScanner();

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

    return token;
}

int ES2_and_ES3_ident_ES3_1_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 and GLSL ES 3.00, so could be used as an identifier/type name
    if (context->getShaderVersion() < 310)
    {
        yylval->lex.string = NewPoolTString(yytext);
        return check_type(yyscanner);
    }

    return token;
}

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

    // a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name
    if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension))
    {
        return token;
    }

    yylval->lex.string = NewPoolTString(yytext);
    return check_type(yyscanner);
}

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

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

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

    return UINTCONSTANT;
}

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

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

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

    return(FLOATCONSTANT);
}

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

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

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

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

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

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

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

    yylval->lex.string = NewPoolTString(yytext);
    return check_type(yyscanner);
}

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

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

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

    return 0;
}

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

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

    if (!preprocessor->init(count, string, length))
        return 1;

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

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

    return 0;
}

