

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 31
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

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

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

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

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

#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
#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;
#endif /* ! C99 */

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

#ifdef __cplusplus

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

#else	/* ! __cplusplus */

#if __STDC__

#define YY_USE_CONST

#endif	/* __STDC__ */
#endif	/* ! __cplusplus */

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

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

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

/* 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
#define YY_BUF_SIZE 16384
#endif

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

extern int yyleng;

extern FILE *yyin, *yyout;

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

    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
     *       access to the local variable yy_act. Since yyless() is a macro, it would break
     *       existing scanners that call yyless() from OUTSIDE yylex. 
     *       One obvious solution it to make yy_act a global. I tried that, and saw
     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
     *       normally declared as a register variable-- so it is not worth it.
     */
    #define  YY_LESS_LINENO(n) \
            do { \
                int yyl;\
                for ( yyl = n; yyl < yyleng; ++yyl )\
                    if ( yytext[yyl] == '\n' )\
                        --yylineno;\
            }while(0)
    
/* 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)  )

/* The following is because we cannot portably get our hands on size_t
 * (without autoconf's help, which isn't available because we want
 * flex-generated scanners to compile on their own).
 */

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef unsigned int yy_size_t;
#endif

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

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

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

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	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 */

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

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

/* 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 = (char *) 0;
static int yy_init = 1;		/* 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;

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 (yyconst char *yy_str  );
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );

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)

/* Begin user sect3 */

#define yywrap(n) 1
#define YY_SKIP_YYWRAP

typedef unsigned char YY_CHAR;

FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;

typedef int yy_state_type;

#define YY_FLEX_LEX_COMPAT
extern int yylineno;

int yylineno = 1;

extern char yytext[];

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[]  );

/* 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; \
	yyleng = (size_t) (yy_cp - yy_bp); \
	(yy_hold_char) = *yy_cp; \
	*yy_cp = '\0'; \
	if ( yyleng + (yy_more_offset) >= YYLMAX ) \
		YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \
	yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \
	yyleng += (yy_more_offset); \
	(yy_prev_more_offset) = (yy_more_offset); \
	(yy_more_offset) = 0; \
	(yy_c_buf_p) = yy_cp;

#define YY_NUM_RULES 93
#define YY_END_OF_BUFFER 94
/* 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_acclist[414] =
    {   0,
       42,   42,   82,   82,   94,   81,   93,   93,    1,   81,
       93,    1,   93,   54,   81,   93,   81,   93,   81,   93,
       55,   81,   93,   81,   93,   81,   93,   81,   93,   23,
       81,   93,   81,   93,   45,   81,   93,   45,   81,   93,
       45,   81,   93,   45,   81,   93,   45,   81,   93,   45,
       81,   93,   45,   81,   93,   45,   81,   93,   45,   81,
       93,   45,   81,   93,   45,   81,   93,   45,   81,   93,
       45,   81,   93,   81,   93,   13,   81,   93,   13,   93,
       13,   81,   93,   11,   81,   93,   12,   93,   10,   81,
       93,   46,   81,   93,   51,   93,   50,   81,   93,   58,

       81,   93,   59,   81,   93,   57,   81,   93,   46,   81,
       93,   56,   81,   93,   60,   81,   93,   52,   81,   93,
       61,   81,   93,   62,   81,   93,   63,   81,   93,   52,
       81,   93,   67,   81,   93,   65,   81,   93,   52,   81,
       93,   76,   81,   93,   76,   81,   93,   51,   93,   73,
       81,   93,   77,   81,   93,   75,   81,   93,   70,   81,
       93,   75,   81,   93,   42,   81,   93,   42,   93,   43,
       81,   93,   43,   81,   93,   43,   81,   93,   81,   93,
       43,   81,   93,   43,   81,   93,   43,   81,   93,   43,
       81,   93,   43,   81,   93,   43,   81,   93,   43,   81,

       93,   43,   81,   93,   44,   81,   93,   81,   93,   43,
       81,   93,   44,   81,   93,   44,   81,   93,   43,   81,
       93,   92,   93,   82,   92,   93,   83,   93,   92,   93,
       92,   93,   92,   93,   92,   93,   47,   48,   49,   23,
       20,   17,   19,   41,   45,   45,   45,   45,   45,   45,
       45,   45,   45,   45,   45,   45,   45,   45,    9,   14,
       10,   46,   16,   46,   18,   46,   53,   62,   64,   67,
       66,   76,   76,   68,   73,   71,   72,   16,   18,   75,
       69,   75,   42,   43,   43,   43,   43,   44,   44,   44,
       82,   40,   45,   45,   45,   45,   45,   45,   45,   45,

       45,   45,   45,   45,   45,    9,   14,   15,   75,   44,
       43,   44,   26,   45,   45,   45,   45,   24,   45,   45,
       45,   45,   45,   45,   45,   45,   45,   75,   44,   30,
       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
       45,   38,   39,   35,   36,   75,   44,   43,   45,   28,
       45,   45,   45,   45,   25,   45,   45,   45,   45,   45,
        4,    2,   75,   43,   44,   22,   45,   45,   45,   45,
       29,   45,   45,   33,   45,   45,   37,    8,   75,   84,
       34,   45,   21,   45,   27,   45,   32,   45,   31,   45,
       75,   43,   85,    5,    3,    7,   78,   75,   75,   87,

       86,   75,   88,   75,16458,   91,    6,16458,   80, 8266,
       89,   90,   79
    } ;

static yyconst flex_int16_t yy_accept[439] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    2,    3,    4,
        5,    6,    8,    9,   12,   14,   17,   19,   21,   24,
       26,   28,   30,   33,   35,   38,   41,   44,   47,   50,
       53,   56,   59,   62,   65,   68,   71,   74,   76,   79,
       81,   84,   87,   89,   92,   95,   97,  100,  103,  106,
      109,  112,  115,  118,  121,  124,  127,  130,  133,  136,
      139,  142,  145,  148,  150,  153,  156,  159,  162,  165,
      168,  170,  173,  176,  179,  181,  184,  187,  190,  193,
      196,  199,  202,  205,  208,  210,  213,  216,  219,  222,

      224,  227,  229,  231,  233,  235,  237,  238,  239,  240,
      240,  240,  241,  242,  242,  243,  244,  245,  246,  247,
      248,  249,  250,  251,  252,  253,  254,  255,  256,  257,
      258,  259,  259,  259,  259,  259,  259,  259,  259,  259,
      259,  259,  260,  261,  261,  262,  263,  265,  267,  268,
      269,  270,  271,  272,  273,  274,  274,  274,  275,  276,
      277,  278,  279,  280,  281,  282,  283,  284,  285,  286,
      287,  288,  289,  290,  291,  292,  292,  292,  292,  292,
      292,  292,  293,  294,  295,  296,  297,  298,  299,  300,
      301,  302,  303,  304,  305,  306,  306,  306,  306,  306,

      306,  306,  306,  306,  306,  306,  307,  308,  308,  309,
      309,  309,  309,  309,  309,  310,  311,  313,  313,  313,
      313,  313,  313,  313,  315,  316,  317,  318,  320,  321,
      322,  323,  324,  325,  326,  327,  328,  328,  328,  328,
      328,  328,  328,  328,  328,  328,  328,  328,  328,  328,
      328,  329,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  332,  333,  334,  335,  336,  337,
      338,  339,  340,  341,  342,  343,  344,  345,  346,  346,
      346,  346,  346,  346,  346,  346,  346,  346,  346,  347,
      348,  349,  349,  349,  349,  349,  349,  349,  349,  349,

      349,  349,  350,  352,  353,  354,  355,  357,  358,  359,
      360,  361,  361,  361,  361,  362,  362,  363,  363,  363,
      363,  363,  364,  366,  366,  366,  366,  366,  366,  366,
      366,  366,  366,  366,  368,  369,  370,  371,  373,  374,
      376,  377,  377,  378,  379,  379,  379,  379,  379,  379,
      380,  380,  380,  380,  380,  380,  380,  380,  380,  381,
      381,  381,  383,  385,  387,  389,  391,  391,  391,  391,
      391,  391,  391,  391,  392,  393,  394,  394,  394,  394,
      394,  394,  394,  395,  396,  397,  397,  397,  398,  398,
      398,  399,  399,  399,  399,  399,  399,  399,  399,  399,

      399,  399,  400,  400,  400,  401,  402,  402,  402,  402,
      402,  402,  402,  402,  403,  403,  404,  404,  404,  404,
      404,  404,  404,  404,  406,  406,  406,  407,  408,  409,
      409,  409,  410,  411,  412,  413,  414,  414
    } ;

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

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

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    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[72] =
    {   0,
        1,    1,    2,    1,    1,    3,    4,    1,    1,    5,
        6,    6,    1,    1,    6,    1,    1,    7,    8,    1,
        6,    1,    1,    1,    9,    9,    9,    9,    9,    9,
        9,    9,    9,    9,    9,    9,    9,    9,    9,    6,
        2,    6,    1,    9,    9,    9,    9,    9,    9,    9,
        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
        9,    9,    9,    9,    9,    9,    9,    7,    1,    7,
        1
    } ;

static yyconst flex_int16_t yy_base[453] =
    {   0,
      846,  845,    0,  839,  843,   69,   77,    0,  146,  186,
      159,  165,  167,  169,  228,    0,  299,    0,  148,  157,
      845,  850,  850,  850,  850,  850,  155,   13,  850,  154,
      827,  162,  824,  822,    0,  778,  782,  790,  772,  784,
      777,  775,  785,  771,  765,  774,  123,  326,  850,  850,
      114,  850,  850,    0,    0,  850,  811,  850,  850,  850,
      172,  850,  850,  788,  850,    0,  850,  369,    0,  850,
      153,    0,  374,  388,  376,  198,    0,  787,  777,  217,
      394,  803,  802,  146,  812,  800,  189,  850,  377,  799,
       52,  798,  356,    0,  778,  796,  769,  768,  362,  850,

      814,  850,  757,  758,  764,  745,  792,  850,  850,  746,
      745,  789,  850,  790,  850,  850,  850,    0,  744,  748,
      754,  741,  741,  752,  742,  748,  753,  738,  735,  735,
      739,  731,  747,  729,  728,  744,  739,  728,  722,  723,
      720,  781,  780,  400,    0,    0,    0,    0,  850,    0,
      850,    0,  850,    0,  402,  405,  731,  850,  761,  850,
      850,  386,  850,    0,  850,  717,  409,  850,  765,  754,
      753,    0,  720,  709,  771,  756,  726,  725,  708,  715,
      714,  850,  708,  704,  719,  714,  700,  701,  696,  706,
      696,  708,  703,  693,  709,  691,  691,  693,  692,  692,

      692,  685,  693,  687,  691,  741,  740,  414,  850,  679,
      419,  709,  706,  700,  688,  687,  695,  376,  674,  679,
      670,  682,  681,    0,  667,  665,  667,    0,  681,  672,
      663,  670,  674,  670,  657,  657,  658,  668,  656,  655,
      663,  667,  659,  662,  650,  660,  659,  673,  669,  671,
      644,  641,  660,  640,  655,  639,  649,  640,  634,  679,
      627,  628,  627,    0,  636,  633,  627,  640,  625,  639,
      636,  627,  638,  629,  850,  850,  850,  850,  618,  631,
      621,  613,  632,  611,  615,  637,  638,  638,  621,  621,
      850,  618,  607,  614,  601,  606,  648,  604,  603,  597,

      596,  597,    0,  600,  608,  607,    0,  605,  605,  598,
      597,  606,  590,  592,  584,  596,  582,  595,  605,  614,
      607,  583,  600,  586,  586,  580,  576,  590,  575,  575,
      583,  586,  573,    0,  556,  567,  554,    0,  565,    0,
      558,  553,  850,  850,  547,  537,  189,  565,  560,  528,
      545,  528,  460,  459,  467,  459,  460,  464,  850,  456,
      455,    0,    0,    0,    0,    0,  465,  466,  452,  412,
      493,  483,  473,  459,  850,  850,  462,  458,  443,  443,
      450,  445,  850,  850,  850,  446,  451,  850,  469,  458,
      448,  446,  433,  441,  440,  431,  425,  441,  440,  455,

      164,  436,  427,  419,  850,  850,  418,  425,  393,  406,
      424,  418,  430,  393,  393,  850,  385,  366,  363,  347,
      425,  427,  199,  455,  138,  135,  850,  850,    0,  428,
      136,  850,  850,  850,  850,  850,  850,  526,  535,  544,
      553,  562,  571,  573,  575,  584,  593,  602,  611,  612,
      614,  623
    } ;

static yyconst flex_int16_t yy_def[453] =
    {   0,
      438,  438,  437,    3,  439,  439,  437,    7,  440,  440,
      441,  441,  442,  442,  437,   15,  437,   17,  443,  443,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  444,  444,  444,  444,  444,  444,
      444,  444,  444,  444,  444,  444,  444,  437,  437,  437,
      437,  437,  437,  445,  446,  437,  437,  437,  437,  437,
      446,  437,  437,  437,  437,  447,  437,  437,  448,  437,
      437,  449,  449,  437,  437,  437,  450,  437,  450,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  451,  437,  437,  451,  451,  437,  437,

      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  444,  444,  444,
      444,  444,  444,  444,  444,  444,  444,  444,  444,  444,
      444,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  445,  446,  446,  446,  437,  447,
      437,  448,  437,  449,  449,  437,  437,  437,  437,  437,
      437,  437,  437,  450,  437,  450,  437,  437,  437,  437,
      437,  451,  451,  451,  437,  437,  437,  437,  437,  437,
      437,  437,  444,  444,  444,  444,  444,  444,  444,  444,
      444,  444,  444,  444,  444,  437,  437,  437,  437,  437,

      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  450,  451,  451,  437,  437,  437,
      437,  437,  437,  444,  444,  444,  444,  444,  444,  444,
      444,  444,  444,  444,  444,  444,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      450,  451,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  444,  444,  444,  444,  444,  444,  444,
      444,  444,  444,  444,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  450,  451,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,

      437,  444,  444,  444,  444,  444,  444,  444,  444,  444,
      444,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  450,  451,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  444,  444,  444,  444,  444,  444,  444,
      444,  437,  437,  437,  437,  437,  437,  437,  437,  450,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  444,  444,  444,  444,  444,  437,  437,  437,  437,
      437,  437,  437,  450,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      450,  437,  437,  437,  437,  437,  437,  437,  437,  437,

      437,  450,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  450,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  450,  437,  437,  437,  437,  452,  437,
      437,  437,  437,  437,  437,  437,    0,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437
    } ;

static yyconst flex_int16_t yy_nxt[922] =
    {   0,
       22,   24,   25,   24,   22,   26,   27,   28,   22,   29,
       22,   22,   22,   22,   22,   30,   31,   32,   33,   34,
       22,   22,   22,   22,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   22,
       22,   22,   22,   35,   36,   35,   37,   38,   39,   35,
       35,   35,   35,   35,   40,   35,   35,   41,   42,   43,
       44,   45,   46,   47,   35,   35,   35,   22,   22,   22,
       22,   50,  110,  170,  168,  111,   51,   22,   52,   53,
       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
       22,   22,   22,   22,   32,   22,   22,   22,   22,   22,

       22,   54,   54,   54,   54,   54,   54,   54,   54,   54,
       54,   54,   54,   54,   54,   54,   22,   22,   22,   22,
       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
       54,   54,   54,   54,   22,   22,   22,   22,   56,  101,
      102,   26,   57,  436,  168,   29,   58,   59,  101,  102,
       60,   56,  153,   61,   67,  412,   62,   56,  168,   56,
       67,   56,  112,  107,  115,  130,   70,  113,   70,  116,
      131,  143,  413,  144,  147,   63,   64,   65,   56,  148,
      370,   26,   57,  149,  435,   29,   58,   59,  434,   68,

       60,  371,  168,   61,  103,   68,   62,   71,  104,   71,
      162,  168,  105,  103,  106,  163,  432,  104,  167,  167,
      167,  105,  108,  106,  109,   63,   64,   65,   72,   73,
       74,   73,   72,   26,   75,   72,   72,   29,   72,   72,
       72,   72,   72,   72,   72,   76,   72,   72,   72,   72,
       72,   72,   77,   77,   77,   77,   77,   77,   77,   77,
       77,   77,   77,   77,   77,   77,   77,   72,   78,   72,
       72,   77,   79,   77,   77,   77,   77,   77,   77,   77,
       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
       77,   77,   77,   77,   77,   22,   72,   22,   72,   22,

       80,   81,   80,   82,   22,   22,   83,   84,   22,   85,
       22,   86,   87,   88,   89,   22,   90,   22,   22,   22,
       91,   92,   93,   94,   94,   94,   94,   94,   94,   94,
       94,   94,   94,   94,   94,   94,   94,   94,   95,   22,
       22,   96,   94,   94,   94,   94,   97,   94,   94,   94,
       94,   94,   94,   94,   94,   98,   94,   94,   94,   94,
       94,   94,   94,   94,   94,   94,   22,   99,   22,   88,
      132,  133,  134,  135,  151,  155,  156,  155,  168,  171,
      136,  137,  158,  138,  168,  139,  140,  211,  141,  156,
      156,  156,  168,  142,  159,  167,  167,  167,  429,  168,

      169,  208,  209,  155,  156,  155,  156,  156,  156,  149,
      167,  167,  167,  370,  212,  208,  209,  213,  157,  412,
      211,  214,  254,  428,  371,  427,  430,  255,  422,  430,
      168,  422,  157,  426,  256,  257,  413,  431,  258,  423,
      431,  425,  423,  160,  424,  161,  157,  212,  413,  157,
      213,  421,  420,  419,  214,  433,  433,  433,  433,  433,
      433,  433,  433,  433,  433,  433,  433,  433,  433,  433,
      433,  433,  433,  418,  433,  433,  433,  433,  433,  417,
      416,  415,  414,  411,  410,  409,  408,  407,  406,  405,
      404,  403,  402,  401,  433,  433,  433,  433,  400,  399,

      398,  397,  396,  395,  394,  393,  392,  391,  390,  389,
      388,  387,  386,  385,  384,  383,  382,  381,  380,  379,
      378,  377,  433,  433,  433,  433,   22,   22,   22,   22,
       22,   22,   22,   22,   22,   49,   49,   49,   49,   49,
       49,   49,   49,   49,   55,   55,   55,   55,   55,   55,
       55,   55,   55,   66,   66,   66,   66,   66,   66,   66,
       66,   66,   69,   69,   69,   69,   69,   69,   69,   69,
       69,  100,  100,  100,  100,  100,  100,  100,  100,  100,
      118,  118,  145,  145,  146,  376,  375,  374,  373,  372,
      146,  146,  146,  150,  369,  368,  150,  150,  150,  150,

      150,  150,  152,  367,  152,  152,  366,  152,  152,  152,
      152,  154,  365,  364,  363,  362,  154,  361,  154,  164,
      164,  172,  172,  433,  433,  433,  433,  433,  433,  433,
      360,  359,  358,  357,  356,  355,  354,  353,  352,  351,
      350,  349,  348,  347,  346,  333,  345,  332,  344,  343,
      342,  341,  340,  339,  338,  337,  336,  335,  334,  333,
      332,  331,  330,  329,  328,  327,  326,  325,  324,  323,
      322,  321,  320,  319,  318,  317,  316,  315,  314,  313,
      312,  311,  310,  309,  308,  307,  306,  305,  304,  303,
      302,  301,  300,  299,  298,  297,  296,  295,  294,  293,

      292,  291,  290,  289,  288,  287,  286,  285,  284,  283,
      282,  281,  280,  279,  278,  277,  276,  275,  274,  273,
      272,  271,  270,  269,  268,  267,  266,  265,  264,  263,
      262,  261,  260,  259,  253,  252,  251,  250,  249,  248,
      247,  207,  206,  246,  245,  244,  243,  242,  241,  240,
      239,  238,  237,  236,  235,  234,  233,  232,  231,  230,
      229,  228,  227,  226,  225,  224,  223,  222,  221,  220,
      219,  218,  175,  217,  216,  168,  168,  168,  215,  159,
      210,  207,  206,  205,  204,  203,  202,  201,  200,  199,
      198,  197,  196,  195,  194,  193,  192,  191,  190,  189,

      188,  187,  186,  185,  184,  183,  182,  112,  181,  180,
      107,  179,  178,  177,  176,  175,  174,  173,  168,  168,
      168,  168,  168,  168,  168,  168,  166,  165,  149,  107,
      129,  128,  127,  126,  125,  124,  123,  122,  121,  120,
      119,  117,  112,  114,  437,   50,   48,   23,   23,   21,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,

      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437
    } ;

static yyconst flex_int16_t yy_chk[922] =
    {   0,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    6,   28,   91,   91,   28,    6,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,

        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    9,   19,
       19,    9,    9,  431,   84,    9,    9,    9,   20,   20,
        9,   11,   71,    9,   11,  401,    9,   12,   84,   13,
       12,   14,   30,   27,   32,   47,   13,   30,   14,   32,
       47,   51,  401,   51,   61,    9,    9,    9,   10,   61,
      347,   10,   10,   71,  426,   10,   10,   10,  425,   11,

       10,  347,   87,   10,   19,   12,   10,   13,   19,   14,
       76,   87,   19,   20,   19,   76,  423,   20,   80,   80,
       80,   20,   27,   20,   27,   10,   10,   10,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,   15,   17,

       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       48,   48,   48,   48,   68,   73,   73,   73,   93,   93,
       48,   48,   75,   48,   99,   48,   48,  162,   48,   74,
       74,   74,   89,   48,   75,   81,   81,   81,  420,   89,

       89,  144,  144,  155,  155,  155,  156,  156,  156,   68,
      167,  167,  167,  370,  162,  208,  208,  162,   73,  412,
      211,  162,  218,  419,  370,  418,  421,  218,  422,  430,
       99,  413,   74,  417,  218,  218,  412,  421,  218,  422,
      430,  415,  413,   75,  414,   75,  155,  211,  413,  156,
      211,  411,  410,  409,  211,  424,  424,  424,  424,  424,
      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
      424,  424,  424,  408,  424,  424,  424,  424,  424,  407,
      404,  403,  402,  400,  399,  398,  397,  396,  395,  394,
      393,  392,  391,  390,  424,  424,  424,  424,  389,  387,

      386,  382,  381,  380,  379,  378,  377,  374,  373,  372,
      371,  369,  368,  367,  361,  360,  358,  357,  356,  355,
      354,  353,  424,  424,  424,  424,  438,  438,  438,  438,
      438,  438,  438,  438,  438,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  441,  441,  441,  441,  441,  441,  441,
      441,  441,  442,  442,  442,  442,  442,  442,  442,  442,
      442,  443,  443,  443,  443,  443,  443,  443,  443,  443,
      444,  444,  445,  445,  446,  352,  351,  350,  349,  348,
      446,  446,  446,  447,  346,  345,  447,  447,  447,  447,

      447,  447,  448,  342,  448,  448,  341,  448,  448,  448,
      448,  449,  339,  337,  336,  335,  449,  333,  449,  450,
      450,  451,  451,  452,  452,  452,  452,  452,  452,  452,
      332,  331,  330,  329,  328,  327,  326,  325,  324,  323,
      322,  321,  320,  319,  318,  317,  316,  315,  314,  313,
      312,  311,  310,  309,  308,  306,  305,  304,  302,  301,
      300,  299,  298,  297,  296,  295,  294,  293,  292,  290,
      289,  288,  287,  286,  285,  284,  283,  282,  281,  280,
      279,  274,  273,  272,  271,  270,  269,  268,  267,  266,
      265,  263,  262,  261,  260,  259,  258,  257,  256,  255,

      254,  253,  252,  251,  250,  249,  248,  247,  246,  245,
      244,  243,  242,  241,  240,  239,  238,  237,  236,  235,
      234,  233,  232,  231,  230,  229,  227,  226,  225,  223,
      222,  221,  220,  219,  217,  216,  215,  214,  213,  212,
      210,  207,  206,  205,  204,  203,  202,  201,  200,  199,
      198,  197,  196,  195,  194,  193,  192,  191,  190,  189,
      188,  187,  186,  185,  184,  183,  181,  180,  179,  178,
      177,  176,  175,  174,  173,  171,  170,  169,  166,  159,
      157,  143,  142,  141,  140,  139,  138,  137,  136,  135,
      134,  133,  132,  131,  130,  129,  128,  127,  126,  125,

      124,  123,  122,  121,  120,  119,  114,  112,  111,  110,
      107,  106,  105,  104,  103,  101,   98,   97,   96,   95,
       92,   90,   86,   85,   83,   82,   79,   78,   64,   57,
       46,   45,   44,   43,   42,   41,   40,   39,   38,   37,
       36,   34,   33,   31,   21,    5,    4,    2,    1,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,

      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
      437
    } ;

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

extern int yy_flex_debug;
int yy_flex_debug = 0;

static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
static char *yy_full_match;
static int yy_lp;
static int yy_looking_for_trail_begin = 0;
static int yy_full_lp;
static int *yy_full_state;
#define YY_TRAILING_MASK 0x2000
#define YY_TRAILING_HEAD_MASK 0x4000
#define REJECT \
{ \
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
(yy_lp) = yy_full_lp; /* restore orig. accepting pos. */ \
(yy_state_ptr) = yy_full_state; /* restore orig. state */ \
yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
++(yy_lp); \
goto find_rule; \
}

static int yy_more_offset = 0;
static int yy_prev_more_offset = 0;
#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext ))
#define YY_NEED_STRLEN
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET \
	{ \
	(yy_more_offset) = (yy_prev_more_offset); \
	yyleng -= (yy_more_offset); \
	}
#ifndef YYLMAX
#define YYLMAX 8192
#endif

char yytext[YYLMAX];
char *yytext_ptr;
//
// The Termprocessor Kimwitu++
//
// Copyright (C) 1991 University of Twente, Dept TIOS.
// Copyright (C) 1997-2003 Humboldt-University at Berlin, Institute of Informatics
// All rights reserved.
//
// Kimwitu++ 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 2 of the License, or
// (at your option) any later version.
//
// Kimwitu++ 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 Kimwitu++; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
/*
 * kimwl.l
 */
static char kimwl_lAccesSid[] = "@(#)$Id$";

/* For windows (NT at least) we need to redefine fileno */
#if defined(_WIN32) && ! defined (__GNUC__)
# define fileno _fileno
#endif


/***************************************************************************/
/*
 * Name conventions: tokens and states are in CAPITALS
 * operators are capitalized
 *
 */


#include <cstdlib>
#include <string>

#include "k.h"
#include "yystype.h"
#include "kimwy.h"

namespace {
std::string cinclude("");
int cinit_paren_nesting =0;
int cinit_array_nesting =0;
void reset_nestcount();

int eat_comment(casestring);
void eat_line_comment();
void count(bool = true);
} // namespace

#define INITIAL 0
#define NORMAL 1
#define INCL 2
#define INCLSTART 3
#define CEXPR 4
#define CEXPRDQ 5
#define CEXPRSQ 6
#define C 7
#define OPNAME 8
#define OPTION 9

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

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

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

    static void yyunput (int c,char *buf_ptr  );
    
#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

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

#endif

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

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

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

#endif

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

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

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

/* end tables serialization structures and prototypes */

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

extern int yylex (void);

#define YY_DECL int yylex (void)
#endif /* !YY_DECL */

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

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

#define YY_RULE_SETUP \
	if ( yyleng > 0 ) \
		YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
				(yytext[yyleng - 1] == '\n'); \
	YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
	register yy_state_type yy_current_state;
	register char *yy_cp, *yy_bp;
	register int yy_act;
    


	if ( (yy_init) )
		{
		(yy_init) = 0;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

        if ( ! (yy_state_buf) )
            (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2  );

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

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

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

		yy_load_buffer_state( );
		}

	while ( 1 )		/* loops until end-of-file is reached */
		{
		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;

		yy_current_state = (yy_start);
		yy_current_state += YY_AT_BOL();

		(yy_state_ptr) = (yy_state_buf);
		*(yy_state_ptr)++ = yy_current_state;

yy_match:
		do
			{
			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*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 >= 438 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			*(yy_state_ptr)++ = yy_current_state;
			++yy_cp;
			}
		while ( yy_current_state != 437 );

yy_find_action:
		yy_current_state = *--(yy_state_ptr);
		(yy_lp) = yy_accept[yy_current_state];
find_rule: /* we branch to this label when backing up */
		for ( ; ; ) /* until we find what rule we matched */
			{
			if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
				{
				yy_act = yy_acclist[(yy_lp)];
				if ( yy_act & YY_TRAILING_HEAD_MASK ||
				     yy_looking_for_trail_begin )
					{
					if ( yy_act == yy_looking_for_trail_begin )
						{
						yy_looking_for_trail_begin = 0;
						yy_act &= ~YY_TRAILING_HEAD_MASK;
						break;
						}
					}
				else if ( yy_act & YY_TRAILING_MASK )
					{
					yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;
					yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;
					(yy_full_match) = yy_cp;
					yy_full_state = (yy_state_ptr);
					yy_full_lp = (yy_lp);
					}
				else
					{
					(yy_full_match) = yy_cp;
					yy_full_state = (yy_state_ptr);
					yy_full_lp = (yy_lp);
					break;
					}
				++(yy_lp);
				goto find_rule;
				}
			--yy_cp;
			yy_current_state = *--(yy_state_ptr);
			(yy_lp) = yy_accept[yy_current_state];
			}

		YY_DO_BEFORE_ACTION;

		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
			{
			int yyl;
			for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl )
				if ( yytext[yyl] == '\n' )
					   
    yylineno++;
;
			}

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

		switch ( yy_act )
	{ /* beginning of action switch */
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
{ count(false); }
	YY_BREAK
case 2:
YY_RULE_SETUP
{ count(); return T_PERCENTUVIEW; }
	YY_BREAK
case 3:
YY_RULE_SETUP
{ count(); return T_PERCENTUVIEWVAR; }
	YY_BREAK
case 4:
YY_RULE_SETUP
{ count(); return T_PERCENTRVIEW; }
	YY_BREAK
case 5:
YY_RULE_SETUP
{ count(); return T_PERCENTRVIEWVAR; }
	YY_BREAK
case 6:
YY_RULE_SETUP
{ count(); return T_PERCENTSTORAGECLASS; }
	YY_BREAK
case 7:
YY_RULE_SETUP
{ count(); return T_PERCENTLANGUAGE; }
	YY_BREAK
case 8:
YY_RULE_SETUP
{ count(); BEGIN OPTION; }
	YY_BREAK
case 9:
YY_RULE_SETUP
{ count(); BEGIN INCLSTART; return T_INCLUDESTART; }
	YY_BREAK
case 10:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_ID; }
	YY_BREAK
case 11:
YY_RULE_SETUP
{ count(false); }
	YY_BREAK
case 12:
/* rule 12 can match eol */
YY_RULE_SETUP
{ count(); cinclude = ""; cinclude.reserve(1024); BEGIN INCL; return T_ENDOFINCLUDESTART; }
	YY_BREAK
case 13:
/* rule 13 can match eol */
YY_RULE_SETUP
{ count(); cinclude += yytext[0]; }
	YY_BREAK
case 14:
YY_RULE_SETUP
{ count(); v_report(Warning(FileLine(pg_filename, pg_lineno), Problem1S("Opening '%{' (nested C++ includes; preceding closing '%}' not found)"))); cinclude += yytext; }
	YY_BREAK
case 15:
/* rule 15 can match eol */
YY_RULE_SETUP
{ count(); BEGIN NORMAL; yylval.yt_casestring = mkcasestring(cinclude.c_str()); return T_INCLUDEEND; }
	YY_BREAK
case 16:
YY_RULE_SETUP
{ count(); yylval.yt_integer = mkinteger(eat_comment(pg_filename)); return T_CNEWLINES; }
	YY_BREAK
case 17:
YY_RULE_SETUP
{ count(); eat_comment(pg_filename); }
	YY_BREAK
case 18:
YY_RULE_SETUP
{ count(); eat_line_comment(); yylval.yt_integer = mkinteger(1); return T_CNEWLINES; }
	YY_BREAK
case 19:
YY_RULE_SETUP
{ count(); eat_line_comment(); }
	YY_BREAK
case 20:
YY_RULE_SETUP
{ count(); return T_ARROW; }
	YY_BREAK
case 21:
YY_RULE_SETUP
{ count(); return T_PROVIDED; }
	YY_BREAK
case 22:
YY_RULE_SETUP
{ count(); return T_DEFAULT; }
	YY_BREAK
case 23:
YY_RULE_SETUP
{ count(); yylval.yt_integer = mkinteger(atoi(yytext)); return T_INT; }
	YY_BREAK
case 24:
YY_RULE_SETUP
{ count(); return T_LIST; }
	YY_BREAK
case 25:
YY_RULE_SETUP
{ count(); return T_STATIC; }
	YY_BREAK
case 26:
YY_RULE_SETUP
{ count(); return T_AUTO; }
	YY_BREAK
case 27:
YY_RULE_SETUP
{ count(); return T_REGISTER; }
	YY_BREAK
case 28:
YY_RULE_SETUP
{ count(); return T_EXTERN; }
	YY_BREAK
case 29:
YY_RULE_SETUP
{ count(); return T_TYPEDEF; }
	YY_BREAK
case 30:
YY_RULE_SETUP
{ count(); return T_CONST; }
	YY_BREAK
case 31:
YY_RULE_SETUP
{ count(); return T_VOLATILE; }
	YY_BREAK
case 32:
YY_RULE_SETUP
{ count(); return T_UNSIGNED; }
	YY_BREAK
case 33:
YY_RULE_SETUP
{ count(); return T_VIRTUAL; }
	YY_BREAK
case 34:
YY_RULE_SETUP
{ count(); BEGIN OPNAME; return T_OPERATOR; }
	YY_BREAK
case 35:
YY_RULE_SETUP
{ count(); return T_CONSTRUCTOR; }
	YY_BREAK
case 36:
YY_RULE_SETUP
{ count(); return T_DESTRUCTOR; }
	YY_BREAK
case 37:
YY_RULE_SETUP
{ count(); return T_MEMBER; }
	YY_BREAK
case 38:
YY_RULE_SETUP
{ count(); return T_ATTR; }
	YY_BREAK
case 39:
YY_RULE_SETUP
{ count(); return T_BASECLASS; }
	YY_BREAK
case 40:
YY_RULE_SETUP
{ count(); return T_DOTDOTDOT; }
	YY_BREAK
case 41:
YY_RULE_SETUP
{ count(); return T_COLONCOLON; }
	YY_BREAK
case 42:
/* rule 42 can match eol */
YY_RULE_SETUP
{ count(false); }
	YY_BREAK
case 43:
YY_RULE_SETUP
{ count(); BEGIN NORMAL; yylval.yt_casestring = mkcasestring(yytext); return T_OPNAME ; }
	YY_BREAK
case 44:
YY_RULE_SETUP
{ count(); BEGIN NORMAL; yylval.yt_casestring = mkcasestring(yytext); return T_ID ; }
	YY_BREAK
case 45:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_ID ; }
	YY_BREAK
case 46:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CEXPRESSION; }
	YY_BREAK
case 47:
YY_RULE_SETUP
{ count(); yylval.yt_integer = mkinteger(atoi(yytext+1)); return T_DOLLARVAR; }
	YY_BREAK
case 48:
YY_RULE_SETUP
{ count(); return T_UNPBLOCKSTART; }
	YY_BREAK
case 49:
YY_RULE_SETUP
{ count(); return T_UNPBLOCKEND; }
	YY_BREAK
case 50:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CEXPRESSION; }
	YY_BREAK
case 51:
/* rule 51 can match eol */
YY_RULE_SETUP
{ count(); return yytext[0]; }
	YY_BREAK
case 52:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("\\"); return T_CEXPRESSION; }
	YY_BREAK
case 53:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("\\\\"); return T_CEXPRESSION; }
	YY_BREAK
case 54:
YY_RULE_SETUP
{ count(); BEGIN CEXPRDQ; return yytext[0]; }
	YY_BREAK
case 55:
YY_RULE_SETUP
{ count(); BEGIN CEXPRSQ; return yytext[0]; }
	YY_BREAK
case 56:
YY_RULE_SETUP
{ count(); BEGIN NORMAL; reset_nestcount(); return yytext[0]; }
	YY_BREAK
case 57:
YY_RULE_SETUP
{ count(); return yytext[0]; }
	YY_BREAK
case 58:
YY_RULE_SETUP
{ count(); cinit_paren_nesting++;  yylval.yt_casestring = mkcasestring("(");  return yytext[0]; }
	YY_BREAK
case 59:
YY_RULE_SETUP
{ count(); if (cinit_paren_nesting == 0) {
					      BEGIN NORMAL; reset_nestcount(); return yytext[0];
					    } else {
					      cinit_paren_nesting--; yylval.yt_casestring = mkcasestring(")");  return yytext[0]; }
					}
	YY_BREAK
case 60:
YY_RULE_SETUP
{ count(); cinit_array_nesting++;  yylval.yt_casestring = mkcasestring("[");  return yytext[0]; }
	YY_BREAK
case 61:
YY_RULE_SETUP
{ count(); if (cinit_array_nesting == 0) {
					      BEGIN NORMAL; reset_nestcount(); return yytext[0];
					    } else {
					      cinit_array_nesting--; yylval.yt_casestring = mkcasestring("]");  return yytext[0]; }
					}
	YY_BREAK
case 62:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CEXPRESSION; }
	YY_BREAK
case 63:
YY_RULE_SETUP
{ count(); BEGIN CEXPR; return yytext[0]; }
	YY_BREAK
case 64:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("\\\""); return T_CEXPRESSION; }
	YY_BREAK
case 65:
YY_RULE_SETUP
{ count(); BEGIN CEXPR; return yytext[0]; }
	YY_BREAK
case 66:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("\\'"); return T_CEXPRESSION; }
	YY_BREAK
case 67:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CEXPRESSION; }
	YY_BREAK
case 68:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("$"); return T_CLINE; }
	YY_BREAK
case 69:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("\\\\"); return T_CLINE; }
	YY_BREAK
case 70:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("\\"); return T_CLINE ; }
	YY_BREAK
case 71:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("{"); /*WARNING-NO LONGER SUPPORTED*/ return T_CLINE ; }
	YY_BREAK
case 72:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring("}"); /*WARNING-NO LONGER SUPPORTED*/ return T_CLINE ; }
	YY_BREAK
case 73:
YY_RULE_SETUP
{ count(); if (strcmp(yytext, "$") == 0) return yytext[0];
					  yylval.yt_integer = mkinteger(atoi(yytext+1));
					  return T_DOLLARVAR;
					}
	YY_BREAK
case 74:
/* rule 74 can match eol */
YY_RULE_SETUP
{ count(); return T_FOREACH_AFTER; }
	YY_BREAK
case 75:
YY_RULE_SETUP
{ count(); if (strcmp(yytext, "foreach") ==0) {
					      return T_FOREACH;
					  } else if (strcmp(yytext, "afterforeach") ==0) {
					      return T_FOREACH_AFTER;
					  } else if (strcmp(yytext, "with") ==0) {
					      return T_WITH;
					  } else {
					      yylval.yt_casestring = mkcasestring(yytext);
					      return T_CLINE ;
					  }
					}
	YY_BREAK
case 76:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CLINE; }
	YY_BREAK
case 77:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CLINE; }
	YY_BREAK
case 78:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CLINE; }
	YY_BREAK
case 79:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CLINE; }
	YY_BREAK
case 80:
YY_RULE_SETUP
{ count(); yylval.yt_casestring = mkcasestring(yytext); return T_CLINE; }
	YY_BREAK
case 81:
YY_RULE_SETUP
{ count(); return yytext[0]; }
	YY_BREAK
case 82:
YY_RULE_SETUP
{ count(false); }
	YY_BREAK
case 83:
/* rule 83 can match eol */
YY_RULE_SETUP
{ count(false); BEGIN NORMAL; }
	YY_BREAK
case 84:
YY_RULE_SETUP
{ count(); if (g_options.for_bison!="" && g_options.for_bison!="yystype.h") v_report(Warning(FileLine(pg_filename, pg_lineno), Problem2S("Name of yystype header is set to ", g_options.for_bison.c_str()))); else g_options.for_bison="yystype.h"; }
	YY_BREAK
case 85:
YY_RULE_SETUP
{ count(); g_options.no_csgio=true; }
	YY_BREAK
case 86:
YY_RULE_SETUP
{ count(); g_options.no_unparse=true; }
	YY_BREAK
case 87:
YY_RULE_SETUP
{ count(); g_options.no_rewrite=true; }
	YY_BREAK
case 88:
YY_RULE_SETUP
{ count(); g_options.no_printdot=true; }
	YY_BREAK
case 89:
YY_RULE_SETUP
{ count(); g_options.no_hashtables=true; }
	YY_BREAK
case 90:
YY_RULE_SETUP
{ count(); g_options.smart_pointer=true; }
	YY_BREAK
case 91:
YY_RULE_SETUP
{ count(); g_options.smart_pointer=true; g_options.weak_pointer=true; }
	YY_BREAK
case 92:
YY_RULE_SETUP
{ count(); return yytext[0]; }
	YY_BREAK
case 93:
YY_RULE_SETUP
ECHO;
	YY_BREAK
			case YY_STATE_EOF(INITIAL):
			case YY_STATE_EOF(NORMAL):
			case YY_STATE_EOF(INCL):
			case YY_STATE_EOF(INCLSTART):
			case YY_STATE_EOF(CEXPR):
			case YY_STATE_EOF(CEXPRDQ):
			case YY_STATE_EOF(CEXPRSQ):
			case YY_STATE_EOF(C):
			case YY_STATE_EOF(OPNAME):
			case YY_STATE_EOF(OPTION):
				yyterminate();

	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;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
			}

		/* Note that here we test for yy_c_buf_p "<=" to the position
		 * of the first EOB in the buffer, since yy_c_buf_p will
		 * already have been incremented past the NUL character
		 * (since all states make transitions on EOB to the
		 * end-of-buffer state).  Contrast this with the test
		 * in input().
		 */
		if ( (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
				{
				yy_cp = (yy_c_buf_p);
				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 yylex */

/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *	EOB_ACT_LAST_MATCH -
 *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *	EOB_ACT_END_OF_FILE - end of file
 */
static int yy_get_next_buffer (void)
{
    	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
		{
			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. */

			YY_FATAL_ERROR(
"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );

			}

		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;

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

    static yy_state_type yy_get_previous_state (void)
{
	register yy_state_type yy_current_state;
	register char *yy_cp;
    
	yy_current_state = (yy_start);
	yy_current_state += YY_AT_BOL();

	(yy_state_ptr) = (yy_state_buf);
	*(yy_state_ptr)++ = yy_current_state;

	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
		{
		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
		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 >= 438 )
				yy_c = yy_meta[(unsigned int) yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
		*(yy_state_ptr)++ = yy_current_state;
		}

	return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
{
	register int yy_is_jam;
    
	register YY_CHAR yy_c = 1;
	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 >= 438 )
			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 == 437);
	if ( ! yy_is_jam )
		*(yy_state_ptr)++ = yy_current_state;

	return yy_is_jam ? 0 : yy_current_state;
}

    static void yyunput (int c, register char * yy_bp )
{
	register char *yy_cp;
    
    yy_cp = (yy_c_buf_p);

	/* undo effects of setting up yytext */
	*yy_cp = (yy_hold_char);

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

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

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

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

	*--yy_cp = (char) c;

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

	(yytext_ptr) = yy_bp;
	(yy_hold_char) = *yy_cp;
	(yy_c_buf_p) = yy_cp;
}

#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (void)
#else
    static int input  (void)
#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 = (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 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 yytext */
	(yy_hold_char) = *++(yy_c_buf_p);

	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
	if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
		   
    yylineno++;
;

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

/** 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 .
 */
    void yyrestart  (FILE * input_file )
{
    
	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( );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
{
    
	/* 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;
}

static void yy_load_buffer_state  (void)
{
    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	yyin = 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.
 */
    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
{
	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(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;
}

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * 
 */
    void yy_delete_buffer (YY_BUFFER_STATE  b )
{
    
	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.
 */
    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )

{
	int oerrno = errno;
    
	yy_flush_buffer(b );

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

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

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

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * 
 */
    void yy_flush_buffer (YY_BUFFER_STATE  b )
{
    	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( );
}

/** 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.
 *  
 */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
{
    	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;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  
 */
void yypop_buffer_state (void)
{
    	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;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void yyensure_buffer_stack (void)
{
	int 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**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		
		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**)yyrealloc
								((yy_buffer_stack),
								num_to_alloc * sizeof(struct yy_buffer_state*)
								);

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

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

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

	yy_switch_to_buffer(b  );

	return b;
}

/** Setup the input buffer state to scan a string. The next call to yylex() will
 * scan from a @e copy of @a str.
 * @param str 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 (yyconst char * yy_str )
{
    
	return yy_scan_bytes(yy_str,strlen(yy_str) );
}

/** 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 bytes the byte buffer to scan
 * @param 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  (yyconst char * bytes, int  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 = len + 2;
	buf = (char *) yyalloc(n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

	for ( i = 0; i < len; ++i )
		buf[i] = bytes[i];

	buf[len] = buf[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;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

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

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

#undef yyless
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		yytext[yyleng] = (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. */

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

/** Set the current line number.
 * @param 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 ;
}

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

    yyfree ( (yy_state_buf) );

    return 0;
}

/*
 * 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 *yyalloc (yy_size_t  size )
{
	return (void *) 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 (void *) realloc( (char *) ptr, size );
}

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

#define YYTABLES_NAME "yytables"

#undef YY_NEW_FILE
#undef YY_FLUSH_BUFFER
#undef yy_set_bol
#undef yy_new_buffer
#undef yy_set_interactive
#undef yytext_ptr
#undef YY_DO_BEFORE_ACTION

#ifdef YY_DECL_IS_OURS
#undef YY_DECL_IS_OURS
#undef YY_DECL
#endif



void do_NORMAL()	{ BEGIN NORMAL; reset_nestcount(); }
void do_CEXPR()		{ BEGIN CEXPR; }
void do_CEXPRDQ()	{ BEGIN CEXPRDQ; }
void do_CEXPRSQ()	{ BEGIN CEXPRSQ; }
void do_C()		{ BEGIN C; }

namespace {
void
reset_nestcount()
{
    /* WARNING if these are not == 0 */
    if (cinit_paren_nesting != 0) {
	v_report( NonFatal( PosNoFileLine(), Problem1S( "opening parenthesis '(' was not closed" )));
    }
    if (cinit_array_nesting != 0) {
	v_report( NonFatal( PosNoFileLine(), Problem1S( "opening bracket '[' was not closed" )));
    }
    cinit_paren_nesting = 0;
    cinit_array_nesting = 0;
}

int
eat_comment(casestring start_filename)
{
    char c1, c2;		/* comment string */
    int nest;
    int start_lineno = pg_lineno;

    for(nest=1, c2 = ' ';;){
	c1 = c2;
	c2 = yyinput();
	if (c2 == '\n') {
	    pg_lineno++;
	    pg_column = 0;
	    pg_charpos ++;
	} else if (c2 == '\t') {
	    pg_column += 8	- (pg_column %	8);
	    pg_charpos += 8	- (pg_charpos %	8);
	} else if (c2 == 0) {
	    v_report( Fatal( FileLine( start_filename, start_lineno ), Problem1S( "start of comment containing unexpected eof" )));
	} else {
	    pg_column++;
	    pg_charpos ++;
	}
	if (c1 == '/' && c2 == '*')
	    nest++;
	else if (c1 == '*' && c2 == '/')
	    nest--;
	if (nest <= 0)
	    break;
    }
    return pg_lineno - start_lineno;
}

void
eat_line_comment()
{
    while (yyinput()!='\n')
	;
    pg_lineno++;
    pg_column = 0;
    pg_charpos++;
}

void
count(bool notwhite)
{
    register char *s;

#ifdef MYLEXDEBUG
    if (notwhite)
	printf ("symbol	found: %s\n", yytext);
#endif
    for	(s = yytext; *s; s++)
	if (*s == '\n')	{
	    pg_column = 0;
	    pg_lineno++;
	    pg_charpos++;
	} else if	(*s	== '\t') {
	    pg_column += 8	- (pg_column %	8);
	    pg_charpos += 8	- (pg_charpos %	8);
	} else {
	    pg_column++;
	    pg_charpos++;
	}
}

} // namespace

// vim:sts=4:ts=8:cino=g0,t0,\:0

