
#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

/* %not-for-header */
/* %if-c-only */
/* %if-not-reentrant */

/* %endif */
/* %endif */
/* %ok-for-header */

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

/* %if-c++-only */
/* %endif */

/* %if-c-only */

/* %endif */

/* %if-c-only */

/* %endif */

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

/* begin standard C headers. */
/* %if-c-only */

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
/* %endif */

/* %if-tables-serialization */
/* %endif */
/* end standard C headers. */

/* begin standard C++ headers. */
/* %if-c++-only */
/* %endif */

/* %if-c-or-c++ */
/* flex integer type definitions */

#ifndef YYFLEX_INTTYPES_DEFINED
#define YYFLEX_INTTYPES_DEFINED

/* Prefer C99 integer types if available. */
# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* Include <inttypes.h> and not <stdint.h> because Solaris 2.6 has the former
 * and not the latter.
 */
#include <inttypes.h>
#  define YYFLEX_USE_STDINT
# else
#  if defined(_MSC_VER) && _MSC_VER >= 1600
/* Visual C++ 2010 does not define __STDC_VERSION__ and has <stdint.h> but not
 * <inttypes.h>.
 */
#include <stdint.h>
#   define YYFLEX_USE_STDINT
#  endif
# endif
# ifdef YYFLEX_USE_STDINT
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 unsigned char flex_uint8_t;
typedef short int flex_int16_t;
typedef unsigned short int flex_uint16_t;
#  ifdef __STDC__
typedef signed char flex_int8_t;
/* ISO C only requires at least 16 bits for int. */
#include <limits.h>
#   if UINT_MAX >= 4294967295
#    define YYFLEX_INT32_DEFINED
typedef int flex_int32_t;
typedef unsigned int flex_uint32_t;
#   endif
#  else
typedef char flex_int8_t;
#  endif
#  ifndef YYFLEX_INT32_DEFINED
typedef long int flex_int32_t;
typedef unsigned long int flex_uint32_t;
#  endif
# endif
#endif /* YYFLEX_INTTYPES_DEFINED */

/* %endif */

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

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

/* %not-for-header */
/* Returned upon end-of-file. */
#define YY_NULL 0
/* %ok-for-header */

/* %not-for-header */
/* Promotes a possibly negative, possibly signed char to an
 *   integer in range [0..255] for use as an array index.
 */
#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
/* %ok-for-header */

/* %if-reentrant */
/* %endif */

/* %if-not-reentrant */

/* %endif */

/* 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 (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 (((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  )
#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

/* %if-not-reentrant */
extern int yyleng;
/* %endif */

/* %if-c-only */
/* %if-not-reentrant */
extern FILE *yyin, *yyout;
/* %endif */
/* %endif */

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2
    
    #define YY_LESS_LINENO(n)
    #define YY_LINENO_REWIND_TO(ptr)
    
/* 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 = (yy_hold_char); \
		YY_RESTORE_YY_MORE_OFFSET \
		(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, (yytext_ptr)  )

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
	{
/* %if-c-only */
	FILE *yy_input_file;
/* %endif */

/* %if-c++-only */
/* %endif */

	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 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 */

/* %if-c-only Standard (non-C++) definition */
/* %not-for-header */
/* %if-not-reentrant */

/* Stack of input buffers. */
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
/* %endif */
/* %ok-for-header */

/* %endif */

/* 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 ( (yy_buffer_stack) \
                          ? (yy_buffer_stack)[(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 (yy_buffer_stack)[(yy_buffer_stack_top)]

/* %if-c-only Standard (non-C++) definition */

/* %if-not-reentrant */
/* %not-for-header */
/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;
static int yy_n_chars;		/* number of characters read into yy_ch_buf */
int yyleng;

/* Points to current character in buffer. */
static char *yy_c_buf_p = NULL;
static int yy_init = 0;		/* whether we need to initialize */
static int yy_start = 0;	/* start state number */

/* Flag which is used to allow yywrap()'s to do buffer switches
 * instead of setting up a fresh yyin.  A bit of a hack ...
 */
static int yy_did_buffer_switch_on_eof;
/* %ok-for-header */

/* %endif */

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

static void yyensure_buffer_stack ( void );
static void yy_load_buffer_state ( void );
static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )

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

/* %endif */

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

#define yy_new_buffer yy_create_buffer
#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}
#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* %% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here */
/* Begin user sect3 */

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

#define FLEX_DEBUG
typedef flex_uint8_t YY_CHAR;

FILE *yyin = NULL, *yyout = NULL;

typedef int yy_state_type;

extern int yylineno;
int yylineno = 1;

extern char *yytext;
#ifdef yytext_ptr
#undef yytext_ptr
#endif
#define yytext_ptr yytext

/* %% [1.5] DFA */

/* %if-c-only Standard (non-C++) definition */

static yy_state_type yy_get_previous_state ( void );
static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
static int yy_get_next_buffer ( void );
static void yynoreturn yy_fatal_error ( const char* msg  );

/* %endif */

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
	(yytext_ptr) = yy_bp; \
/* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\
	yyleng = (int) (yy_cp - yy_bp); \
	(yy_hold_char) = *yy_cp; \
	*yy_cp = '\0'; \
/* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
	(yy_c_buf_p) = yy_cp;
/* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
#define YY_NUM_RULES 123
#define YY_END_OF_BUFFER 124
/* 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 const flex_int16_t yy_accept[368] =
    {   0,
        0,    0,    7,    7,   11,   11,    0,    0,  124,  122,
        1,    2,   42,  122,   37,   28,   29,   34,   30,   23,
       33,  122,   35,  116,  116,   25,  121,   44,  122,  120,
      120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
      120,  120,  120,  120,  120,  120,   83,   84,  120,   26,
       27,   40,   36,   43,  122,    7,    4,    5,    7,   11,
        8,   12,   10,   19,   14,   20,   14,   21,   16,   16,
       15,    1,    2,   41,    0,    0,   31,  117,   60,   60,
       60,   60,   60,   60,   60,   60,   60,   60,   60,   22,
      121,    0,  116,    0,    0,   24,  121,   39,   38,  120,

      120,  120,  120,  120,  120,  120,   63,  120,  120,  120,
      120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
       85,  120,  120,  120,  120,  120,  120,  102,  120,  120,
      120,  101,  120,  120,    0,    7,    4,    5,    6,   11,
        8,   12,    9,   19,   14,   20,   14,    0,   13,   16,
       19,   19,    0,    3,    0,   60,   60,   60,   60,   59,
       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
      119,  118,  120,  120,  120,  120,  120,  120,  120,   68,
       87,   61,  120,  120,   67,  120,  120,   70,  120,  120,
      106,   73,   88,   64,   77,  120,  120,  120,  120,  120,

       94,  120,  120,  120,   69,  120,  120,  120,  120,  120,
      120,  120,  120,    0,    6,   18,   17,   60,   60,   60,
       60,   60,   60,   58,   60,   60,   57,   60,   60,   60,
      114,  120,  120,   86,   78,  120,  120,  120,  112,  120,
       98,  120,  120,   81,  120,   79,  120,   80,   99,  120,
       66,   65,  120,  120,  120,  120,  120,   74,  120,  120,
      120,  120,  100,   62,  107,    0,   60,   60,   55,   60,
       60,   60,   60,   60,   60,   48,   47,   90,   95,  120,
      120,  120,  120,  120,  120,  120,  120,  120,  120,  113,
      120,  120,  120,  120,  120,  120,  120,  104,  103,    0,

       60,   60,   60,   60,   60,   60,   60,   60,   60,  120,
       92,   97,  115,  120,   96,  120,  120,   71,  105,  108,
      109,  110,  120,  120,   89,  111,   32,   60,   49,   60,
       60,   51,   60,   60,   60,   60,   93,   91,  120,   82,
       75,  120,   60,   60,   60,   60,   45,   60,   60,   72,
       76,   60,   52,   60,   60,   50,   60,   54,   60,   60,
       60,   56,   60,   60,   53,   46,    0
    } ;

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

       63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
       73,   74,   75,   76,   77,   78,   79,   80,   81,   82,
       83,   84,   85,   86,   87,   88,    1,    1,    1,    1,
        1,    1,    1,    1,    1,   89,    1,    1,    1,    1,
        1,    1,    1,    1,    1,   90,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,   91,    1,    1,    1,    1,
        1,    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 const YY_CHAR yy_meta[92] =
    {   0,
        1,    2,    3,    1,    1,    2,    4,    1,    1,    1,
        5,    1,    1,    1,    1,    1,    6,    6,    6,    6,
        6,    6,    6,    1,    1,    1,    2,    1,    6,    6,
        6,    6,    6,    6,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    1,    1,    1,    7,    6,    6,
        6,    6,    6,    6,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    1,    1,    1,    1,    1,    1,
        1

    } ;

static const flex_int16_t yy_base[380] =
    {   0,
        0,    0,   90,   96,  102,  105,  108,  130,  867,  868,
      113,  863,  832,  116,  868,  868,  868,  868,  868,  868,
      838,  141,   85,  211,  122,  827,    0,  821,  817,   75,
       98,  126,    0,  115,  183,  201,  195,  204,  209,  206,
      209,  213,  254,  227,  188,  213,    0,    0,  213,  868,
      868,  868,  868,  868,  749,    0,  117,  826,  736,    0,
      293,  819,  771,    0,  297,  783,  298,  774,  290,  312,
      868,  312,  776,  868,  320,  321,  868,  326,    0,  214,
      263,  290,  295,  309,  296,  305,  315,  322,  310,  868,
        0,  356,  375,  105,    0,  868,    0,  868,  868,    0,

      292,  298,  325,  347,  350,  366,    0,  356,  356,  359,
      370,  365,  358,  357,  384,  371,  379,  365,  369,  368,
        0,  376,  386,  420,  381,  387,  759,  389,  376,  393,
      397,  427,  390,  390,  685,    0,  358,  770,  361,    0,
      362,  768,  868,    0,  468,  766,  472,  522,  482,  464,
      138,  487,  473,  491,  492,    0,  416,  435,  466,    0,
      460,  461,  475,  465,  471,  472,  474,  491,  478,  496,
      286,    0,  483,  496,  500,  500,  490,  493,  486,    0,
        0,  492,  489,  489,    0,  491,  500,    0,  531,  522,
        0,  534,  539,    0,  541,  524,  535,  538,  543,  545,

        0,  545,  298,  545,    0,  550,  536,  548,  553,  538,
      537,  543,  550,  388,  592,  446,    0,  564,  560,  555,
      564,  420,  565,    0,  389,  571,    0,  574,  588,  578,
        0,  585,  580,    0,    0,  587,  592,  596,    0,  605,
        0,  592,  601,    0,  596,    0,  603,    0,    0,  604,
        0,    0,  609,  595,  419,  398,  610,  599,  596,  613,
      600,  601,    0,    0,    0,  230,  612,  611,    0,  203,
      608,  621,  609,  614,  187,    0,  140,    0,    0,  618,
      627,  638,  642,  653,  638,  645,  645,  661,  645,    0,
      152,  148,  651,  662,  651,  652,  657,    0,    0,   56,

       44,  668,  659,  655,  662,  672,  677,  660,  660,  656,
        0,    0,    0,  672,    0,  684,  668,    0,    0,    0,
        0,    0,  670,  686,    0,    0,  868,  688,    0,  682,
      698,    0,  694,  701,  711,  717,    0,    0,  707,    0,
        0,  703,  715,  705,  706,  708,    0,  710,  713,    0,
        0,  710,    0,  712,  725,    0,  728,    0,  717,  722,
      733,    0,  725,  720,    0,    0,  868,  798,  805,  812,
      819,  826,  828,  835,  842,  849,  856,  858,   89
    } ;

static const flex_int16_t yy_def[380] =
    {   0,
      367,    1,  368,  368,  369,  369,  370,  370,  367,  367,
      367,  367,  367,  371,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  372,  367,  367,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  367,
      367,  367,  367,  367,  367,  374,  374,  367,  374,  375,
      375,  367,  367,  376,  367,  367,  376,  377,  376,  376,
      367,  367,  367,  367,  371,  371,  367,  367,  378,  378,
      378,  378,  378,  378,  378,  378,  378,  378,  378,  367,
      372,  367,  367,  367,  379,  367,  372,  367,  367,  373,

      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  367,  374,  374,  367,  374,  375,
      375,  367,  367,  376,  367,  367,  376,  377,  377,  376,
      376,  376,  371,  371,  371,  378,  378,  378,  378,  378,
      378,  378,  378,  378,  378,  378,  378,  378,  378,  378,
      367,  379,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,

      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  367,  374,  376,  152,  378,  378,  378,
      378,  378,  378,  378,  378,  378,  378,  378,  378,  378,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  367,  378,  378,  378,  378,
      378,  378,  378,  378,  378,  378,  378,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  367,

      378,  378,  378,  378,  378,  378,  378,  378,  378,  373,
      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
      373,  373,  373,  373,  373,  373,  367,  378,  378,  378,
      378,  378,  378,  378,  378,  378,  373,  373,  373,  373,
      373,  373,  378,  378,  378,  378,  378,  378,  378,  373,
      373,  378,  378,  378,  378,  378,  378,  378,  378,  378,
      378,  378,  378,  378,  378,  378,    0,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367
    } ;

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

       91,  328,   59,   61,   62,   61,   61,   62,   61,   65,
       66,   67,   63,   68,   72,   63,   72,   76,  137,   76,
      137,  171,  171,  101,   69,   70,   70,   70,   70,   70,
       70,   65,   66,   67,   71,   68,   92,  102,   93,   93,
       93,   93,   93,   93,   93,  327,   69,   70,   70,   70,
       70,   70,   70,  101,  216,  216,   71,   78,   78,   78,
       78,   78,   78,   78,  321,  103,  104,  102,  320,   79,
       79,   80,   81,   79,   82,   79,   79,   83,   79,   79,
       84,   85,   79,   86,   87,   79,   79,   88,   79,   79,
       79,   89,   79,   79,   79,  103,  104,  309,   79,   79,

       79,   80,   81,   79,   82,   79,   79,   83,   79,   79,
       84,   85,   79,   86,   87,   79,   79,   88,   79,   79,
       79,   89,   79,   79,   79,   92,  105,   93,   93,   93,
       93,   93,   93,   93,  106,  110,  111,  112,  114,  132,
       94,  133,  107,  121,  308,  134,  108,  109,  115,  122,
      117,  113,  118,  157,  116,  119,  105,  120,  123,  129,
      303,  124,   95,  130,  106,  110,  111,  112,  114,  132,
       94,  133,  107,  121,  131,  134,  108,  109,  115,  122,
      117,  113,  118,  157,  116,  119,  125,  120,  123,  129,
      126,  124,   95,  130,  141,  158,  141,  127,  145,  145,

      145,  147,  171,  171,  131,  128,  150,  150,  150,  150,
      150,  150,  150,   72,  255,   72,  125,  256,  300,  151,
      126,  153,  155,  153,  155,  158,  159,  127,  150,  150,
      150,  150,  150,  150,  150,  128,  160,  161,  162,  173,
      174,  152,   78,   78,   78,   78,   78,   78,   78,  151,
      163,  165,  169,  164,  167,  170,  159,  175,  168,  137,
      166,  137,  215,  141,  215,  141,  160,  161,  162,  173,
      174,  152,   78,   78,   78,   78,   78,   78,   78,  176,
      163,  165,  169,  164,  167,  170,  177,  175,  168,   92,
      166,   93,   93,   93,   93,   93,   93,   93,  178,  179,

      180,  181,  182,  183,  154,  154,  184,  185,  186,  176,
      190,  191,  192,  187,  193,  194,  177,  195,  196,  292,
      201,  202,  204,  205,  206,  207,  212,  188,  178,  179,
      180,  181,  182,  183,  189,  213,  184,  185,  186,  291,
      190,  191,  192,  187,  193,  194,  273,  195,  196,  197,
      201,  202,  204,  205,  206,  207,  212,  188,  218,  198,
      208,  209,  216,  216,  189,  213,  199,  200,  219,  145,
      210,  145,  211,  145,  153,  147,  153,  271,  266,  197,
      150,  150,  150,  150,  150,  150,  150,  149,  218,  198,
      208,  209,  153,  155,  153,  155,  199,  200,  219,  220,

      210,  221,  211,  217,  217,  217,  217,  217,  217,  217,
      222,  223,  224,  225,  226,  217,  217,  217,  217,  217,
      217,  227,  228,  229,  230,  231,  232,  149,  233,  220,
      234,  221,  235,  236,  237,  238,  239,  240,  241,  242,
      222,  223,  224,  225,  226,  217,  217,  217,  217,  217,
      217,  227,  228,  229,  230,  231,  232,  154,  233,  243,
      234,  244,  235,  236,  237,  238,  239,  240,  241,  242,
      245,  246,  247,  249,  250,  154,  154,  251,  252,  253,
      254,  257,  258,  259,  260,  261,  262,  248,  263,  243,
      264,  244,  265,  215,  267,  215,  268,  269,  270,  272,

      245,  246,  247,  249,  250,  274,  275,  251,  252,  253,
      254,  257,  258,  259,  260,  261,  262,  248,  263,  276,
      264,  277,  265,  278,  267,  279,  268,  269,  270,  272,
      280,  281,  282,  283,  284,  274,  275,  285,  286,  287,
      288,  289,  290,  293,  296,  294,  297,  298,  299,  276,
      301,  277,  302,  278,  304,  279,  295,  305,  306,  307,
      280,  281,  282,  283,  284,  310,  311,  285,  286,  287,
      288,  289,  290,  293,  296,  294,  297,  298,  299,  312,
      301,  313,  302,  314,  304,  315,  316,  305,  306,  307,
      317,  318,  319,  322,  323,  310,  311,  324,  325,  326,

      329,  330,  331,  332,  333,  334,  335,  336,  337,  312,
      338,  313,  339,  314,  340,  315,  316,  341,  342,  343,
      317,  318,  319,  322,  323,  344,  345,  324,  325,  326,
      329,  330,  331,  332,  333,  334,  335,  336,  337,  346,
      338,  347,  339,  348,  340,  349,  350,  341,  342,  343,
      351,  352,  353,  354,  355,  344,  345,  356,  357,  358,
      359,  360,  361,  362,  363,  364,  365,  366,  146,  346,
      142,  347,  138,  348,  214,  349,  350,  203,   73,  149,
      351,  352,  353,  354,  355,  146,  143,  356,  357,  358,
      359,  360,  361,  362,  363,  364,  365,  366,   56,   56,

       56,   56,   56,   56,   56,   60,   60,   60,   60,   60,
       60,   60,   64,   64,   64,   64,   64,   64,   64,   75,
       75,  142,  139,   75,   75,   75,   97,   97,  138,   97,
       97,   97,   97,  100,  100,  136,  136,  135,  136,  136,
      136,  136,  140,  140,   99,  140,   98,  140,  140,  144,
       96,   77,  144,  144,  144,  144,  148,  148,   74,  148,
      148,  148,  148,  156,  156,   73,  367,    9,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,

      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367
    } ;

static const flex_int16_t yy_chk[960] =
    {   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,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    3,    3,    3,  379,   23,    3,    4,    4,    4,

       23,  301,    4,    5,    5,    5,    6,    6,    6,    7,
        7,    7,    5,    7,   11,    6,   11,   14,   57,   14,
       57,   94,   94,   30,    7,    7,    7,    7,    7,    7,
        7,    8,    8,    8,    7,    8,   25,   31,   25,   25,
       25,   25,   25,   25,   25,  300,    8,    8,    8,    8,
        8,    8,    8,   30,  151,  151,    8,   22,   22,   22,
       22,   22,   22,   22,  292,   32,   34,   31,  291,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   32,   34,  277,   22,   22,

       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   24,   35,   24,   24,   24,
       24,   24,   24,   24,   36,   37,   38,   39,   40,   45,
       24,   46,   36,   42,  275,   49,   36,   36,   40,   42,
       41,   39,   41,   80,   40,   41,   35,   41,   42,   44,
      270,   42,   24,   44,   36,   37,   38,   39,   40,   45,
       24,   46,   36,   42,   44,   49,   36,   36,   40,   42,
       41,   39,   41,   80,   40,   41,   43,   41,   42,   44,
       43,   42,   24,   44,   61,   81,   61,   43,   65,   67,

       65,   67,  171,  171,   44,   43,   69,   69,   69,   69,
       69,   69,   69,   72,  203,   72,   43,  203,  266,   69,
       43,   75,   76,   75,   76,   81,   82,   43,   70,   70,
       70,   70,   70,   70,   70,   43,   83,   84,   85,  101,
      102,   69,   78,   78,   78,   78,   78,   78,   78,   69,
       86,   87,   89,   86,   88,   89,   82,  103,   88,  137,
       87,  137,  139,  141,  139,  141,   83,   84,   85,  101,
      102,   69,   92,   92,   92,   92,   92,   92,   92,  104,
       86,   87,   89,   86,   88,   89,  105,  103,   88,   93,
       87,   93,   93,   93,   93,   93,   93,   93,  106,  106,

      108,  109,  110,  111,   75,   76,  112,  113,  114,  104,
      116,  117,  118,  115,  119,  120,  105,  122,  123,  256,
      125,  126,  128,  129,  130,  131,  133,  115,  106,  106,
      108,  109,  110,  111,  115,  134,  112,  113,  114,  255,
      116,  117,  118,  115,  119,  120,  225,  122,  123,  124,
      125,  126,  128,  129,  130,  131,  133,  115,  157,  124,
      132,  132,  216,  216,  115,  134,  124,  124,  158,  145,
      132,  145,  132,  147,  153,  147,  153,  222,  214,  124,
      150,  150,  150,  150,  150,  150,  150,  149,  157,  124,
      132,  132,  154,  155,  154,  155,  124,  124,  158,  159,

      132,  161,  132,  152,  152,  152,  152,  152,  152,  152,
      162,  163,  164,  165,  166,  152,  152,  152,  152,  152,
      152,  167,  168,  169,  170,  173,  174,  148,  175,  159,
      176,  161,  177,  178,  179,  182,  183,  184,  186,  187,
      162,  163,  164,  165,  166,  152,  152,  152,  152,  152,
      152,  167,  168,  169,  170,  173,  174,  153,  175,  189,
      176,  190,  177,  178,  179,  182,  183,  184,  186,  187,
      192,  193,  195,  196,  197,  154,  155,  198,  199,  200,
      202,  204,  206,  207,  208,  209,  210,  195,  211,  189,
      212,  190,  213,  215,  218,  215,  219,  220,  221,  223,

      192,  193,  195,  196,  197,  226,  228,  198,  199,  200,
      202,  204,  206,  207,  208,  209,  210,  195,  211,  229,
      212,  230,  213,  232,  218,  233,  219,  220,  221,  223,
      236,  237,  238,  240,  242,  226,  228,  243,  245,  247,
      250,  253,  254,  257,  259,  258,  260,  261,  262,  229,
      267,  230,  268,  232,  271,  233,  258,  272,  273,  274,
      236,  237,  238,  240,  242,  280,  281,  243,  245,  247,
      250,  253,  254,  257,  259,  258,  260,  261,  262,  282,
      267,  283,  268,  284,  271,  285,  286,  272,  273,  274,
      287,  288,  289,  293,  294,  280,  281,  295,  296,  297,

      302,  303,  304,  305,  306,  307,  308,  309,  310,  282,
      314,  283,  316,  284,  317,  285,  286,  323,  324,  328,
      287,  288,  289,  293,  294,  330,  331,  295,  296,  297,
      302,  303,  304,  305,  306,  307,  308,  309,  310,  333,
      314,  334,  316,  335,  317,  336,  339,  323,  324,  328,
      342,  343,  344,  345,  346,  330,  331,  348,  349,  352,
      354,  355,  357,  359,  360,  361,  363,  364,  146,  333,
      142,  334,  138,  335,  135,  336,  339,  127,   73,   68,
      342,  343,  344,  345,  346,   66,   63,  348,  349,  352,
      354,  355,  357,  359,  360,  361,  363,  364,  368,  368,

      368,  368,  368,  368,  368,  369,  369,  369,  369,  369,
      369,  369,  370,  370,  370,  370,  370,  370,  370,  371,
      371,   62,   59,  371,  371,  371,  372,  372,   58,  372,
      372,  372,  372,  373,  373,  374,  374,   55,  374,  374,
      374,  374,  375,  375,   29,  375,   28,  375,  375,  376,
       26,   21,  376,  376,  376,  376,  377,  377,   13,  377,
      377,  377,  377,  378,  378,   12,    9,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,

      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367,  367,
      367,  367,  367,  367,  367,  367,  367,  367,  367
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

extern int yy_flex_debug;
int yy_flex_debug = 1;

static const flex_int16_t yy_rule_linenum[123] =
    {   0,
       67,   68,   70,   81,   82,   83,   84,   88,   89,   90,
       91,   92,   96,   97,   98,   99,  100,  101,  102,  103,
      104,  107,  108,  109,  110,  111,  112,  113,  114,  115,
      116,  117,  118,  119,  120,  121,  122,  123,  124,  125,
      126,  127,  128,  129,  131,  132,  133,  134,  135,  136,
      137,  138,  139,  140,  141,  142,  143,  144,  145,  147,
      149,  150,  151,  152,  153,  154,  155,  156,  157,  158,
      160,  162,  163,  164,  165,  166,  167,  168,  169,  171,
      172,  173,  174,  175,  176,  177,  178,  179,  180,  182,
      183,  184,  185,  186,  188,  189,  190,  191,  192,  194,

      195,  196,  197,  198,  199,  201,  202,  204,  205,  206,
      207,  209,  210,  211,  212,  215,  216,  217,  218,  220,
      222,  224
    } ;

/* 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
char *yytext;
#line 1 "tools/pioasm/lexer.ll"
/*
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
#line 8 "tools/pioasm/lexer.ll"
# include <cerrno>
# include <climits>
# include <cstdlib>
# include <cstring>
# include <string>
# include "pio_assembler.h"
# include "parser.hpp"

#ifdef _MSC_VER
#pragma warning(disable : 4996) // fopen
#endif

#line 878 "tools/pioasm/gen/lexer.cpp"
#define YY_NO_INPUT 1
  yy::parser::symbol_type make_INT(const std::string &s, const yy::parser::location_type& loc);
  yy::parser::symbol_type make_FLOAT(const std::string &s, const yy::parser::location_type& loc);
  yy::parser::symbol_type make_HEX(const std::string &s, const yy::parser::location_type& loc);
  yy::parser::symbol_type make_BINARY(const std::string &s, const yy::parser::location_type& loc);
  // Code run each time a pattern is matched.
  # define YY_USER_ACTION  loc.columns (yyleng);

#define INITIAL 0
#define code_block 1
#define c_comment 2
#define lang_opt 3

#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.
 */
/* %if-c-only */
#include <unistd.h>
/* %endif */
/* %if-c++-only */
/* %endif */
#endif

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

/* %if-c-only Reentrant structure and macros (non-C++). */
/* %if-reentrant */
/* %if-c-only */

static int yy_init_globals ( void );

/* %endif */
/* %if-reentrant */
/* %endif */
/* %endif End reentrant structures and macros. */

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

int yylex_destroy ( void );

int yyget_debug ( void );

void yyset_debug ( int debug_flag  );

YY_EXTRA_TYPE yyget_extra ( void );

void yyset_extra ( YY_EXTRA_TYPE user_defined  );

FILE *yyget_in ( void );

void yyset_in  ( FILE * _in_str  );

FILE *yyget_out ( void );

void yyset_out  ( FILE * _out_str  );

			int yyget_leng ( void );

char *yyget_text ( void );

int yyget_lineno ( void );

void yyset_lineno ( int _line_number  );

/* %if-bison-bridge */
/* %endif */

/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

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

/* %not-for-header */
#ifndef YY_NO_UNPUT
    
#endif
/* %ok-for-header */

/* %endif */

#ifndef yytext_ptr
static void yy_flex_strncpy ( char *, const char *, int );
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen ( const char * );
#endif

#ifndef YY_NO_INPUT
/* %if-c-only Standard (non-C++) definition */
/* %not-for-header */
#ifdef __cplusplus
static int yyinput ( void );
#else
static int input ( void );
#endif
/* %ok-for-header */

/* %endif */
#endif

/* %if-c-only */

/* %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
/* %if-c-only Standard (non-C++) definition */
/* 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 */
/* %if-c++-only C++ definition */
/* %endif */
#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) \
/* %% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \ */\
	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		int 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, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(yyin); \
			} \
		}\
\
/* %if-c++-only C++ definition \ */\
/* %endif */

#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
/* %if-c-only */
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
/* %endif */
/* %if-c++-only */
/* %endif */
#endif

/* %if-tables-serialization structures and prototypes */
/* %not-for-header */
/* %ok-for-header */

/* %not-for-header */
/* %tables-yydmap generated elements */
/* %endif */
/* end tables serialization structures and prototypes */

/* %ok-for-header */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1
/* %if-c-only Standard (non-C++) definition */

extern int yylex (void);

#define YY_DECL int yylex (void)
/* %endif */
/* %if-c++-only C++ definition */
/* %endif */
#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

/* %% [6.0] YY_RULE_SETUP definition goes here */
#define YY_RULE_SETUP \
	YY_USER_ACTION

/* %not-for-header */
/** 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;
    
	if ( !(yy_init) )
		{
		(yy_init) = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

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

		if ( ! yyin )
/* %if-c-only */
			yyin = stdin;
/* %endif */
/* %if-c++-only */
/* %endif */

		if ( ! yyout )
/* %if-c-only */
			yyout = stdout;
/* %endif */
/* %if-c++-only */
/* %endif */

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

		yy_load_buffer_state(  );
		}

	{
/* %% [7.0] user's declarations go here */

        std::string code_block_contents;
        yy::location code_block_start;

  // A handy shortcut to the location held by the pio_assembler.
  yy::location& loc = pioasm.location;
  // Code run each time yylex is called.
  loc.step();

	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
		{
/* %% [8.0] yymore()-related code goes here */
		yy_cp = (yy_c_buf_p);

		/* Support of yytext. */
		*yy_cp = (yy_hold_char);

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

/* %% [9.0] code to set up and find next match goes here */
		yy_current_state = (yy_start);
yy_match:
		do
			{
			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
			if ( yy_accept[yy_current_state] )
				{
				(yy_last_accepting_state) = yy_current_state;
				(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 >= 368 )
					yy_c = yy_meta[yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 367 );
		yy_cp = (yy_last_accepting_cpos);
		yy_current_state = (yy_last_accepting_state);

yy_find_action:
/* %% [10.0] code to find the action number goes here */
		yy_act = yy_accept[yy_current_state];

		YY_DO_BEFORE_ACTION;

/* %% [11.0] code for yylineno update goes here */

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

/* %% [12.0] debug code goes here */
		if ( yy_flex_debug )
			{
			if ( yy_act == 0 )
				fprintf( stderr, "--scanner backing up\n" );
			else if ( yy_act < 123 )
				fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
				         (long)yy_rule_linenum[yy_act], yytext );
			else if ( yy_act == 123 )
				fprintf( stderr, "--accepting default rule (\"%s\")\n",
				         yytext );
			else if ( yy_act == 124 )
				fprintf( stderr, "--(end of buffer or a NUL)\n" );
			else
				fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
			}

		switch ( yy_act )
	{ /* beginning of action switch */
/* %% [13.0] actions go here */
			case 0: /* must back up */
			/* undo the effects of YY_DO_BEFORE_ACTION */
			*yy_cp = (yy_hold_char);
			yy_cp = (yy_last_accepting_cpos);
			yy_current_state = (yy_last_accepting_state);
			goto yy_find_action;

case 1:
YY_RULE_SETUP
loc.step();
	YY_BREAK
case 2:
/* rule 2 can match eol */
YY_RULE_SETUP
{ auto loc_newline = loc; loc_newline.end = loc_newline.begin; loc.lines(yyleng); loc.step(); return yy::parser::make_NEWLINE(loc_newline); }
	YY_BREAK
case 3:
YY_RULE_SETUP
{
                                        BEGIN(code_block);
                                        code_block_contents = "";
                                        code_block_start = loc;
                                        std::string tmp(yytext);
                                        tmp = tmp.substr(1, tmp.length() - 2);
                                        tmp = tmp.erase(0, tmp.find_first_not_of(" \t"));
                                        tmp = tmp.erase(tmp.find_last_not_of(" \t") + 1);
                                        return yy::parser::make_CODE_BLOCK_START( tmp, loc);
                                    }
	YY_BREAK

case 4:
YY_RULE_SETUP
loc.step();
	YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
{ auto loc_newline = loc; loc_newline.end = loc_newline.begin; loc.lines(yyleng); loc.step(); }
	YY_BREAK
case 6:
YY_RULE_SETUP
{ BEGIN(INITIAL); auto loc2 = loc; loc2.begin = code_block_start.begin; return yy::parser::make_CODE_BLOCK_CONTENTS(code_block_contents, loc2); }
	YY_BREAK
case 7:
YY_RULE_SETUP
{ code_block_contents += std::string(yytext) + "\n"; }
	YY_BREAK

case 8:
YY_RULE_SETUP
loc.step();
	YY_BREAK
case 9:
YY_RULE_SETUP
{ BEGIN(INITIAL); }
	YY_BREAK
case 10:
YY_RULE_SETUP
{ }
	YY_BREAK
case 11:
YY_RULE_SETUP
{ }
	YY_BREAK
case 12:
/* rule 12 can match eol */
YY_RULE_SETUP
{ auto loc_newline = loc; loc_newline.end = loc_newline.begin; loc.lines(yyleng); loc.step(); }
	YY_BREAK

case 13:
YY_RULE_SETUP
return yy::parser::make_STRING(yytext, loc);
	YY_BREAK
case 14:
YY_RULE_SETUP
loc.step();
	YY_BREAK
case 15:
YY_RULE_SETUP
return yy::parser::make_ASSIGN(loc);
	YY_BREAK
case 16:
YY_RULE_SETUP
return make_INT(yytext, loc);
	YY_BREAK
case 17:
YY_RULE_SETUP
return make_HEX(yytext, loc);
	YY_BREAK
case 18:
YY_RULE_SETUP
return make_BINARY(yytext, loc);
	YY_BREAK
case 19:
YY_RULE_SETUP
return yy::parser::make_NON_WS(yytext, loc);
	YY_BREAK
case 20:
/* rule 20 can match eol */
YY_RULE_SETUP
{ BEGIN(INITIAL); auto loc_newline = loc; loc_newline.end = loc_newline.begin; loc.lines(yyleng); loc.step(); return yy::parser::make_NEWLINE(loc_newline);  }
	YY_BREAK
case 21:
YY_RULE_SETUP
{ throw yy::parser::syntax_error(loc, "invalid character: " + std::string(yytext)); }
	YY_BREAK

case 22:
YY_RULE_SETUP
{ BEGIN(c_comment); }
	YY_BREAK
case 23:
YY_RULE_SETUP
return yy::parser::make_COMMA(loc);
	YY_BREAK
case 24:
YY_RULE_SETUP
return yy::parser::make_REVERSE(loc);
	YY_BREAK
case 25:
YY_RULE_SETUP
return yy::parser::make_COLON(loc);
	YY_BREAK
case 26:
YY_RULE_SETUP
return yy::parser::make_LBRACKET(loc);
	YY_BREAK
case 27:
YY_RULE_SETUP
return yy::parser::make_RBRACKET(loc);
	YY_BREAK
case 28:
YY_RULE_SETUP
return yy::parser::make_LPAREN(loc);
	YY_BREAK
case 29:
YY_RULE_SETUP
return yy::parser::make_RPAREN(loc);
	YY_BREAK
case 30:
YY_RULE_SETUP
return yy::parser::make_PLUS(loc);
	YY_BREAK
case 31:
YY_RULE_SETUP
return yy::parser::make_POST_DECREMENT(loc);
	YY_BREAK
case 32:
YY_RULE_SETUP
return yy::parser::make_POST_DECREMENT(loc);
	YY_BREAK
case 33:
YY_RULE_SETUP
return yy::parser::make_MINUS(loc);
	YY_BREAK
case 34:
YY_RULE_SETUP
return yy::parser::make_MULTIPLY(loc);
	YY_BREAK
case 35:
YY_RULE_SETUP
return yy::parser::make_DIVIDE(loc);
	YY_BREAK
case 36:
YY_RULE_SETUP
return yy::parser::make_OR(loc);
	YY_BREAK
case 37:
YY_RULE_SETUP
return yy::parser::make_AND(loc);
	YY_BREAK
case 38:
YY_RULE_SETUP
return yy::parser::make_SHR(loc);
	YY_BREAK
case 39:
YY_RULE_SETUP
return yy::parser::make_SHL(loc);
	YY_BREAK
case 40:
YY_RULE_SETUP
return yy::parser::make_XOR(loc);
	YY_BREAK
case 41:
YY_RULE_SETUP
return yy::parser::make_NOT_EQUAL(loc);
	YY_BREAK
case 42:
YY_RULE_SETUP
return yy::parser::make_NOT(loc);
	YY_BREAK
case 43:
YY_RULE_SETUP
return yy::parser::make_NOT(loc);
	YY_BREAK
case 44:
YY_RULE_SETUP
return yy::parser::make_LESSTHAN(loc);
	YY_BREAK
case 45:
YY_RULE_SETUP
return yy::parser::make_PROGRAM(loc);
	YY_BREAK
case 46:
YY_RULE_SETUP
return yy::parser::make_WRAP_TARGET(loc);
	YY_BREAK
case 47:
YY_RULE_SETUP
return yy::parser::make_WRAP(loc);
	YY_BREAK
case 48:
YY_RULE_SETUP
return yy::parser::make_WORD(loc);
	YY_BREAK
case 49:
YY_RULE_SETUP
return yy::parser::make_DEFINE(loc);
	YY_BREAK
case 50:
YY_RULE_SETUP
return yy::parser::make_SIDE_SET(loc);
	YY_BREAK
case 51:
YY_RULE_SETUP
return yy::parser::make_ORIGIN(loc);
	YY_BREAK
case 52:
YY_RULE_SETUP
{ BEGIN(lang_opt); return yy::parser::make_LANG_OPT(loc); }
	YY_BREAK
case 53:
YY_RULE_SETUP
return yy::parser::make_PIO_VERSION(loc);
	YY_BREAK
case 54:
YY_RULE_SETUP
return yy::parser::make_CLOCK_DIV(loc);
	YY_BREAK
case 55:
YY_RULE_SETUP
return yy::parser::make_FIFO(loc);
	YY_BREAK
case 56:
YY_RULE_SETUP
return yy::parser::make_MOV_STATUS(loc);
	YY_BREAK
case 57:
YY_RULE_SETUP
return yy::parser::make_DOT_SET(loc);
	YY_BREAK
case 58:
YY_RULE_SETUP
return yy::parser::make_DOT_OUT(loc);
	YY_BREAK
case 59:
YY_RULE_SETUP
return yy::parser::make_DOT_IN(loc);
	YY_BREAK
case 60:
YY_RULE_SETUP
return yy::parser::make_UNKNOWN_DIRECTIVE(yytext, loc);
	YY_BREAK
case 61:
YY_RULE_SETUP
return yy::parser::make_JMP(loc);
	YY_BREAK
case 62:
YY_RULE_SETUP
return yy::parser::make_WAIT(loc);
	YY_BREAK
case 63:
YY_RULE_SETUP
return yy::parser::make_IN(loc);
	YY_BREAK
case 64:
YY_RULE_SETUP
return yy::parser::make_OUT(loc);
	YY_BREAK
case 65:
YY_RULE_SETUP
return yy::parser::make_PUSH(loc);
	YY_BREAK
case 66:
YY_RULE_SETUP
return yy::parser::make_PULL(loc);
	YY_BREAK
case 67:
YY_RULE_SETUP
return yy::parser::make_MOV(loc);
	YY_BREAK
case 68:
YY_RULE_SETUP
return yy::parser::make_IRQ(loc);
	YY_BREAK
case 69:
YY_RULE_SETUP
return yy::parser::make_SET(loc);
	YY_BREAK
case 70:
YY_RULE_SETUP
return yy::parser::make_NOP(loc);
	YY_BREAK
case 71:
YY_RULE_SETUP
return yy::parser::make_PUBLIC(loc);
	YY_BREAK
case 72:
YY_RULE_SETUP
return yy::parser::make_OPTIONAL(loc);
	YY_BREAK
case 73:
YY_RULE_SETUP
return yy::parser::make_OPTIONAL(loc);
	YY_BREAK
case 74:
YY_RULE_SETUP
return yy::parser::make_SIDE(loc);
	YY_BREAK
case 75:
YY_RULE_SETUP
return yy::parser::make_SIDE(loc);
	YY_BREAK
case 76:
YY_RULE_SETUP
return yy::parser::make_SIDE(loc);
	YY_BREAK
case 77:
YY_RULE_SETUP
return yy::parser::make_PIN(loc);
	YY_BREAK
case 78:
YY_RULE_SETUP
return yy::parser::make_GPIO(loc);
	YY_BREAK
case 79:
YY_RULE_SETUP
return yy::parser::make_OSRE(loc);
	YY_BREAK
case 80:
YY_RULE_SETUP
return yy::parser::make_PINS(loc);
	YY_BREAK
case 81:
YY_RULE_SETUP
return yy::parser::make_NULL(loc);
	YY_BREAK
case 82:
YY_RULE_SETUP
return yy::parser::make_PINDIRS(loc);
	YY_BREAK
case 83:
YY_RULE_SETUP
return yy::parser::make_X(loc);
	YY_BREAK
case 84:
YY_RULE_SETUP
return yy::parser::make_Y(loc);
	YY_BREAK
case 85:
YY_RULE_SETUP
return yy::parser::make_PC(loc);
	YY_BREAK
case 86:
YY_RULE_SETUP
return yy::parser::make_EXEC(loc);
	YY_BREAK
case 87:
YY_RULE_SETUP
return yy::parser::make_ISR(loc);
	YY_BREAK
case 88:
YY_RULE_SETUP
return yy::parser::make_OSR(loc);
	YY_BREAK
case 89:
YY_RULE_SETUP
return yy::parser::make_STATUS(loc);
	YY_BREAK
case 90:
YY_RULE_SETUP
return yy::parser::make_BLOCK(loc);
	YY_BREAK
case 91:
YY_RULE_SETUP
return yy::parser::make_NOBLOCK(loc);
	YY_BREAK
case 92:
YY_RULE_SETUP
return yy::parser::make_IFFULL(loc);
	YY_BREAK
case 93:
YY_RULE_SETUP
return yy::parser::make_IFEMPTY(loc);
	YY_BREAK
case 94:
YY_RULE_SETUP
return yy::parser::make_REL(loc);
	YY_BREAK
case 95:
YY_RULE_SETUP
return yy::parser::make_CLEAR(loc);
	YY_BREAK
case 96:
YY_RULE_SETUP
return yy::parser::make_NOWAIT(loc);
	YY_BREAK
case 97:
YY_RULE_SETUP
return yy::parser::make_JMPPIN(loc);
	YY_BREAK
case 98:
YY_RULE_SETUP
return yy::parser::make_NEXT(loc);
	YY_BREAK
case 99:
YY_RULE_SETUP
return yy::parser::make_PREV(loc);
	YY_BREAK
case 100:
YY_RULE_SETUP
return yy::parser::make_TXRX(loc);
	YY_BREAK
case 101:
YY_RULE_SETUP
return yy::parser::make_TX(loc);
	YY_BREAK
case 102:
YY_RULE_SETUP
return yy::parser::make_RX(loc);
	YY_BREAK
case 103:
YY_RULE_SETUP
return yy::parser::make_TXPUT(loc);
	YY_BREAK
case 104:
YY_RULE_SETUP
return yy::parser::make_TXGET(loc);
	YY_BREAK
case 105:
YY_RULE_SETUP
return yy::parser::make_PUTGET(loc);
	YY_BREAK
case 106:
YY_RULE_SETUP
return yy::parser::make_INT(1, loc);
	YY_BREAK
case 107:
YY_RULE_SETUP
return yy::parser::make_INT(0, loc);
	YY_BREAK
case 108:
YY_RULE_SETUP
return yy::parser::make_RP2040(loc);
	YY_BREAK
case 109:
YY_RULE_SETUP
return yy::parser::make_RP2350(loc);
	YY_BREAK
case 110:
YY_RULE_SETUP
return yy::parser::make_RXFIFO(loc);
	YY_BREAK
case 111:
YY_RULE_SETUP
return yy::parser::make_TXFIFO(loc);
	YY_BREAK
case 112:
YY_RULE_SETUP
return yy::parser::make_LEFT(loc);
	YY_BREAK
case 113:
YY_RULE_SETUP
return yy::parser::make_RIGHT(loc);
	YY_BREAK
case 114:
YY_RULE_SETUP
return yy::parser::make_AUTO(loc);
	YY_BREAK
case 115:
YY_RULE_SETUP
return yy::parser::make_MANUAL(loc);
	YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(code_block):
case YY_STATE_EOF(c_comment):
case YY_STATE_EOF(lang_opt):
return yy::parser::make_END(loc);
	YY_BREAK
case 116:
YY_RULE_SETUP
return make_INT(yytext, loc);
	YY_BREAK
case 117:
YY_RULE_SETUP
return make_FLOAT(yytext, loc);
	YY_BREAK
case 118:
YY_RULE_SETUP
return make_HEX(yytext, loc);
	YY_BREAK
case 119:
YY_RULE_SETUP
return make_BINARY(yytext, loc);
	YY_BREAK
case 120:
YY_RULE_SETUP
return yy::parser::make_ID(yytext, loc);
	YY_BREAK
case 121:
YY_RULE_SETUP
{ }
	YY_BREAK
case 122:
YY_RULE_SETUP
{ throw yy::parser::syntax_error(loc, "invalid character: " + std::string(yytext)); }
	YY_BREAK
case 123:
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 - (yytext_ptr)) - 1;

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = (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.
			 */
			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
/* %if-c-only */
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
/* %endif */
/* %if-c++-only */
/* %endif */
			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 ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state(  );

			/* 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 );

			yy_bp = (yytext_ptr) + YY_MORE_ADJ;

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

			else
				{
/* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */
				yy_cp = (yy_last_accepting_cpos);
				yy_current_state = (yy_last_accepting_state);
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer(  ) )
			{
			case EOB_ACT_END_OF_FILE:
				{
				(yy_did_buffer_switch_on_eof) = 0;

				if ( yywrap(  ) )
					{
					/* 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.
					 */
					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! (yy_did_buffer_switch_on_eof) )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				(yy_c_buf_p) =
					(yytext_ptr) + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
				goto yy_match;

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

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (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 */
/* %ok-for-header */

/* %if-c++-only */
/* %not-for-header */
/* %ok-for-header */

/* %endif */

/* 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
 */
/* %if-c-only */
static int yy_get_next_buffer (void)
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = (yytext_ptr);
	int number_to_move, i;
	int ret_val;

	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(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 ( (yy_c_buf_p) - (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) ((yy_c_buf_p) - (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 = (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) ((yy_c_buf_p) - b->yy_ch_buf);

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

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

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

			(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]),
			(yy_n_chars), num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	if ( (yy_n_chars) == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			yyrestart( yyin  );
			}

		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_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 = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
		/* "- 2" to take care of EOB's */
		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
	}

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

	(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 */

/* %if-c-only */
/* %not-for-header */
    static yy_state_type yy_get_previous_state (void)
/* %endif */
/* %if-c++-only */
/* %endif */
{
	yy_state_type yy_current_state;
	char *yy_cp;
    
/* %% [15.0] code to get the start state into yy_current_state goes here */
	yy_current_state = (yy_start);

	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
		{
/* %% [16.0] code to find the next state goes here */
		YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
		if ( yy_accept[yy_current_state] )
			{
			(yy_last_accepting_state) = yy_current_state;
			(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 >= 368 )
				yy_c = yy_meta[yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 );
 */
/* %if-c-only */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
/* %endif */
/* %if-c++-only */
/* %endif */
{
	int yy_is_jam;
    /* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
	char *yy_cp = (yy_c_buf_p);

	YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		(yy_last_accepting_state) = yy_current_state;
		(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 >= 368 )
			yy_c = yy_meta[yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
	yy_is_jam = (yy_current_state == 367);

		return yy_is_jam ? 0 : yy_current_state;
}

#ifndef YY_NO_UNPUT
/* %if-c-only */

/* %endif */
#endif

/* %if-c-only */
#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (void)
#else
    static int input  (void)
#endif

/* %endif */
/* %if-c++-only */
/* %endif */
{
	int c;
    
	*(yy_c_buf_p) = (yy_hold_char);

	if ( *(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 ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			/* This was really a NUL. */
			*(yy_c_buf_p) = '\0';

		else
			{ /* need more input */
			int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
			++(yy_c_buf_p);

			switch ( yy_get_next_buffer(  ) )
				{
				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 );

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( yywrap(  ) )
						return 0;

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

				case EOB_ACT_CONTINUE_SCAN:
					(yy_c_buf_p) = (yytext_ptr) + offset;
					break;
				}
			}
		}

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

/* %% [19.0] update BOL and yylineno */

	return c;
}
/* %if-c-only */
#endif	/* ifndef YY_NO_INPUT */
/* %endif */

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * 
 * @note This function does not reset the start condition to @c INITIAL .
 */
/* %if-c-only */
    void yyrestart  (FILE * input_file )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    
	if ( ! YY_CURRENT_BUFFER ){
        yyensure_buffer_stack ();
		YY_CURRENT_BUFFER_LVALUE =
            yy_create_buffer( yyin, YY_BUF_SIZE );
	}

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

/* %if-c++-only */
/* %endif */

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
/* %if-c-only */
    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    
	/* TODO. We should be able to replace this entire function body
	 * with
	 *		yypop_buffer_state();
	 *		yypush_buffer_state(new_buffer);
     */
	yyensure_buffer_stack ();
	if ( YY_CURRENT_BUFFER == new_buffer )
		return;

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

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	yy_load_buffer_state(  );

	/* 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.
	 */
	(yy_did_buffer_switch_on_eof) = 1;
}

/* %if-c-only */
static void yy_load_buffer_state  (void)
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
/* %if-c-only */
	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
/* %endif */
/* %if-c++-only */
/* %endif */
	(yy_hold_char) = *(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.
 * 
 * @return the allocated buffer state.
 */
/* %if-c-only */
    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
/* %endif */
/* %if-c++-only */
/* %endif */
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
	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( (yy_size_t) (b->yy_buf_size + 2)  );
	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 );

	return b;
}

/* %if-c++-only */
/* %endif */

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * 
 */
/* %if-c-only */
    void yy_delete_buffer (YY_BUFFER_STATE  b )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    
	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  );

	yyfree( (void *) b  );
}

/* 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.
 */
/* %if-c-only */
    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
/* %endif */
/* %if-c++-only */
/* %endif */

{
	int oerrno = errno;
    
	yy_flush_buffer( b );

/* %if-c-only */
	b->yy_input_file = file;
/* %endif */
/* %if-c++-only */
/* %endif */
	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;
    }

/* %if-c-only */

        b->yy_is_interactive = 0;
    
/* %endif */
/* %if-c++-only */
/* %endif */
	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.
 * 
 */
/* %if-c-only */
    void yy_flush_buffer (YY_BUFFER_STATE  b )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	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(  );
}

/* %if-c-or-c++ */
/** 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.
 *  
 */
/* %if-c-only */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	if (new_buffer == NULL)
		return;

	yyensure_buffer_stack();

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

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

	/* copied from yy_switch_to_buffer. */
	yy_load_buffer_state(  );
	(yy_did_buffer_switch_on_eof) = 1;
}
/* %endif */

/* %if-c-or-c++ */
/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  
 */
/* %if-c-only */
void yypop_buffer_state (void)
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	if (!YY_CURRENT_BUFFER)
		return;

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

	if (YY_CURRENT_BUFFER) {
		yy_load_buffer_state(  );
		(yy_did_buffer_switch_on_eof) = 1;
	}
}
/* %endif */

/* %if-c-or-c++ */
/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
/* %if-c-only */
static void yyensure_buffer_stack (void)
/* %endif */
/* %if-c++-only */
/* %endif */
{
	yy_size_t num_to_alloc;
    
	if (!(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... */
		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));

		(yy_buffer_stack_max) = num_to_alloc;
		(yy_buffer_stack_top) = 0;
		return;
	}

	if ((yy_buffer_stack_top) >= ((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 = (yy_buffer_stack_max) + grow_size;
		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
								((yy_buffer_stack),
								num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

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

/* %if-c-only */
/** 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
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
{
	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) yyalloc( sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );

	b->yy_buf_size = (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 = 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;

	yy_switch_to_buffer( b  );

	return b;
}
/* %endif */

/* %if-c-only */
/** 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
 * 
 * @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 (const char * yystr )
{
    
	return yy_scan_bytes( yystr, (int) strlen(yystr) );
}
/* %endif */

/* %if-c-only */
/** 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.
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = (yy_size_t) (_yybytes_len + 2);
	buf = (char *) yyalloc( n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

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

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

	b = yy_scan_buffer( buf, n );
	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;
}
/* %endif */

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

/* %if-c-only */
static void yynoreturn yy_fatal_error (const char* msg )
{
			fprintf( stderr, "%s\n", msg );
	exit( YY_EXIT_FAILURE );
}
/* %endif */
/* %if-c++-only */
/* %endif */

/* 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] = (yy_hold_char); \
		(yy_c_buf_p) = yytext + yyless_macro_arg; \
		(yy_hold_char) = *(yy_c_buf_p); \
		*(yy_c_buf_p) = '\0'; \
		yyleng = yyless_macro_arg; \
		} \
	while ( 0 )

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

/* %if-c-only */
/* %if-reentrant */
/* %endif */

/** Get the current line number.
 * 
 */
int yyget_lineno  (void)
{
    
    return yylineno;
}

/** Get the input stream.
 * 
 */
FILE *yyget_in  (void)
{
        return yyin;
}

/** Get the output stream.
 * 
 */
FILE *yyget_out  (void)
{
        return yyout;
}

/** Get the length of the current token.
 * 
 */
int yyget_leng  (void)
{
        return yyleng;
}

/** Get the current token.
 * 
 */

char *yyget_text  (void)
{
        return yytext;
}

/* %if-reentrant */
/* %endif */

/** Set the current line number.
 * @param _line_number line number
 * 
 */
void yyset_lineno (int  _line_number )
{
    
    yylineno = _line_number;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param _in_str A readable stream.
 * 
 * @see yy_switch_to_buffer
 */
void yyset_in (FILE *  _in_str )
{
        yyin = _in_str ;
}

void yyset_out (FILE *  _out_str )
{
        yyout = _out_str ;
}

int yyget_debug  (void)
{
        return yy_flex_debug;
}

void yyset_debug (int  _bdebug )
{
        yy_flex_debug = _bdebug ;
}

/* %endif */

/* %if-reentrant */
/* %if-bison-bridge */
/* %endif */
/* %endif if-c-only */

/* %if-c-only */
static int yy_init_globals (void)
{
        /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from yylex_destroy(), so don't allocate here.
     */

    (yy_buffer_stack) = NULL;
    (yy_buffer_stack_top) = 0;
    (yy_buffer_stack_max) = 0;
    (yy_c_buf_p) = NULL;
    (yy_init) = 0;
    (yy_start) = 0;

/* 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
     * yylex_init()
     */
    return 0;
}
/* %endif */

/* %if-c-only SNIP! this currently causes conflicts with the c++ scanner */
/* yylex_destroy is for both reentrant and non-reentrant scanners. */
int yylex_destroy  (void)
{
    
    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		yy_delete_buffer( YY_CURRENT_BUFFER  );
		YY_CURRENT_BUFFER_LVALUE = NULL;
		yypop_buffer_state();
	}

	/* Destroy the stack itself. */
	yyfree((yy_buffer_stack) );
	(yy_buffer_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( );

/* %if-reentrant */
/* %endif */
    return 0;
}
/* %endif */

/*
 * Internal utility routines.
 */

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

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

	return n;
}
#endif

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

void *yyrealloc  (void * ptr, yy_size_t  size )
{
		
	/* 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 yyfree (void * ptr )
{
			free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
}

/* %if-tables-serialization definitions */
/* %define-yytables   The name for this specific scanner's tables. */
/* %endif */

/* %ok-for-header */

yy::parser::symbol_type make_INT(const std::string &s, const yy::parser::location_type& loc)
{
  errno = 0;
  long n = strtol (s.c_str(), NULL, 10);
  if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
    throw yy::parser::syntax_error (loc, "integer is out of range: " + s);
  return yy::parser::make_INT((int) n, loc);
}

yy::parser::symbol_type make_FLOAT(const std::string &s, const yy::parser::location_type& loc)
{
  errno = 0;
  float n = strtof (s.c_str(), NULL);
  return yy::parser::make_FLOAT(n, loc);
}

yy::parser::symbol_type make_HEX(const std::string &s, const yy::parser::location_type& loc)
{
  errno = 0;
  long n = strtol (s.c_str() + 2, NULL, 16);
  if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
    throw yy::parser::syntax_error (loc, "hex is out of range: " + s);
  return yy::parser::make_INT((int) n, loc);
}

yy::parser::symbol_type make_BINARY(const std::string &s, const yy::parser::location_type& loc)
{
  errno = 0;
  long n = strtol (s.c_str()+2, NULL, 2);
  if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
    throw yy::parser::syntax_error (loc, "binary is out of range: " + s);
  return yy::parser::make_INT((int) n, loc);
}

void pio_assembler::scan_begin ()
{
  yy_flex_debug = false;
  if (source.empty () || source == "-")
    yyin = stdin;
  else if (!(yyin = fopen (source.c_str (), "r")))
    {
      std::cerr << "cannot open " << source << ": " << strerror(errno) << '\n';
      exit (EXIT_FAILURE);
    }
}

void pio_assembler::scan_end ()
{
  fclose (yyin);
}

