#line 2 "scan-code.c"

#line 4 "scan-code.c"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

/* %not-for-header */

/* %if-c-only */
/* %if-not-reentrant */
#define yy_create_buffer code__create_buffer
#define yy_delete_buffer code__delete_buffer
#define yy_flex_debug code__flex_debug
#define yy_init_buffer code__init_buffer
#define yy_flush_buffer code__flush_buffer
#define yy_load_buffer_state code__load_buffer_state
#define yy_switch_to_buffer code__switch_to_buffer
#define yyin code_in
#define yyleng code_leng
#define yylex code_lex
#define yylineno code_lineno
#define yyout code_out
#define yyrestart code_restart
#define yytext code_text
#define yywrap code_wrap
#define yyalloc code_alloc
#define yyrealloc code_realloc
#define yyfree code_free

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

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 37
#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. */

/* %if-c-or-c++ */
/* 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 */

/* %endif */

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

#ifdef __cplusplus

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

#else	/* ! __cplusplus */

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

#define YY_USE_CONST

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

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

/* %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 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)
/* %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 code_restart(code_in  )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#endif

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

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

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

/* %if-not-reentrant */
extern yy_size_t code_leng;
/* %endif */

/* %if-c-only */
/* %if-not-reentrant */
extern FILE *code_in, *code_out;
/* %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)
    
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up code_text. */ \
        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 code_text 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.
	 */
	yy_size_t yy_buf_size;

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

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

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

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

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

	int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via code_restart()), so that the user can continue scanning by
	 * just pointing code_in 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 = 0; /**< 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 code_text is formed. */
static char yy_hold_char;
static yy_size_t yy_n_chars;		/* number of characters read into yy_ch_buf */
yy_size_t code_leng;

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

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

/* %endif */

void code_restart (FILE *input_file  );
void code__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
YY_BUFFER_STATE code__create_buffer (FILE *file,int size  );
void code__delete_buffer (YY_BUFFER_STATE b  );
void code__flush_buffer (YY_BUFFER_STATE b  );
void code_push_buffer_state (YY_BUFFER_STATE new_buffer  );
void code_pop_buffer_state (void );

static void code_ensure_buffer_stack (void );
static void code__load_buffer_state (void );
static void code__init_buffer (YY_BUFFER_STATE b,FILE *file  );

#define YY_FLUSH_BUFFER code__flush_buffer(YY_CURRENT_BUFFER )

YY_BUFFER_STATE code__scan_buffer (char *base,yy_size_t size  );
YY_BUFFER_STATE code__scan_string (yyconst char *yy_str  );
YY_BUFFER_STATE code__scan_bytes (yyconst char *bytes,yy_size_t len  );

/* %endif */

void *code_alloc (yy_size_t  );
void *code_realloc (void *,yy_size_t  );
void code_free (void *  );

#define yy_new_buffer code__create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        code_ensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            code__create_buffer(code_in,YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}

#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        code_ensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            code__create_buffer(code_in,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] code_text/code_in/code_out/yy_state_type/code_lineno etc. def's & init go here */
/* Begin user sect3 */

#define code_wrap() 1
#define YY_SKIP_YYWRAP

#define FLEX_DEBUG

typedef unsigned char YY_CHAR;

FILE *code_in = (FILE *) 0, *code_out = (FILE *) 0;

typedef int yy_state_type;

extern int code_lineno;

int code_lineno = 1;

extern char *code_text;
#define yytext_ptr code_text

/* %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 yy_fatal_error (yyconst char msg[]  );

/* %endif */

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up code_text.
 */
#define YY_DO_BEFORE_ACTION \
	(yytext_ptr) = yy_bp; \
/* %% [2.0] code to fiddle code_text and code_leng for yymore() goes here \ */\
	code_leng = (size_t) (yy_cp - yy_bp); \
	(yy_hold_char) = *yy_cp; \
	*yy_cp = '\0'; \
/* %% [3.0] code to copy yytext_ptr to code_text[] 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 29
#define YY_END_OF_BUFFER 30
/* 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[101] =
    {   0,
        0,    0,    0,    0,    3,    3,    4,    4,    4,    4,
       19,   19,    0,    0,   30,   28,   27,   28,    2,   28,
        6,   28,    5,   24,   21,   20,   20,    8,   18,   11,
        7,   24,   15,   11,   23,   23,   12,   24,   16,   17,
        8,   11,    7,   28,   11,   12,    1,    0,    0,    3,
        4,    4,    4,    4,   13,    0,   13,   13,    0,    0,
        9,   10,    0,   14,    0,   14,   14,    0,   23,   23,
        0,   19,   25,    0,   26,    0,    0,    0,    0,    0,
        0,    0,   13,    0,    0,    0,    0,   14,    0,   23,
        0,    0,    0,    0,    0,   23,    0,   23,   22,    0

    } ;

static yyconst flex_int32_t yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        4,    2,    5,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    1,    6,    7,    8,    1,    1,    9,    1,
        1,   10,    1,    1,   11,   12,   13,   14,   14,   14,
       14,   14,   14,   14,   14,   14,   14,    1,   15,   16,
        1,   17,    1,   18,   19,   20,   20,   20,   20,   21,
       20,   20,   22,   20,   20,   23,   20,   20,   20,   20,
       20,   20,   20,   20,   20,   20,   20,   20,   24,   20,
       25,   26,   27,    1,   20,    1,   20,   20,   20,   20,

       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
       20,   20,   28,    1,   29,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

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

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

static yyconst flex_int16_t yy_base[113] =
    {   0,
        0,    1,   21,   41,   66,    0,    4,    8,   12,   14,
       93,    0,  118,    0,  242,  243,  243,    7,  243,    0,
      243,   39,  243,  243,  243,  243,  243,  243,  243,  138,
      243,   34,  243,   42,    0,  217,  243,   33,  243,  243,
      243,    8,  243,   44,  232,  243,  243,   59,   69,  213,
      243,   73,  212,   76,  243,  223,    0,  222,    0,    0,
      243,  243,   79,  243,  205,    0,  202,    0,    0,  188,
       83,  175,  243,    0,  243,   86,   19,  126,  130,  135,
      138,  122,    0,  151,  140,  162,  143,    0,  128,  132,
      168,  130,  128,  108,   37,   36,   47,   29,    0,  243,

      172,  180,  186,  188,  192,  199,  203,  207,  210,  217,
      222,  227
    } ;

static yyconst flex_int16_t yy_def[113] =
    {   0,
      101,  101,  101,  101,  101,    5,    5,    5,    5,    5,
      100,   11,  101,   13,  100,  100,  100,  100,  100,  100,
      100,  102,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100,  103,  104,  104,  100,  100,  100,  100,
      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100,  100,  100,  100,  105,  100,  106,  107,
      100,  100,  100,  100,  100,  108,  100,  109,  104,  104,
      100,  100,  100,  110,  100,  100,  100,  100,  100,  100,
      100,  102,  105,  106,  111,  100,  100,  108,  112,  104,
      100,  110,   30,  111,  112,  104,  100,  104,  104,    0,

      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100
    } ;

static yyconst flex_int16_t yy_nxt[274] =
    {   0,
      100,   49,   50,   49,  100,  100,   16,   17,   17,   21,
       16,  100,  100,   21,   16,   73,   16,   17,   17,   47,
       23,  100,   23,   74,   17,   17,   17,   17,   17,   22,
       18,   47,   48,   22,   71,   72,   71,   22,   17,   22,
       52,   53,   52,   61,   48,   17,   62,   17,   17,   64,
       18,   99,   65,   61,   73,   67,   62,   98,   17,   63,
       76,   77,   76,   64,   54,   17,   68,   17,   19,   63,
       49,   50,   49,   17,   79,   53,   79,   81,   82,   81,
       86,   87,   86,   17,   71,   72,   71,   76,   77,   76,
       17,   20,   17,   24,   25,   26,   24,   27,   28,   29,

       30,   31,   24,   24,   24,   32,   24,   33,   24,   24,
       34,   35,   35,   35,   35,   35,   36,   37,   38,   37,
       39,   40,   24,   41,  100,   42,   43,   49,   50,   49,
       44,   79,   53,   79,   55,   45,   79,   53,   79,   81,
       82,   81,   46,  100,   46,   55,   97,   54,   56,   57,
       96,   58,   61,   59,   64,   62,   57,   57,   57,   57,
       57,   57,   60,   86,   87,   86,   55,   93,   63,   71,
       72,   71,   16,   16,   16,   16,   16,   16,   16,   16,
       51,   51,   51,   51,   51,   51,   51,   51,   66,   66,
       66,   66,   66,   69,   69,   83,   83,   83,   83,   84,

       91,   84,   84,   84,   84,   84,   84,   85,   90,   85,
       88,   88,   88,   88,   89,   67,   89,   92,   67,   92,
       92,   92,   92,   92,   92,   94,   94,   94,   94,   94,
       95,   95,   95,   95,   95,   58,   58,   80,   78,   75,
       70,  100,   15,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100
    } ;

static yyconst flex_int16_t yy_chk[274] =
    {   0,
        0,   20,   20,   20,    0,    0,    7,    1,    2,    7,
        8,    0,    0,    8,    9,   42,   10,    1,    2,   18,
        9,    0,   10,   42,    1,    2,    1,    2,    3,    7,
        3,   77,   18,    8,   38,   38,   38,    9,    3,   10,
       22,   22,   22,   32,   77,    3,   32,    3,    4,   34,
        4,   98,   34,   44,   97,   34,   44,   96,    4,   32,
       48,   48,   48,   95,   22,    4,   34,    4,    5,   44,
       49,   49,   49,    5,   52,   52,   52,   54,   54,   54,
       63,   63,   63,    5,   71,   71,   71,   76,   76,   76,
        5,    5,    5,   11,   11,   11,   11,   11,   11,   11,

       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
       11,   11,   11,   13,   82,   13,   13,   78,   78,   78,
       13,   79,   79,   79,   94,   13,   80,   80,   80,   81,
       81,   81,   13,   93,   13,   30,   92,   82,   30,   30,
       90,   30,   87,   30,   89,   87,   30,   30,   30,   30,
       30,   30,   30,   86,   86,   86,   85,   84,   87,   91,
       91,   91,  101,  101,  101,  101,  101,  101,  101,  101,
      102,  102,  102,  102,  102,  102,  102,  102,  103,  103,
      103,  103,  103,  104,  104,  105,  105,  105,  105,  106,

       72,  106,  106,  106,  106,  106,  106,  107,   70,  107,
      108,  108,  108,  108,  109,   67,  109,  110,   65,  110,
      110,  110,  110,  110,  110,  111,  111,  111,  111,  111,
      112,  112,  112,  112,  112,   58,   56,   53,   50,   45,
       36,   15,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      100,  100,  100
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

extern int code__flex_debug;
int code__flex_debug = 1;

static yyconst flex_int16_t yy_rule_linenum[29] =
    {   0,
      132,  142,  143,  153,  158,  163,  169,  174,  179,  183,
      187,  192,  200,  207,  215,  216,  217,  244,  246,  247,
      248,  252,  260,  262,  267,  275,  285,  288
    } ;

/* 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 *code_text;
#line 1 "scan-code.l"
/* Bison Action Scanner                             -*- C -*-

   Copyright (C) 2006-2012 Free Software Foundation, Inc.

   This file is part of Bison, the GNU Compiler Compiler.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
#define YY_NO_INPUT 1
#line 24 "scan-code.l"
/* Work around a bug in flex 2.5.31.  See Debian bug 333231
   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
#undef code_wrap
#define code_wrap() 1

#define FLEX_PREFIX(Id) code_ ## Id
#include "flex-scanner.h"

#include "complain.h"
#include "reader.h"
#include "getargs.h"
#include "scan-code.h"
#include "symlist.h"

#include <c-ctype.h>
#include <get-errno.h>
#include <quote.h>

/* The current calling start condition: SC_RULE_ACTION or
   SC_SYMBOL_ACTION. */
# define YY_DECL static char *code_lex (code_props *self, int sc_context)
YY_DECL;

#define YY_USER_ACTION  location_compute (loc, &loc->end, code_text, code_leng);

static char *fetch_type_name (char *cp, char const **type_name,
                              location dollar_loc);

static void handle_action_dollar (symbol_list *rule, char *cp,
				  location dollar_loc);
static void handle_action_at (symbol_list *rule, char *cp, location at_loc);

/* A string to be pushed to obstack after dollar/at has been handled. */
static char *ref_tail_fields;

static location the_location;
static location *loc = &the_location;

/* A string representing the most recent translation.  */
static char *last_string;

/* True if an untyped $$ or $n was seen.  */
static bool untyped_var_seen;

/* C and C++ comments in code. */

/* Strings and characters in code. */

/* Whether in a rule or symbol action.  Specifies the translation
of $ and @.  */

/* POSIX says that a tag must be both an id and a C union member, but
   historically almost any character is allowed in a tag.  We disallow
   NUL and newline, as this simplifies our implementation.  */
/* Zero or more instances of backslash-newline.  Following GCC, allow
   white space between the backslash and the newline.  */
/* C style identifier. Must start with letter. Will be used for
   named symbol references. Shall be kept synchronized with
   scan-gram.l "letter" and "id". */
#line 735 "scan-code.c"

#define INITIAL 0
#define SC_COMMENT 1
#define SC_LINE_COMMENT 2
#define SC_STRING 3
#define SC_CHARACTER 4
#define SC_RULE_ACTION 5
#define SC_SYMBOL_ACTION 6

#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 code_lex_destroy (void );

int code_get_debug (void );

void code_set_debug (int debug_flag  );

YY_EXTRA_TYPE code_get_extra (void );

void code_set_extra (YY_EXTRA_TYPE user_defined  );

FILE *code_get_in (void );

void code_set_in  (FILE * in_str  );

FILE *code_get_out (void );

void code_set_out  (FILE * out_str  );

yy_size_t code_get_leng (void );

char *code_get_text (void );

int code_get_lineno (void );

void code_set_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 code_wrap (void );
#else
extern int code_wrap (void );
#endif
#endif

/* %not-for-header */

/* %ok-for-header */

/* %endif */

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

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst 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
#define YY_READ_BUF_SIZE 8192
#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( code_text, code_leng, 1, code_out )) {} } 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 = '*'; \
		size_t n; \
		for ( n = 0; n < max_size && \
			     (c = getc( code_in )) != EOF && c != '\n'; ++n ) \
			buf[n] = (char) c; \
		if ( c == '\n' ) \
			buf[n++] = (char) c; \
		if ( c == EOF && ferror( code_in ) ) \
			YY_FATAL_ERROR( "input in flex scanner failed" ); \
		result = n; \
		} \
	else \
		{ \
		errno=0; \
		while ( (result = fread(buf, 1, max_size, code_in))==0 && ferror(code_in)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(code_in); \
			} \
		}\
\
/* %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 code_lex (void);

#define YY_DECL int code_lex (void)
/* %endif */
/* %if-c++-only C++ definition */
/* %endif */
#endif /* !YY_DECL */

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

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

/* %% [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
{
	register yy_state_type yy_current_state;
	register char *yy_cp, *yy_bp;
	register int yy_act;
    
/* %% [7.0] user's declarations go here */
#line 94 "scan-code.l"



  /* Nesting level of the current code in braces.  */
  int braces_level = 0;

  /* Whether a semicolon is probably needed.

     The heuristic is that a semicolon is not needed after '{', '}',
     ';', or a C preprocessor directive, and that whitespaces and
     comments do not affect this flag.  Note that '{' does not need a
     semicolon because of '{}'.  A semicolon may be needed before a
     cpp directive, but don't bother.

     While it is maintained in several start-conditions (factoring
     opportunities), it is meaningful only for SC_RULE_ACTION. */
  bool need_semicolon = false;

  /* Whether in a C preprocessor directive.  Don't use a start condition
     for this because, at the end of strings and comments, we still need
     to know whether we're in a directive.  */
  bool in_cpp = false;

  /* This scanner is special: it is invoked only once, henceforth
     is expected to return only once.  This initialization is
     therefore done once per action to translate. */
  aver (sc_context == SC_SYMBOL_ACTION
	|| sc_context == SC_RULE_ACTION
	|| sc_context == INITIAL);
  BEGIN sc_context;


  /*------------------------------------------------------------.
  | Scanning a C comment.  The initial '/ *' is already eaten.  |
  `------------------------------------------------------------*/

#line 1018 "scan-code.c"

	if ( !(yy_init) )
		{
		(yy_init) = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

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

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

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

		if ( ! YY_CURRENT_BUFFER ) {
			code_ensure_buffer_stack ();
			YY_CURRENT_BUFFER_LVALUE =
				code__create_buffer(code_in,YY_BUF_SIZE );
		}

		code__load_buffer_state( );
		}

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

		/* Support of code_text. */
		*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
			{
			register 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 >= 101 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 100 );
		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 code_lineno update goes here */

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

/* %% [12.0] debug code goes here */
		if ( code__flex_debug )
			{
			if ( yy_act == 0 )
				fprintf( stderr, "--scanner backing up\n" );
			else if ( yy_act < 29 )
				fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
				         (long)yy_rule_linenum[yy_act], code_text );
			else if ( yy_act == 29 )
				fprintf( stderr, "--accepting default rule (\"%s\")\n",
				         code_text );
			else if ( yy_act == 30 )
				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:
/* rule 1 can match eol */
YY_RULE_SETUP
#line 132 "scan-code.l"
STRING_GROW; BEGIN sc_context;
	YY_BREAK

/*--------------------------------------------------------------.
  | Scanning a line comment.  The initial '//' is already eaten.  |
  `--------------------------------------------------------------*/


case 2:
/* rule 2 can match eol */
YY_RULE_SETUP
#line 142 "scan-code.l"
STRING_GROW; BEGIN sc_context;
	YY_BREAK
case 3:
/* rule 3 can match eol */
YY_RULE_SETUP
#line 143 "scan-code.l"
STRING_GROW;
	YY_BREAK

/*--------------------------------------------.
  | Scanning user-code characters and strings.  |
  `--------------------------------------------*/


case 4:
/* rule 4 can match eol */
YY_RULE_SETUP
#line 153 "scan-code.l"
STRING_GROW;
	YY_BREAK



case 5:
YY_RULE_SETUP
#line 158 "scan-code.l"
STRING_GROW; BEGIN sc_context;
	YY_BREAK



case 6:
YY_RULE_SETUP
#line 163 "scan-code.l"
STRING_GROW; BEGIN sc_context;
	YY_BREAK



case 7:
YY_RULE_SETUP
#line 169 "scan-code.l"
{
    STRING_GROW;
    BEGIN SC_CHARACTER;
    need_semicolon = true;
  }
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 174 "scan-code.l"
{
    STRING_GROW;
    BEGIN SC_STRING;
    need_semicolon = true;
  }
	YY_BREAK
case 9:
/* rule 9 can match eol */
YY_RULE_SETUP
#line 179 "scan-code.l"
{
    STRING_GROW;
    BEGIN SC_COMMENT;
  }
	YY_BREAK
case 10:
/* rule 10 can match eol */
YY_RULE_SETUP
#line 183 "scan-code.l"
{
    STRING_GROW;
    BEGIN SC_LINE_COMMENT;
  }
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 187 "scan-code.l"
{
    warn_at (*loc, _("stray '%s'"), code_text);
    obstack_escape (&obstack_for_string, code_text);
    need_semicolon = true;
  }
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 192 "scan-code.l"
{
    obstack_escape (&obstack_for_string, code_text);
    need_semicolon = true;
  }
	YY_BREAK



case 13:
YY_RULE_SETUP
#line 200 "scan-code.l"
{
    ref_tail_fields = NULL;
    handle_action_dollar (self->rule, code_text, *loc);
    if (ref_tail_fields)
      obstack_sgrow (&obstack_for_string, ref_tail_fields);
    need_semicolon = true;
  }
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 207 "scan-code.l"
{
    ref_tail_fields = NULL;
    handle_action_at (self->rule, code_text, *loc);
    if (ref_tail_fields)
      obstack_sgrow (&obstack_for_string, ref_tail_fields);
    need_semicolon = true;
  }
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 215 "scan-code.l"
STRING_GROW;                 need_semicolon = false;
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 216 "scan-code.l"
STRING_GROW; ++braces_level; need_semicolon = false;
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 217 "scan-code.l"
{
    bool outer_brace = --braces_level == 0;

    /* As an undocumented Bison extension, append ';' before the last
       brace in braced code, so that the user code can omit trailing
       ';'.  But do not append ';' if emulating Yacc, since Yacc does
       not append one.  This is deprecated since release 2.4.1.  */
    if (outer_brace && !yacc_flag && language_prio == default_prio
        && skeleton_prio == default_prio && need_semicolon && ! in_cpp)
      {
        unsigned int indent = 0;
        warn_at_indent (*loc, &indent,
                       _("a ';' might be needed at the end of action code"));
        indent += SUB_INDENT;
        warn_at_indent (*loc, &indent,
                       _("future versions of Bison will not add the ';'"));
        obstack_1grow (&obstack_for_string, ';');
      }

    STRING_GROW;
    need_semicolon = false;
  }
	YY_BREAK
/* Preprocessing directives should only be recognized at the beginning
     of lines, allowing whitespace including comments, but in C/C++,
     '#' can only be the start of preprocessor directives or within
     '#define' directives anyway, so don't bother with begin of line.  */
case 18:
YY_RULE_SETUP
#line 244 "scan-code.l"
STRING_GROW; in_cpp = true;
	YY_BREAK
case 19:
/* rule 19 can match eol */
YY_RULE_SETUP
#line 246 "scan-code.l"
STRING_GROW;
	YY_BREAK
case 20:
/* rule 20 can match eol */
YY_RULE_SETUP
#line 247 "scan-code.l"
STRING_GROW; if (in_cpp) in_cpp = need_semicolon = false;
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 248 "scan-code.l"
STRING_GROW;
	YY_BREAK
/* YYFAIL is undocumented and was formally deprecated in Bison
     2.4.2.  */
case 22:
YY_RULE_SETUP
#line 252 "scan-code.l"
{
    STRING_GROW; need_semicolon = true;
    warn_at (*loc, _("use of YYFAIL, which is deprecated and will be"
                     " removed"));
  }
	YY_BREAK
/* The sole purpose of this is to make sure identifiers that merely
     contain YYFAIL don't produce the above warning.  */
case 23:
YY_RULE_SETUP
#line 260 "scan-code.l"
STRING_GROW; need_semicolon = true;
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 262 "scan-code.l"
STRING_GROW; need_semicolon = true;
	YY_BREAK



case 25:
YY_RULE_SETUP
#line 267 "scan-code.l"
{
    const char *type_name = NULL;
    fetch_type_name (code_text + 1, &type_name, *loc)[-1] = 0;
    obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar(");
    obstack_quote (&obstack_for_string, type_name);
    obstack_sgrow (&obstack_for_string, ")[");
    self->is_value_used = true;
  }
	YY_BREAK
case 26:
YY_RULE_SETUP
#line 275 "scan-code.l"
{
    obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
    locations_flag = true;
  }
	YY_BREAK



/* Escape M4 quoting characters in C code.  */
case 27:
YY_RULE_SETUP
#line 285 "scan-code.l"
obstack_escape (&obstack_for_string, code_text);
	YY_BREAK
/* By default, grow the string obstack with the input.  */
case 28:
/* rule 28 can match eol */
YY_RULE_SETUP
#line 288 "scan-code.l"
STRING_GROW;
	YY_BREAK
/* End of processing. */
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(SC_COMMENT):
case YY_STATE_EOF(SC_LINE_COMMENT):
case YY_STATE_EOF(SC_STRING):
case YY_STATE_EOF(SC_CHARACTER):
case YY_STATE_EOF(SC_RULE_ACTION):
case YY_STATE_EOF(SC_SYMBOL_ACTION):
#line 291 "scan-code.l"
STRING_FINISH; return last_string;
	YY_BREAK

case 29:
YY_RULE_SETUP
#line 294 "scan-code.l"
YY_FATAL_ERROR( "flex scanner jammed" );
	YY_BREAK
#line 1402 "scan-code.c"

	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 code_in at a new source and called
			 * code_lex().  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;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = code_in;
			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 ( code_wrap( ) )
					{
					/* Note: because we've taken care in
					 * yy_get_next_buffer() to have set up
					 * code_text, 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 code_lex */
/* %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 */
{
    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	register char *source = (yytext_ptr);
	register 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
		{
			yy_size_t num_to_read =
			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

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

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

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

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

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

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

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

			(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;
			code_restart(code_in  );
			}

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

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

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

	(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 */
{
	register yy_state_type yy_current_state;
	register 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 */
		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 30);
		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 >= 101 )
				yy_c = yy_meta[(unsigned int) yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
		}

	return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
/* %if-c-only */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
/* %endif */
/* %if-c++-only */
/* %endif */
{
	register int yy_is_jam;
    /* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
	register char *yy_cp = (yy_c_buf_p);

	register YY_CHAR yy_c = 30;
	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 >= 101 )
			yy_c = yy_meta[(unsigned int) yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
	yy_is_jam = (yy_current_state == 100);

		return yy_is_jam ? 0 : yy_current_state;
}

/* %if-c-only */

/* %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 */
			yy_size_t offset = (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. */
					code_restart(code_in );

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( code_wrap( ) )
						return EOF;

					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 code_text */
	(yy_hold_char) = *++(yy_c_buf_p);

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

	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 code_restart  (FILE * input_file )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    
	if ( ! YY_CURRENT_BUFFER ){
        code_ensure_buffer_stack ();
		YY_CURRENT_BUFFER_LVALUE =
            code__create_buffer(code_in,YY_BUF_SIZE );
	}

	code__init_buffer(YY_CURRENT_BUFFER,input_file );
	code__load_buffer_state( );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
/* %if-c-only */
    void code__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
	 *		code_pop_buffer_state();
	 *		code_push_buffer_state(new_buffer);
     */
	code_ensure_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;
	code__load_buffer_state( );

	/* We don't actually know whether we did this switch during
	 * EOF (code_wrap()) processing, but the only time this flag
	 * is looked at is after code_wrap() 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 code__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;
	code_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	(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 code__create_buffer  (FILE * file, int  size )
/* %endif */
/* %if-c++-only */
/* %endif */
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) code_alloc(sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in code__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 *) code_alloc(b->yy_buf_size + 2  );
	if ( ! b->yy_ch_buf )
		YY_FATAL_ERROR( "out of dynamic memory in code__create_buffer()" );

	b->yy_is_our_buffer = 1;

	code__init_buffer(b,file );

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with code__create_buffer()
 * 
 */
/* %if-c-only */
    void code__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 )
		code_free((void *) b->yy_ch_buf  );

	code_free((void *) b  );
}

/* Initializes or reinitializes a buffer.
 * This function is sometimes called more than once on the same buffer,
 * such as during a code_restart() or at EOF.
 */
/* %if-c-only */
    static void code__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
/* %endif */
/* %if-c++-only */
/* %endif */

{
	int oerrno = errno;
    
	code__flush_buffer(b );

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

    /* If b is the current buffer, then code__init_buffer was _probably_
     * called from code_restart() 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 code__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 )
		code__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 code_push_buffer_state (YY_BUFFER_STATE new_buffer )
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	if (new_buffer == NULL)
		return;

	code_ensure_buffer_stack();

	/* This block is copied from code__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 code__switch_to_buffer. */
	code__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 code_pop_buffer_state (void)
/* %endif */
/* %if-c++-only */
/* %endif */
{
    	if (!YY_CURRENT_BUFFER)
		return;

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

	if (YY_CURRENT_BUFFER) {
		code__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 code_ensure_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;
		(yy_buffer_stack) = (struct yy_buffer_state**)code_alloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in code_ensure_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. */
		int grow_size = 8 /* arbitrary grow size */;

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

	b = (YY_BUFFER_STATE) code_alloc(sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in code__scan_buffer()" );

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

	code__switch_to_buffer(b  );

	return b;
}
/* %endif */

/* %if-c-only */
/** Setup the input buffer state to scan a string. The next call to code_lex() 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
 *       code__scan_bytes() instead.
 */
YY_BUFFER_STATE code__scan_string (yyconst char * yystr )
{
    
	return code__scan_bytes(yystr,strlen(yystr) );
}
/* %endif */

/* %if-c-only */
/** Setup the input buffer state to scan the given bytes. The next call to code_lex() 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 code__scan_bytes  (yyconst char * yybytes, yy_size_t  _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 = _yybytes_len + 2;
	buf = (char *) code_alloc(n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in code__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 = code__scan_buffer(buf,n );
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in code__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 yy_fatal_error (yyconst char* msg )
{
    	(void) 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 code_text. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		code_text[code_leng] = (yy_hold_char); \
		(yy_c_buf_p) = code_text + yyless_macro_arg; \
		(yy_hold_char) = *(yy_c_buf_p); \
		*(yy_c_buf_p) = '\0'; \
		code_leng = 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 code_get_lineno  (void)
{
        
    return code_lineno;
}

/** Get the input stream.
 * 
 */
FILE *code_get_in  (void)
{
        return code_in;
}

/** Get the output stream.
 * 
 */
FILE *code_get_out  (void)
{
        return code_out;
}

/** Get the length of the current token.
 * 
 */
yy_size_t code_get_leng  (void)
{
        return code_leng;
}

/** Get the current token.
 * 
 */

char *code_get_text  (void)
{
        return code_text;
}

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

/** Set the current line number.
 * @param line_number
 * 
 */
void code_set_lineno (int  line_number )
{
    
    code_lineno = line_number;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param in_str A readable stream.
 * 
 * @see code__switch_to_buffer
 */
void code_set_in (FILE *  in_str )
{
        code_in = in_str ;
}

void code_set_out (FILE *  out_str )
{
        code_out = out_str ;
}

int code_get_debug  (void)
{
        return code__flex_debug;
}

void code_set_debug (int  bdebug )
{
        code__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 code_lex_destroy(), so don't allocate here.
     */

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

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

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

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

	/* Destroy the stack itself. */
	code_free((yy_buffer_stack) );
	(yy_buffer_stack) = NULL;

    /* Reset the globals. This is important in a non-reentrant scanner so the next time
     * code_lex() 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, yyconst char * s2, int n )
{
	register int i;
	for ( i = 0; i < n; ++i )
		s1[i] = s2[i];
}
#endif

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

	return n;
}
#endif

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

void *code_realloc  (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 (void *) realloc( (char *) ptr, size );
}

void code_free (void * ptr )
{
	free( (char *) ptr );	/* see code_realloc() for (char *) cast */
}

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

/* %ok-for-header */

#line 294 "scan-code.l"



static inline bool
is_dot_or_dash (char ch)
{
  return ch == '.' || ch == '-';
}

static inline bool
contains_dot_or_dash (const char* p)
{
  for (; *p; ++p)
    if (is_dot_or_dash (*p))
      return true;
  return false;
}

/* Defines a variant of a symbolic name resolution. */
typedef struct
{
  /* Index in symbol list. */
  unsigned symbol_index;

  /* Matched symbol id and loc. */
  uniqstr id;
  location loc;

  /* Hiding named reference. */
  named_ref* hidden_by;

  /* Error flags. May contain zero (no errors) or
     a combination of VARIANT_* values. */
  unsigned err;
} variant;

/* Set when the variant refers to a symbol hidden
   by an explicit symbol reference. */
#define VARIANT_HIDDEN (1 << 0)

/* Set when the variant refers to a symbol containing
   dots or dashes. Will require explicit bracketing. */
#define VARIANT_BAD_BRACKETING (1 << 1)

/* Set when the variant refers to a symbol which is
   not visible from current midrule. */
#define VARIANT_NOT_VISIBLE_FROM_MIDRULE (1 << 2)

static variant *variant_table = NULL;
static unsigned variant_table_size = 0;
static unsigned variant_count = 0;

static variant *
variant_table_grow (void)
{
  ++variant_count;
  if (variant_count > variant_table_size)
    {
      while (variant_count > variant_table_size)
	variant_table_size = 2 * variant_table_size + 3;
      variant_table = xnrealloc (variant_table, variant_table_size,
				 sizeof *variant_table);
    }
  return &variant_table[variant_count - 1];
}

static void
variant_table_free (void)
{
  free (variant_table);
  variant_table = NULL;
  variant_table_size = variant_count = 0;
}

static char *
find_prefix_end (const char *prefix, char *begin, char *end)
{
  char *ptr = begin;

  for (; *prefix && ptr != end; ++prefix, ++ptr)
    if (*prefix != *ptr)
      return 0;

  if (*prefix)
    return 0;

  return ptr;
}

static variant *
variant_add (uniqstr id, location id_loc, unsigned symbol_index,
	     char *cp, char *cp_end, bool explicit_bracketing)
{
  char *prefix_end;

  prefix_end = find_prefix_end (id, cp, cp_end);
  if (prefix_end &&
      (prefix_end == cp_end ||
       (!explicit_bracketing && is_dot_or_dash (*prefix_end))))
    {
      variant *r = variant_table_grow ();
      r->symbol_index = symbol_index;
      r->id = id;
      r->loc = id_loc;
      r->hidden_by = NULL;
      r->err = 0;
      return r;
    }
  else
    return NULL;
}

static const char *
get_at_spec (unsigned symbol_index)
{
  static char at_buf[20];
  if (symbol_index == 0)
    strcpy (at_buf, "$$");
  else
    snprintf (at_buf, sizeof at_buf, "$%u", symbol_index);
  return at_buf;
}

static void
show_sub_messages (const char* cp, bool explicit_bracketing,
                   int midrule_rhs_index, char dollar_or_at,
                   bool is_warning, unsigned indent)
{
  unsigned i;

  for (i = 0; i < variant_count; ++i)
    {
      const variant *var = &variant_table[i];
      const char *at_spec = get_at_spec (var->symbol_index);

      if (var->err == 0)
        {
          if (is_warning)
            warn_at_indent (var->loc, &indent, _("refers to: %c%s at %s"),
                            dollar_or_at, var->id, at_spec);
          else
            complain_at_indent (var->loc, &indent, _("refers to: %c%s at %s"),
                                dollar_or_at, var->id, at_spec);
        }
      else
	{
	  static struct obstack msg_buf;
	  const char *tail = explicit_bracketing ? "" :
	    cp + strlen (var->id);
	  const char *id = var->hidden_by ? var->hidden_by->id :
	    var->id;
	  location id_loc = var->hidden_by ? var->hidden_by->loc :
	    var->loc;

	  /* Create the explanation message. */
	  obstack_init (&msg_buf);

	  obstack_printf (&msg_buf, _("possibly meant: %c"), dollar_or_at);
	  if (contains_dot_or_dash (id))
	    obstack_printf (&msg_buf, "[%s]", id);
	  else
	    obstack_sgrow (&msg_buf, id);
	  obstack_sgrow (&msg_buf, tail);

	  if (var->err & VARIANT_HIDDEN)
	    {
	      obstack_printf (&msg_buf, _(", hiding %c"), dollar_or_at);
	      if (contains_dot_or_dash (var->id))
		obstack_printf (&msg_buf, "[%s]", var->id);
	      else
		obstack_sgrow (&msg_buf, var->id);
	      obstack_sgrow (&msg_buf, tail);
	    }

	  obstack_printf (&msg_buf, _(" at %s"), at_spec);

	  if (var->err & VARIANT_NOT_VISIBLE_FROM_MIDRULE)
            {
              const char *format =
                _(", cannot be accessed from mid-rule action at $%d");
              obstack_printf (&msg_buf, format, midrule_rhs_index);
            }

	  obstack_1grow (&msg_buf, '\0');
          if (is_warning)
            warn_at_indent (id_loc, &indent, "%s",
                            (char *) obstack_finish (&msg_buf));
          else
            complain_at_indent (id_loc, &indent, "%s",
                                (char *) obstack_finish (&msg_buf));
	  obstack_free (&msg_buf, 0);
	}
    }
}

/* Returned from "parse_ref" when the reference
   is inappropriate. */
#define INVALID_REF (INT_MIN)

/* Returned from "parse_ref" when the reference
   points to LHS ($$) of the current rule or midrule. */
#define LHS_REF (INT_MIN + 1)

/* Parse named or positional reference. In case of positional
   references, can return negative values for $-n "deep" stack
   accesses. */
static long int
parse_ref (char *cp, symbol_list *rule, int rule_length,
	   int midrule_rhs_index, char *text, location text_loc,
	   char dollar_or_at)
{
  symbol_list *l;
  char *cp_end;
  bool explicit_bracketing;
  unsigned i;
  unsigned valid_variants = 0;
  unsigned valid_variant_index = 0;

  if ('$' == *cp)
    return LHS_REF;

  if (c_isdigit (*cp) || (*cp == '-' && c_isdigit (* (cp + 1))))
    {
      long int num = strtol (cp, &cp, 10);
      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
	return num;
      else
	{
	  complain_at (text_loc, _("integer out of range: %s"),
                       quote (text));
	  return INVALID_REF;
	}
    }

  if ('[' == *cp)
    {
      /* Ignore the brackets. */
      char *p;
      for (p = ++cp; *p != ']'; ++p)
	continue;
      cp_end = p;

      explicit_bracketing = true;
    }
  else
    {
      /* Take all characters of the name. */
      char* p;
      for (p = cp; *p; ++p)
	if (is_dot_or_dash (*p))
	  {
	    ref_tail_fields = p;
	    break;
	  }
      for (p = cp; *p; ++p)
	continue;
      cp_end = p;

      explicit_bracketing = false;
    }

  /* Add all relevant variants. */
  {
    unsigned symbol_index;
    variant_count = 0;
    for (symbol_index = 0, l = rule; !symbol_list_null (l);
         ++symbol_index, l = l->next)
      {
	variant *var;
	if (l->content_type != SYMLIST_SYMBOL)
	  continue;

	var = variant_add (l->content.sym->tag, l->sym_loc,
                           symbol_index, cp, cp_end, explicit_bracketing);
	if (var && l->named_ref)
	  var->hidden_by = l->named_ref;

	if (l->named_ref)
	  variant_add (l->named_ref->id, l->named_ref->loc,
                       symbol_index, cp, cp_end, explicit_bracketing);
      }
  }

  /* Check errors. */
  for (i = 0; i < variant_count; ++i)
    {
      variant *var = &variant_table[i];
      unsigned symbol_index = var->symbol_index;

      /* Check visibility from mid-rule actions. */
      if (midrule_rhs_index != 0
	  && (symbol_index == 0 || midrule_rhs_index < symbol_index))
        var->err |= VARIANT_NOT_VISIBLE_FROM_MIDRULE;

      /* Check correct bracketing. */
      if (!explicit_bracketing && contains_dot_or_dash (var->id))
        var->err |= VARIANT_BAD_BRACKETING;

      /* Check using of hidden symbols. */
      if (var->hidden_by)
        var->err |= VARIANT_HIDDEN;

      if (!var->err)
        {
          valid_variant_index = i;
          ++valid_variants;
        }
    }

  switch (valid_variants)
    {
    case 0:
      {
        unsigned len = (explicit_bracketing || !ref_tail_fields) ?
          cp_end - cp : ref_tail_fields - cp;
        unsigned indent = 0;

        complain_at_indent (text_loc, &indent, _("invalid reference: %s"),
                            quote (text));
        indent += SUB_INDENT;
        if (len == 0)
          {
            location sym_loc = text_loc;
            sym_loc.start.column += 1;
            sym_loc.end = sym_loc.start;
            const char *format =
              _("syntax error after '%c', expecting integer, letter,"
                " '_', '[', or '$'");
            complain_at_indent (sym_loc, &indent, format, dollar_or_at);
          }
        else if (midrule_rhs_index)
          {
            const char *format =
              _("symbol not found in production before $%d: %.*s");
            complain_at_indent (rule->location, &indent, format,
                                midrule_rhs_index, len, cp);
          }
        else
          {
            const char *format =
              _("symbol not found in production: %.*s");
            complain_at_indent (rule->location, &indent, format,
                                len, cp);
          }

        if (variant_count > 0)
          show_sub_messages (cp, explicit_bracketing, midrule_rhs_index,
                             dollar_or_at, false, indent);
        return INVALID_REF;
      }
    case 1:
      {
        unsigned indent = 0;
        if (variant_count > 1)
          {
            warn_at_indent (text_loc, &indent, _("misleading reference: %s"),
                            quote (text));
            show_sub_messages (cp, explicit_bracketing, midrule_rhs_index,
                               dollar_or_at, true, indent + SUB_INDENT);
          }
        {
          unsigned symbol_index =
            variant_table[valid_variant_index].symbol_index;
          return (symbol_index == midrule_rhs_index) ? LHS_REF : symbol_index;
        }
      }
    case 2:
    default:
      {
        unsigned indent = 0;
        complain_at_indent (text_loc, &indent, _("ambiguous reference: %s"),
                            quote (text));
        show_sub_messages (cp, explicit_bracketing, midrule_rhs_index,
                           dollar_or_at, false, indent + SUB_INDENT);
        return INVALID_REF;
      }
    }

  /* Not reachable. */
  return INVALID_REF;
}

/* Keeps track of the maximum number of semantic values to the left of
   a handle (those referenced by $0, $-1, etc.) are required by the
   semantic actions of this grammar. */
int max_left_semantic_context = 0;


/* If CP points to a typename (i.e., <.*?>), set TYPE_NAME to its
   beginning (i.e., after the opening "<", and return the pointer
   immediately after it.  */

static
char *
fetch_type_name (char *cp, char const **type_name,
                 location dollar_loc)
{
  if (*cp == '<')
    {
      *type_name = ++cp;
      while (*cp != '>')
	++cp;

      /* The '>' symbol will be later replaced by '\0'. Original
	 'text' is needed for error messages. */
      ++cp;
      if (untyped_var_seen)
	complain_at (dollar_loc, _("explicit type given in untyped grammar"));
      tag_seen = true;
    }
  return cp;
}

/*------------------------------------------------------------------.
| TEXT is pointing to a wannabee semantic value (i.e., a '$').      |
|                                                                   |
| Possible inputs: $[<TYPENAME>]($|integer)                         |
|                                                                   |
| Output to OBSTACK_FOR_STRING a reference to this semantic value.  |
`------------------------------------------------------------------*/

static void
handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
{
  char const *type_name = NULL;
  char *cp = text + 1;
  symbol_list *effective_rule;
  int effective_rule_length;
  int n;

  if (rule->midrule_parent_rule)
    {
      effective_rule = rule->midrule_parent_rule;
      effective_rule_length = rule->midrule_parent_rhs_index - 1;
    }
  else
    {
      effective_rule = rule;
      effective_rule_length = symbol_list_length (rule->next);
    }

  /* Get the type name if explicit. */
  cp = fetch_type_name (cp, &type_name, dollar_loc);

  n = parse_ref (cp, effective_rule, effective_rule_length,
		 rule->midrule_parent_rhs_index, text, dollar_loc, '$');

  /* End type_name. */
  if (type_name)
    cp[-1] = '\0';

  switch (n)
    {
    case INVALID_REF:
      break;

    case LHS_REF:
      if (!type_name)
	type_name = symbol_list_n_type_name_get (rule, dollar_loc, 0);

      if (!type_name)
        {
          if (union_seen | tag_seen)
            {
              if (rule->midrule_parent_rule)
                complain_at (dollar_loc,
                             _("$$ for the midrule at $%d of %s"
                               " has no declared type"),
                             rule->midrule_parent_rhs_index,
                             quote (effective_rule->content.sym->tag));
              else
                complain_at (dollar_loc, _("$$ of %s has no declared type"),
                             quote (rule->content.sym->tag));
            }
          else
            untyped_var_seen = true;
        }

      obstack_sgrow (&obstack_for_string, "]b4_lhs_value(");
      obstack_quote (&obstack_for_string, type_name);
      obstack_sgrow (&obstack_for_string, ")[");
      rule->action_props.is_value_used = true;
      break;

    default:
      if (max_left_semantic_context < 1 - n)
	max_left_semantic_context = 1 - n;
      if (!type_name && 0 < n)
	type_name =
	  symbol_list_n_type_name_get (effective_rule, dollar_loc, n);
      if (!type_name)
        {
          if (union_seen | tag_seen)
            complain_at (dollar_loc, _("$%s of %s has no declared type"),
                         cp, quote (effective_rule->content.sym->tag));
          else
            untyped_var_seen = true;
        }

      obstack_printf (&obstack_for_string,
		      "]b4_rhs_value(%d, %d, ", effective_rule_length, n);
      obstack_quote (&obstack_for_string, type_name);
      obstack_sgrow (&obstack_for_string, ")[");
      if (n > 0)
	symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
	  true;
      break;
    }
}


/*------------------------------------------------------.
| TEXT is a location token (i.e., a '@...').  Output to |
| OBSTACK_FOR_STRING a reference to this location.      |
`------------------------------------------------------*/

static void
handle_action_at (symbol_list *rule, char *text, location at_loc)
{
  char *cp = text + 1;
  symbol_list *effective_rule;
  int effective_rule_length;
  int n;

  if (rule->midrule_parent_rule)
    {
      effective_rule = rule->midrule_parent_rule;
      effective_rule_length = rule->midrule_parent_rhs_index - 1;
    }
  else
    {
      effective_rule = rule;
      effective_rule_length = symbol_list_length (rule->next);
    }

  locations_flag = true;

  n = parse_ref (cp, effective_rule, effective_rule_length,
                 rule->midrule_parent_rhs_index, text, at_loc, '@');
  switch (n)
    {
    case INVALID_REF:
      break;

    case LHS_REF:
      obstack_sgrow (&obstack_for_string, "]b4_lhs_location[");
      break;

    default:
      obstack_printf (&obstack_for_string, "]b4_rhs_location(%d, %d)[",
		      effective_rule_length, n);
      break;
    }
}


/*-------------------------.
| Initialize the scanner.  |
`-------------------------*/

/* Translate the dollars and ats in \a self, in the context \a sc_context
   (SC_RULE_ACTION, SC_SYMBOL_ACTION, INITIAL).  */

static char const *
translate_action (code_props *self, int sc_context)
{
  char *res;
  static bool initialized = false;
  if (!initialized)
    {
      obstack_init (&obstack_for_string);
      code__flex_debug = 0;
      initialized = true;
    }

  loc->start = loc->end = self->location.start;
  code__switch_to_buffer (code__scan_string (self->code));
  res = code_lex (self, sc_context);
  code__delete_buffer (YY_CURRENT_BUFFER);

  return res;
}

/*------------------------------------------------------------------------.
| Implementation of the public interface as documented in "scan-code.h".  |
`------------------------------------------------------------------------*/

void
code_props_none_init (code_props *self)
{
  *self = code_props_none;
}

code_props const code_props_none = CODE_PROPS_NONE_INIT;

void
code_props_plain_init (code_props *self, char const *code,
		       location code_loc)
{
  self->kind = CODE_PROPS_PLAIN;
  self->code = code;
  self->location = code_loc;
  self->is_value_used = false;
  self->rule = NULL;
  self->named_ref = NULL;
}

void
code_props_symbol_action_init (code_props *self, char const *code,
                               location code_loc)
{
  self->kind = CODE_PROPS_SYMBOL_ACTION;
  self->code = code;
  self->location = code_loc;
  self->is_value_used = false;
  self->rule = NULL;
  self->named_ref = NULL;
}

void
code_props_rule_action_init (code_props *self, char const *code,
                             location code_loc, symbol_list *rule,
			     named_ref *name)
{
  self->kind = CODE_PROPS_RULE_ACTION;
  self->code = code;
  self->location = code_loc;
  self->is_value_used = false;
  self->rule = rule;
  self->named_ref = name;
}

void
code_props_translate_code (code_props *self)
{
  switch (self->kind)
    {
      case CODE_PROPS_NONE:
        break;
      case CODE_PROPS_PLAIN:
        self->code = translate_action (self, INITIAL);
        break;
      case CODE_PROPS_SYMBOL_ACTION:
        self->code = translate_action (self, SC_SYMBOL_ACTION);
        break;
      case CODE_PROPS_RULE_ACTION:
        self->code = translate_action (self, SC_RULE_ACTION);
        break;
    }
}

void
code_scanner_last_string_free (void)
{
  STRING_FREE;
}

void
code_scanner_free (void)
{
  obstack_free (&obstack_for_string, 0);
  variant_table_free ();

  /* Reclaim Flex's buffers.  */
  code_lex_destroy ();
}

