
#line 3 "lex.sksl.c"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

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

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

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

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

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

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

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

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

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

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

/* TODO: this is always defined, so inline it */
#define yyconst const

#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yynoreturn
#endif

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

/* Promotes a possibly negative, possibly signed char to an 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 skslrestart(yyin ,yyscanner )

#define YY_END_OF_BUFFER_CHAR 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via skslrestart()), 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 skslrestart (FILE *input_file ,yyscan_t yyscanner );
void sksl_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
YY_BUFFER_STATE sksl_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
void sksl_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void sksl_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void skslpush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
void skslpop_buffer_state (yyscan_t yyscanner );

static void skslensure_buffer_stack (yyscan_t yyscanner );
static void sksl_load_buffer_state (yyscan_t yyscanner );
static void sksl_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );

#define YY_FLUSH_BUFFER sksl_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

YY_BUFFER_STATE sksl_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE sksl_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE sksl_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );

void *skslalloc (yy_size_t ,yyscan_t yyscanner );
void *skslrealloc (void *,yy_size_t ,yyscan_t yyscanner );
void skslfree (void * ,yyscan_t yyscanner );

#define yy_new_buffer sksl_create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        skslensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            sksl_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 ){\
        skslensure_buffer_stack (yyscanner); \
		YY_CURRENT_BUFFER_LVALUE =    \
            sksl_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 */

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 yynoreturn 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 = (int) (yy_cp - yy_bp); \
	yyg->yy_hold_char = *yy_cp; \
	*yy_cp = '\0'; \
	yyg->yy_c_buf_p = yy_cp;

#define YY_NUM_RULES 96
#define YY_END_OF_BUFFER 97
/* 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[285] =
    {   0,
        0,    0,   97,   95,   94,   94,   68,   95,   42,   58,
       63,   44,   45,   56,   54,   51,   55,   50,   57,    4,
        4,   70,   91,   75,   71,   74,   69,   95,   48,   49,
       62,   42,   42,   42,   42,   42,   42,   42,   42,   42,
       42,   42,   42,   42,   42,   42,   42,   42,   42,   46,
       61,   47,   64,   94,   73,   43,   42,   82,   67,   87,
       80,   52,   78,   53,   79,    1,    0,   92,   81,    2,
        4,    0,    0,   59,   77,   72,   76,   60,    0,    0,
       86,   66,   42,   42,   42,   42,   42,   42,   13,   42,
       42,   42,   42,   42,    8,   22,   42,   42,   42,   42,

       42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
       42,   85,   65,   43,   90,    0,    0,    0,   92,    1,
        0,    0,    3,    5,   83,   84,    9,    0,   89,   42,
       42,   42,   42,   42,   42,   42,   42,   42,   42,   11,
       42,   42,   42,   42,   42,   42,   23,   42,   42,   42,
       42,   42,   42,   42,   42,   42,   42,   42,   42,   88,
        0,    1,   93,    0,    0,    2,    0,   42,   42,   16,
       42,   42,   42,   42,   42,   10,   42,   30,   42,   42,
       42,   27,   42,   42,   42,   42,   42,   42,   42,   42,
       42,    6,   42,   42,   42,   42,    0,    1,    0,   18,

       42,   42,   26,   42,   42,   42,    7,   29,   24,   42,
       42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
       42,   12,   42,    0,   37,   42,   42,   42,   42,   40,
       42,   42,   42,   42,   42,   21,   42,   39,   14,   42,
       42,   42,   15,   42,   42,   17,   20,   28,   42,   42,
       42,   42,   42,   25,   42,   42,   34,   19,   42,   42,
       32,   36,   42,   35,   42,   42,   41,   42,   33,   42,
       42,   42,   42,   42,   42,   31,   42,   42,   42,   42,
       42,   42,   38,    0
    } ;

static yyconst YY_CHAR yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    4,    1,    5,    6,    7,    8,    1,    9,
       10,   11,   12,   13,   14,   15,   16,   17,   18,   18,
       18,   18,   18,   18,   18,   18,   18,   19,   20,   21,
       22,   23,   24,   25,   26,   26,   26,   26,   27,   26,
        6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
        6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
       28,    1,   29,   30,   31,    1,   32,   33,   34,   35,

       36,   37,   38,   39,   40,    6,   41,   42,   43,   44,
       45,   46,    6,   47,   48,   49,   50,   51,   52,   53,
       54,    6,   55,   56,   57,   58,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

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

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

static yyconst flex_uint16_t yy_base[291] =
    {   0,
        0,    0,  353,  354,   57,   59,  330,    0,    0,  329,
       55,  354,  354,  328,   52,  354,   51,   49,   59,   61,
       65,  354,  354,   47,  327,   49,  354,   45,  354,  354,
       64,   37,   57,   55,  306,   64,  307,   61,   58,  310,
      300,  294,  296,  306,   58,  294,  296,  294,   65,  354,
       86,  354,  354,  113,  354,    0,    0,  354,  316,  354,
      354,  354,  354,  354,  354,  100,  326,    0,  354,  102,
      107,  114,    0,  314,  354,  354,  354,  313,  297,  281,
      354,  310,  295,  293,  281,   91,  291,  279,    0,  278,
      283,  292,  276,  284,    0,  276,  266,  267,  283,  271,

      267,  279,   91,  283,  266,  272,  261,  270,  267,  268,
      267,  354,  284,    0,  354,  132,  294,  288,    0,  130,
      141,  134,  143,    0,  354,  354,  354,  263,  354,  270,
      264,  264,  263,  114,  266,  263,  260,  247,  245,    0,
      254,  242,  246,  244,  249,  252,    0,  253,  251,  236,
      234,  244,  232,  232,  244,  242,  246,  235,  227,  354,
      147,  150,  354,  157,  155,  159,  226,  233,  237,    0,
      225,  222,  230,  219,  236,    0,  231,    0,  220,  216,
      214,    0,  213,  215,  221,  215,  212,  211,  225,  222,
      221,    0,  209,  204,  216,  215,  161,  163,  216,    0,

      202,  212,    0,  203,  204,  198,    0,    0,    0,  195,
      200,  194,  193,  196,  199,  194,  189,  187,  196,  187,
      193,    0,  187,  192,    0,  186,  179,  179,  192,    0,
      180,  179,  184,  181,  188,    0,  190,    0,    0,  177,
      177,  174,  354,  168,  180,    0,    0,    0,  179,  169,
      159,  163,  163,    0,  174,  167,    0,    0,  174,  163,
        0,    0,  166,    0,  151,  155,    0,  168,    0,  157,
      147,  119,  125,  118,  109,    0,  104,  100,   97,   87,
       64,   63,    0,  354,  179,  182,  185,  190,  195,  197
    } ;

static yyconst flex_int16_t yy_def[291] =
    {   0,
      284,    1,  284,  284,  284,  284,  284,  285,  286,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  284,
      284,  284,  284,  284,  284,  287,  286,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  288,  289,  284,  284,
      284,  284,  290,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,

      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  284,  284,  287,  284,  284,  288,  288,  289,  284,
      284,  284,  284,  290,  284,  284,  284,  284,  284,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  284,
      284,  284,  284,  284,  284,  284,  284,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  284,  284,  284,  286,

      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  284,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  284,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
      286,  286,  286,    0,  284,  284,  284,  284,  284,  284
    } ;

static yyconst flex_uint16_t yy_nxt[413] =
    {   0,
        4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
       14,   15,   16,   17,   18,   19,   20,   21,   22,   23,
       24,   25,   26,   27,   28,    9,    9,   29,   30,   31,
        9,    9,   32,   33,   34,   35,   36,    9,   37,   38,
        9,   39,   40,   41,   42,   43,   44,   45,   46,   47,
       48,   49,    9,    9,   50,   51,   52,   53,   54,   54,
       54,   54,   59,   62,   64,   66,   66,   74,   75,   67,
       77,   78,   65,   63,   68,   70,   60,   71,   71,   70,
       69,   71,   71,   83,   79,   81,   84,   72,   85,   97,
       87,   72,   80,   82,   88,   91,   72,   95,  104,   89,

       72,   86,   98,  110,   96,   92,  105,  112,   93,  106,
      283,  111,  282,   73,   54,   54,   66,   66,  120,  120,
      281,   70,  149,   71,   71,  122,  116,  122,  121,  133,
      123,  123,  280,   72,  134,  116,  279,  121,  150,  151,
      278,  113,   72,  161,  277,  161,  120,  120,  162,  162,
      123,  123,  165,  276,  165,  275,  164,  166,  166,  123,
      123,  172,  173,  162,  162,  164,  162,  162,  197,  274,
      197,  166,  166,  198,  198,  166,  166,  198,  198,  198,
      198,   56,  273,   56,   57,   57,   57,  114,  114,  114,
      117,  117,  117,  117,  117,  119,  272,  119,  119,  119,

      124,  124,  271,  270,  269,  268,  267,  266,  265,  264,
      263,  262,  261,  260,  259,  258,  257,  256,  255,  254,
      253,  252,  251,  250,  249,  248,  247,  246,  245,  244,
      243,  242,  241,  240,  239,  238,  237,  236,  235,  234,
      233,  232,  231,  230,  229,  228,  227,  226,  225,  224,
      223,  222,  221,  220,  219,  218,  217,  216,  215,  214,
      213,  212,  211,  210,  209,  208,  207,  206,  205,  204,
      203,  202,  201,  200,  199,  196,  195,  194,  193,  192,
      191,  190,  189,  188,  187,  186,  185,  184,  183,  182,
      181,  180,  179,  178,  177,  176,  175,  174,  171,  170,

      169,  168,  167,  163,  118,  160,  159,  158,  157,  156,
      155,  154,  153,  152,  148,  147,  146,  145,  144,  143,
      142,  141,  140,  139,  138,  137,  136,  135,  132,  131,
      130,  129,  128,  127,  126,  125,  118,  115,  109,  108,
      107,  103,  102,  101,  100,   99,   94,   90,   76,   61,
       58,   55,  284,    3,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,

      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284
    } ;

static yyconst flex_int16_t yy_chk[413] =
    {   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,    5,    5,
        6,    6,   11,   15,   17,   18,   18,   24,   24,   19,
       26,   26,   17,   15,   19,   20,   11,   20,   20,   21,
       19,   21,   21,   32,   28,   31,   32,   20,   33,   39,
       34,   21,   28,   31,   34,   36,   20,   38,   45,   34,

       21,   33,   39,   49,   38,   36,   45,   51,   36,   45,
      282,   49,  281,   20,   54,   54,   66,   66,   70,   70,
      280,   71,  103,   71,   71,   72,   66,   72,   70,   86,
       72,   72,  279,   71,   86,   66,  278,   70,  103,  103,
      277,   51,   71,  116,  275,  116,  120,  120,  116,  116,
      122,  122,  121,  274,  121,  273,  120,  121,  121,  123,
      123,  134,  134,  161,  161,  120,  162,  162,  164,  272,
      164,  165,  165,  164,  164,  166,  166,  197,  197,  198,
      198,  285,  271,  285,  286,  286,  286,  287,  287,  287,
      288,  288,  288,  288,  288,  289,  270,  289,  289,  289,

      290,  290,  268,  266,  265,  263,  260,  259,  256,  255,
      253,  252,  251,  250,  249,  245,  244,  242,  241,  240,
      237,  235,  234,  233,  232,  231,  229,  228,  227,  226,
      224,  223,  221,  220,  219,  218,  217,  216,  215,  214,
      213,  212,  211,  210,  206,  205,  204,  202,  201,  199,
      196,  195,  194,  193,  191,  190,  189,  188,  187,  186,
      185,  184,  183,  181,  180,  179,  177,  175,  174,  173,
      172,  171,  169,  168,  167,  159,  158,  157,  156,  155,
      154,  153,  152,  151,  150,  149,  148,  146,  145,  144,
      143,  142,  141,  139,  138,  137,  136,  135,  133,  132,

      131,  130,  128,  118,  117,  113,  111,  110,  109,  108,
      107,  106,  105,  104,  102,  101,  100,   99,   98,   97,
       96,   94,   93,   92,   91,   90,   88,   87,   85,   84,
       83,   82,   80,   79,   78,   74,   67,   59,   48,   47,
       46,   44,   43,   42,   41,   40,   37,   35,   25,   14,
       10,    7,    3,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,

      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
      284,  284
    } ;

/* Table of booleans, true if rule could match eol. */
static yyconst flex_int32_t yy_rule_can_match_eol[97] =
    {   0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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
#line 1 "sksl.flex"
/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
/*

    This file is IGNORED during the build process!

    As this file is updated so infrequently and flex is not universally present on build machines,
    the lex.sksl.c file must be manually regenerated if you make any changes to this file. Just run:

        flex sksl.flex

    You will have to manually add a copyright notice to the top of lex.sksl.c.

*/
#define YY_NO_UNISTD_H 1
#line 658 "lex.sksl.c"

#define INITIAL 0

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user's section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
#include <unistd.h>
#endif

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

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

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

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

    int yylineno_r;
    int yy_flex_debug_r;

    char *yytext_r;
    int yy_more_flag;
    int yy_more_len;

    }; /* end struct yyguts_t */

static int yy_init_globals (yyscan_t yyscanner );

int sksllex_init (yyscan_t* scanner);

int sksllex_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 sksllex_destroy (yyscan_t yyscanner );

int skslget_debug (yyscan_t yyscanner );

void skslset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE skslget_extra (yyscan_t yyscanner );

void skslset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *skslget_in (yyscan_t yyscanner );

void skslset_in  (FILE * _in_str ,yyscan_t yyscanner );

FILE *skslget_out (yyscan_t yyscanner );

void skslset_out  (FILE * _out_str ,yyscan_t yyscanner );

			int skslget_leng (yyscan_t yyscanner );

char *skslget_text (yyscan_t yyscanner );

int skslget_lineno (yyscan_t yyscanner );

void skslset_lineno (int _line_number ,yyscan_t yyscanner );

int skslget_column  (yyscan_t yyscanner );

void skslset_column (int _column_no ,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 skslwrap (yyscan_t yyscanner );
#else
extern int skslwrap (yyscan_t yyscanner );
#endif
#endif

#ifndef YY_NO_UNPUT
    
    static void yyunput (int c,char *buf_ptr  ,yyscan_t yyscanner);
    
#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
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#endif

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

/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		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 = (int) 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 sksllex (yyscan_t yyscanner);

#define YY_DECL int sksllex (yyscan_t yyscanner)
#endif /* !YY_DECL */

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

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

#define YY_RULE_SETUP \
	YY_USER_ACTION

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

	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 ) {
			skslensure_buffer_stack (yyscanner);
			YY_CURRENT_BUFFER_LVALUE =
				sksl_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
		}

		sksl_load_buffer_state(yyscanner );
		}

	{
#line 30 "sksl.flex"


#line 922 "lex.sksl.c"

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

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

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

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

yy_find_action:
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

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

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

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

case 1:
YY_RULE_SETUP
#line 32 "sksl.flex"
{ return SkSL::Token::FLOAT_LITERAL; }
	YY_BREAK
case 2:
YY_RULE_SETUP
#line 34 "sksl.flex"
{ return SkSL::Token::FLOAT_LITERAL; }
	YY_BREAK
case 3:
YY_RULE_SETUP
#line 36 "sksl.flex"
{ return SkSL::Token::FLOAT_LITERAL; }
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 38 "sksl.flex"
{ return SkSL::Token::INT_LITERAL; }
	YY_BREAK
case 5:
YY_RULE_SETUP
#line 40 "sksl.flex"
{ return SkSL::Token::INT_LITERAL; }
	YY_BREAK
case 6:
YY_RULE_SETUP
#line 42 "sksl.flex"
{ return SkSL::Token::TRUE_LITERAL; }
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 44 "sksl.flex"
{ return SkSL::Token::FALSE_LITERAL; }
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 46 "sksl.flex"
{ return SkSL::Token::IF; }
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 48 "sksl.flex"
{ return SkSL::Token::STATIC_IF; }
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 50 "sksl.flex"
{ return SkSL::Token::ELSE; }
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 52 "sksl.flex"
{ return SkSL::Token::FOR; }
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 54 "sksl.flex"
{ return SkSL::Token::WHILE; }
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 56 "sksl.flex"
{ return SkSL::Token::DO; }
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 58 "sksl.flex"
{ return SkSL::Token::SWITCH; }
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 60 "sksl.flex"
{ return SkSL::Token::STATIC_SWITCH; }
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 62 "sksl.flex"
{ return SkSL::Token::CASE; }
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 64 "sksl.flex"
{ return SkSL::Token::DEFAULT; }
	YY_BREAK
case 18:
YY_RULE_SETUP
#line 66 "sksl.flex"
{ return SkSL::Token::BREAK; }
	YY_BREAK
case 19:
YY_RULE_SETUP
#line 68 "sksl.flex"
{ return SkSL::Token::CONTINUE; }
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 70 "sksl.flex"
{ return SkSL::Token::DISCARD; }
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 72 "sksl.flex"
{ return SkSL::Token::RETURN; }
	YY_BREAK
case 22:
YY_RULE_SETUP
#line 74 "sksl.flex"
{ return SkSL::Token::IN; }
	YY_BREAK
case 23:
YY_RULE_SETUP
#line 76 "sksl.flex"
{ return SkSL::Token::OUT; }
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 78 "sksl.flex"
{ return SkSL::Token::INOUT; }
	YY_BREAK
case 25:
YY_RULE_SETUP
#line 80 "sksl.flex"
{ return SkSL::Token::UNIFORM; }
	YY_BREAK
case 26:
YY_RULE_SETUP
#line 82 "sksl.flex"
{ return SkSL::Token::CONST; }
	YY_BREAK
case 27:
YY_RULE_SETUP
#line 84 "sksl.flex"
{ return SkSL::Token::LOWP; }
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 86 "sksl.flex"
{ return SkSL::Token::MEDIUMP; }
	YY_BREAK
case 29:
YY_RULE_SETUP
#line 88 "sksl.flex"
{ return SkSL::Token::HIGHP; }
	YY_BREAK
case 30:
YY_RULE_SETUP
#line 90 "sksl.flex"
{ return SkSL::Token::FLAT; }
	YY_BREAK
case 31:
YY_RULE_SETUP
#line 92 "sksl.flex"
{ return SkSL::Token::NOPERSPECTIVE; }
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 94 "sksl.flex"
{ return SkSL::Token::READONLY; }
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 96 "sksl.flex"
{ return SkSL::Token::WRITEONLY; }
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 98 "sksl.flex"
{ return SkSL::Token::COHERENT; }
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 100 "sksl.flex"
{ return SkSL::Token::VOLATILE; }
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 102 "sksl.flex"
{ return SkSL::Token::RESTRICT; }
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 104 "sksl.flex"
{ return SkSL::Token::BUFFER; }
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 106 "sksl.flex"
{ return SkSL::Token::HASSIDEEFFECTS; }
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 108 "sksl.flex"
{ return SkSL::Token::STRUCT; }
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 110 "sksl.flex"
{ return SkSL::Token::LAYOUT; }
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 112 "sksl.flex"
{ return SkSL::Token::PRECISION; }
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 114 "sksl.flex"
{ return SkSL::Token::IDENTIFIER; }
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 116 "sksl.flex"
{ return SkSL::Token::DIRECTIVE; }
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 118 "sksl.flex"
{ return SkSL::Token::LPAREN; }
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 120 "sksl.flex"
{ return SkSL::Token::RPAREN; }
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 122 "sksl.flex"
{ return SkSL::Token::LBRACE; }
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 124 "sksl.flex"
{ return SkSL::Token::RBRACE; }
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 126 "sksl.flex"
{ return SkSL::Token::LBRACKET; }
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 128 "sksl.flex"
{ return SkSL::Token::RBRACKET; }
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 130 "sksl.flex"
{ return SkSL::Token::DOT; }
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 132 "sksl.flex"
{ return SkSL::Token::COMMA; }
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 134 "sksl.flex"
{ return SkSL::Token::PLUSPLUS; }
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 136 "sksl.flex"
{ return SkSL::Token::MINUSMINUS; }
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 138 "sksl.flex"
{ return SkSL::Token::PLUS; }
	YY_BREAK
case 55:
YY_RULE_SETUP
#line 140 "sksl.flex"
{ return SkSL::Token::MINUS; }
	YY_BREAK
case 56:
YY_RULE_SETUP
#line 142 "sksl.flex"
{ return SkSL::Token::STAR; }
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 144 "sksl.flex"
{ return SkSL::Token::SLASH; }
	YY_BREAK
case 58:
YY_RULE_SETUP
#line 146 "sksl.flex"
{ return SkSL::Token::PERCENT; }
	YY_BREAK
case 59:
YY_RULE_SETUP
#line 148 "sksl.flex"
{ return SkSL::Token::SHL; }
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 150 "sksl.flex"
{ return SkSL::Token::SHR; }
	YY_BREAK
case 61:
YY_RULE_SETUP
#line 152 "sksl.flex"
{ return SkSL::Token::BITWISEOR; }
	YY_BREAK
case 62:
YY_RULE_SETUP
#line 154 "sksl.flex"
{ return SkSL::Token::BITWISEXOR; }
	YY_BREAK
case 63:
YY_RULE_SETUP
#line 156 "sksl.flex"
{ return SkSL::Token::BITWISEAND; }
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 158 "sksl.flex"
{ return SkSL::Token::BITWISENOT; }
	YY_BREAK
case 65:
YY_RULE_SETUP
#line 160 "sksl.flex"
{ return SkSL::Token::LOGICALOR; }
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 162 "sksl.flex"
{ return SkSL::Token::LOGICALXOR; }
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 164 "sksl.flex"
{ return SkSL::Token::LOGICALAND; }
	YY_BREAK
case 68:
YY_RULE_SETUP
#line 166 "sksl.flex"
{ return SkSL::Token::LOGICALNOT; }
	YY_BREAK
case 69:
YY_RULE_SETUP
#line 168 "sksl.flex"
{ return SkSL::Token::QUESTION; }
	YY_BREAK
case 70:
YY_RULE_SETUP
#line 170 "sksl.flex"
{ return SkSL::Token::COLON; }
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 172 "sksl.flex"
{ return SkSL::Token::EQ; }
	YY_BREAK
case 72:
YY_RULE_SETUP
#line 174 "sksl.flex"
{ return SkSL::Token::EQEQ; }
	YY_BREAK
case 73:
YY_RULE_SETUP
#line 176 "sksl.flex"
{ return SkSL::Token::NEQ; }
	YY_BREAK
case 74:
YY_RULE_SETUP
#line 178 "sksl.flex"
{ return SkSL::Token::GT; }
	YY_BREAK
case 75:
YY_RULE_SETUP
#line 180 "sksl.flex"
{ return SkSL::Token::LT; }
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 182 "sksl.flex"
{ return SkSL::Token::GTEQ; }
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 184 "sksl.flex"
{ return SkSL::Token::LTEQ; }
	YY_BREAK
case 78:
YY_RULE_SETUP
#line 186 "sksl.flex"
{ return SkSL::Token::PLUSEQ; }
	YY_BREAK
case 79:
YY_RULE_SETUP
#line 188 "sksl.flex"
{ return SkSL::Token::MINUSEQ; }
	YY_BREAK
case 80:
YY_RULE_SETUP
#line 190 "sksl.flex"
{ return SkSL::Token::STAREQ; }
	YY_BREAK
case 81:
YY_RULE_SETUP
#line 192 "sksl.flex"
{ return SkSL::Token::SLASHEQ; }
	YY_BREAK
case 82:
YY_RULE_SETUP
#line 194 "sksl.flex"
{ return SkSL::Token::PERCENTEQ; }
	YY_BREAK
case 83:
YY_RULE_SETUP
#line 196 "sksl.flex"
{ return SkSL::Token::SHLEQ; }
	YY_BREAK
case 84:
YY_RULE_SETUP
#line 198 "sksl.flex"
{ return SkSL::Token::SHREQ; }
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 200 "sksl.flex"
{ return SkSL::Token::BITWISEOREQ; }
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 202 "sksl.flex"
{ return SkSL::Token::BITWISEXOREQ; }
	YY_BREAK
case 87:
YY_RULE_SETUP
#line 204 "sksl.flex"
{ return SkSL::Token::BITWISEANDEQ; }
	YY_BREAK
case 88:
YY_RULE_SETUP
#line 206 "sksl.flex"
{ return SkSL::Token::LOGICALOREQ; }
	YY_BREAK
case 89:
YY_RULE_SETUP
#line 208 "sksl.flex"
{ return SkSL::Token::LOGICALXOREQ; }
	YY_BREAK
case 90:
YY_RULE_SETUP
#line 210 "sksl.flex"
{ return SkSL::Token::LOGICALANDEQ; }
	YY_BREAK
case 91:
YY_RULE_SETUP
#line 212 "sksl.flex"
{ return SkSL::Token::SEMICOLON; }
	YY_BREAK
case 92:
YY_RULE_SETUP
#line 214 "sksl.flex"
/* line comment */
	YY_BREAK
case 93:
/* rule 93 can match eol */
YY_RULE_SETUP
#line 216 "sksl.flex"
/* block comment */
	YY_BREAK
case 94:
/* rule 94 can match eol */
YY_RULE_SETUP
#line 218 "sksl.flex"
/* whitespace */
	YY_BREAK
case 95:
YY_RULE_SETUP
#line 220 "sksl.flex"
{ return SkSL::Token::INVALID_TOKEN; }
	YY_BREAK
case 96:
YY_RULE_SETUP
#line 222 "sksl.flex"
ECHO;
	YY_BREAK
#line 1469 "lex.sksl.c"
case YY_STATE_EOF(INITIAL):
	yyterminate();

	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
			 * sksllex().  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 ( skslwrap(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 sksllex */

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

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

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

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

	/* Try to read more data. */

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

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

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

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

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

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

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

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

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

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					skslrealloc((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 = NULL;

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

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

			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
						number_to_move - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

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

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
		}

	if ( yyg->yy_n_chars == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			skslrestart(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 ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) skslrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
	}

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

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

	return ret_val;
}

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

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

	yy_current_state = yyg->yy_start;

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

	return yy_current_state;
}

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

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

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

#ifndef YY_NO_UNPUT

    static void yyunput (int c, char * yy_bp , yyscan_t yyscanner)
{
	char *yy_cp;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

    yy_cp = yyg->yy_c_buf_p;

	/* undo effects of setting up yytext */
	*yy_cp = yyg->yy_hold_char;

	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
		{ /* need to shift things up to make room */
		/* +2 for EOB chars. */
		int number_to_move = yyg->yy_n_chars + 2;
		char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
		char *source =
				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];

		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			*--dest = *--source;

		yy_cp += (int) (dest - source);
		yy_bp += (int) (dest - source);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
			yyg->yy_n_chars = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size;

		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
			YY_FATAL_ERROR( "flex scanner push-back overflow" );
		}

	*--yy_cp = (char) c;

    if ( c == '\n' ){
        --yylineno;
    }

	yyg->yytext_ptr = yy_bp;
	yyg->yy_hold_char = *yy_cp;
	yyg->yy_c_buf_p = yy_cp;
}

#endif

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

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

	*yyg->yy_c_buf_p = yyg->yy_hold_char;

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

		else
			{ /* need more input */
			int offset = 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. */
					skslrestart(yyin ,yyscanner);

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( skslwrap(yyscanner ) )
						return 0;

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

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

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

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

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

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

	if ( ! YY_CURRENT_BUFFER ){
        skslensure_buffer_stack (yyscanner);
		YY_CURRENT_BUFFER_LVALUE =
            sksl_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
	}

	sksl_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
	sksl_load_buffer_state(yyscanner );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * @param yyscanner The scanner object.
 */
    void sksl_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
	 *		skslpop_buffer_state();
	 *		skslpush_buffer_state(new_buffer);
     */
	skslensure_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;
	sksl_load_buffer_state(yyscanner );

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

static void sksl_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 sksl_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) skslalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in sksl_create_buffer()" );

	b->yy_buf_size = (yy_size_t)size;

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

	b->yy_is_our_buffer = 1;

	sksl_init_buffer(b,file ,yyscanner);

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with sksl_create_buffer()
 * @param yyscanner The scanner object.
 */
    void sksl_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 )
		skslfree((void *) b->yy_ch_buf ,yyscanner );

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

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

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

	sksl_flush_buffer(b ,yyscanner);

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

    /* If b is the current buffer, then sksl_init_buffer was _probably_
     * called from skslrestart() 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 sksl_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 )
		sksl_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 skslpush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (new_buffer == NULL)
		return;

	skslensure_buffer_stack(yyscanner);

	/* This block is copied from sksl_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 sksl_switch_to_buffer. */
	sksl_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 skslpop_buffer_state (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
	if (!YY_CURRENT_BUFFER)
		return;

	sksl_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) {
		sksl_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 skslensure_buffer_stack (yyscan_t yyscanner)
{
	int num_to_alloc;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

	if (!yyg->yy_buffer_stack) {

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

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

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

		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
		yyg->yy_buffer_stack = (struct yy_buffer_state**)skslrealloc
								(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 skslensure_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 sksl_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
{
	YY_BUFFER_STATE b;
    
	if ( size < 2 ||
	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
	     base[size-1] != YY_END_OF_BUFFER_CHAR )
		/* They forgot to leave room for the EOB's. */
		return NULL;

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

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

	sksl_switch_to_buffer(b ,yyscanner );

	return b;
}

/** Setup the input buffer state to scan a string. The next call to sksllex() 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
 *       sksl_scan_bytes() instead.
 */
YY_BUFFER_STATE sksl_scan_string (yyconst char * yystr , yyscan_t yyscanner)
{
    
	return sksl_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner);
}

/** Setup the input buffer state to scan the given bytes. The next call to sksllex() 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 sksl_scan_bytes  (yyconst char * yybytes, int  _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 = (yy_size_t) _yybytes_len + 2;
	buf = (char *) skslalloc(n ,yyscanner );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in sksl_scan_bytes()" );

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

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

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

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

	return b;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

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

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

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

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

/** Get the user-defined data for this scanner.
 * @param yyscanner The scanner object.
 */
YY_EXTRA_TYPE skslget_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 skslget_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 skslget_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 *skslget_in  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyin;
}

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

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

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

char *skslget_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 skslset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyextra = user_defined ;
}

/** Set the current line number.
 * @param _line_number line number
 * @param yyscanner The scanner object.
 */
void skslset_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( "skslset_lineno called with no buffer" );
    
    yylineno = _line_number;
}

/** Set the current column.
 * @param _column_no column number
 * @param yyscanner The scanner object.
 */
void skslset_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( "skslset_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 sksl_switch_to_buffer
 */
void skslset_in (FILE *  _in_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyin = _in_str ;
}

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

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

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

/* Accessor methods for yylval and yylloc */

/* User-visible API */

/* sksllex_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 sksllex_init(yyscan_t* ptr_yy_globals)

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

    *ptr_yy_globals = (yyscan_t) skslalloc ( 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 );
}

/* sksllex_init_extra has the same functionality as sksllex_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 skslalloc in
 * the yyextra field.
 */

int sksllex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )

{
    struct yyguts_t dummy_yyguts;

    skslset_extra (yy_user_defined, &dummy_yyguts);

    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }
	
    *ptr_yy_globals = (yyscan_t) skslalloc ( 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));
    
    skslset_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 sksllex_destroy(), so don't allocate here.
     */

    yyg->yy_buffer_stack = NULL;
    yyg->yy_buffer_stack_top = 0;
    yyg->yy_buffer_stack_max = 0;
    yyg->yy_c_buf_p = NULL;
    yyg->yy_init = 0;
    yyg->yy_start = 0;

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

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = NULL;
    yyout = NULL;
#endif

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

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

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

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

    /* Destroy the start condition stack. */
        skslfree(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
     * sksllex() is called, initialization will occur. */
    yy_init_globals( yyscanner);

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

/*
 * Internal utility routines.
 */

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

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

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

	return n;
}
#endif

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

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

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

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

#define YYTABLES_NAME "yytables"

#line 222 "sksl.flex"



int skslwrap(yyscan_t scanner) {
    return 1; // terminate
}

