/* A lexical scanner generated by flex*/

/* Scanner skeleton version:
 * $Header: /cvs/bao-parsec/pkgs/libs/uptcpip/src/scripts/c-parser/ansi-c/lex.yy.c,v 1.1.1.1 2012/03/29 17:21:22 uid42307 Exp $
 */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5

#include <stdio.h>
#include <unistd.h>


/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
#ifdef c_plusplus
#ifndef __cplusplus
#define __cplusplus
#endif
#endif


#ifdef __cplusplus

#include <stdlib.h>

/* Use prototypes in function declarations. */
#define YY_USE_PROTOS

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

#else	/* ! __cplusplus */

#if __STDC__

#define YY_USE_PROTOS
#define YY_USE_CONST

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

#ifdef __TURBOC__
 #pragma warn -rch
 #pragma warn -use
#include <io.h>
#include <stdlib.h>
#define YY_USE_CONST
#define YY_USE_PROTOS
#endif

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


#ifdef YY_USE_PROTOS
#define YY_PROTO(proto) proto
#else
#define YY_PROTO(proto) ()
#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. */
#define YY_BUF_SIZE 16384

typedef struct yy_buffer_state *YY_BUFFER_STATE;

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

/* The funky do-while in the following #define is used to turn the definition
 * int a single C statement (which needs a semi-colon terminator).  This
 * avoids problems with code like:
 *
 * 	if ( condition_holds )
 *		yyless( 5 );
 *	else
 *		do_something_else();
 *
 * Prior to using the do-while the compiler would get upset at the
 * "else" because it interpreted the "if" statement as being all
 * done when it reached the ';' after the yyless() call.
 */

/* Return all but the first 'n' matched characters back to the input stream. */

#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
		*yy_cp = yy_hold_char; \
		YY_RESTORE_YY_MORE_OFFSET \
		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
		} \
	while ( 0 )

#define unput(c) yyunput( c, yytext_ptr )

/* Some routines like yy_flex_realloc() are emitted as static but are
   not called by all lexers. This generates warnings in some compilers,
   notably GCC. Arrange to suppress these. */
#ifdef __GNUC__
#define YY_MAY_BE_UNUSED __attribute__((unused))
#else
#define YY_MAY_BE_UNUSED
#endif

/* 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).
 */
typedef unsigned int yy_size_t;


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;

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

static YY_BUFFER_STATE yy_current_buffer = 0;

/* 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".
 */
#define YY_CURRENT_BUFFER yy_current_buffer


/* 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 YY_PROTO(( FILE *input_file ));

void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
void yy_load_buffer_state YY_PROTO(( void ));
YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )

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

static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) YY_MAY_BE_UNUSED;
static void yy_flex_free YY_PROTO(( void * ));

#define yy_new_buffer yy_create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! yy_current_buffer ) \
		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
	yy_current_buffer->yy_is_interactive = is_interactive; \
	}

#define yy_set_bol(at_bol) \
	{ \
	if ( ! yy_current_buffer ) \
		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
	yy_current_buffer->yy_at_bol = at_bol; \
	}

#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)

typedef unsigned char YY_CHAR;
FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
typedef int yy_state_type;
extern char *yytext;
#define yytext_ptr yytext

static yy_state_type yy_get_previous_state YY_PROTO(( void ));
static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
static int yy_get_next_buffer YY_PROTO(( void ));
static void yy_fatal_error YY_PROTO(( 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 = (int) (yy_cp - yy_bp); \
	yy_hold_char = *yy_cp; \
	*yy_cp = '\0'; \
	yy_c_buf_p = yy_cp;

#define YY_NUM_RULES 91
#define YY_END_OF_BUFFER 92
static yyconst short int yy_accept[242] =
    {   0,
        0,    0,   92,   90,   89,   89,   77,   90,   83,   76,
       90,   71,   72,   81,   80,   68,   79,   75,   82,   37,
       37,   69,   65,   84,   70,   85,   88,   34,   34,   73,
       74,   86,   34,   34,   34,   34,   34,   34,   34,   34,
       34,   34,   34,   34,   34,   34,   34,   66,   87,   67,
       78,   64,    0,   42,    0,   50,   67,   59,   51,    0,
        0,   48,   56,   46,   57,   47,   58,    0,   40,    1,
       49,   41,   36,    0,   37,    0,   37,   74,   66,   73,
       55,   61,   63,   62,   54,   34,    0,    0,   52,   34,
       34,   34,   34,   34,   34,    9,   34,   34,   34,   34,

       34,   34,   17,   34,   34,   34,   34,   34,   34,   34,
       34,   34,   34,   34,   53,   60,   38,   43,    0,   40,
       40,    0,   41,   36,    0,   39,   35,   45,   44,   34,
       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
       15,   34,   18,   34,   34,   34,   34,   34,   34,   34,
       34,   34,   34,   34,   34,   34,   34,   34,    0,   40,
        0,   40,    0,   41,   39,   35,    2,   34,    4,    5,
       34,   34,   34,   34,   11,   12,   34,   34,   16,   19,
       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
       34,   31,   34,   34,    0,   40,    3,    6,   34,   34,

       34,   34,   14,   34,   34,   22,   34,   34,   34,   34,
       34,   34,   29,   34,   34,   33,   34,   34,   10,   13,
       34,   21,   23,   24,   25,   26,   27,   34,   34,   34,
       34,    8,   34,   28,   34,   34,    7,   20,   30,   32,
        0
    } ;

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

       40,   41,   42,   43,   44,   28,   45,   46,   47,   48,
       49,   50,   28,   51,   52,   53,   54,   55,   56,   57,
       58,   59,   60,   61,   62,   63,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    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 int yy_meta[64] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    2,    1,    1,
        1,    1,    1,    1,    1,    1,    3,    3,    1,    1,
        1,    1,    1,    1,    3,    3,    3,    4,    4,    4,
        4,    1,    1,    1,    1,    3,    3,    3,    3,    3,
        3,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    1,
        1,    1,    1
    } ;

static yyconst short int yy_base[246] =
    {   0,
        0,    0,  371,  372,  372,  372,  348,   59,   43,   60,
      336,  372,  372,  346,   56,  372,   57,   55,   63,   78,
       71,  344,  372,   84,  344,   53,  372,    0,   76,  372,
      372,  343,  310,  312,   77,   70,   66,   45,  313,   74,
      312,  320,   84,  301,  310,  308,  313,  372,   55,  372,
      372,  372,   97,  372,  352,  372,  372,  372,  372,  113,
      126,  372,  372,  372,  372,  372,  372,  339,  121,  372,
      372,  125,  155,  141,  134,    0,  160,  372,  372,  372,
      331,  372,  372,  372,  330,    0,  136,  318,  372,  297,
      309,  296,  311,  298,  304,  290,  291,  288,  288,  291,

      288,  285,    0,  284,  288,   45,  286,  115,  109,  290,
      283,   92,   87,  288,  372,  372,  372,  372,  179,  372,
      181,  199,  372,  174,  165,  206,  196,  372,  372,  282,
      294,  289,  277,  166,  291,  289,  285,  277,  283,  286,
        0,  272,    0,  278,  275,  264,  266,  268,  275,  261,
      259,  259,  271,  261,  265,  269,  271,  260,  212,  214,
      222,  372,  220,  227,  372,  228,    0,  260,    0,    0,
      247,  249,  238,  245,    0,    0,  239,  235,    0,    0,
      235,  235,  232,  244,  234,  237,  242,  241,  239,  228,
      230,    0,  218,  230,  231,  248,    0,    0,  221,  221,

      224,  215,    0,  209,  213,    0,  220,  212,  213,  193,
      172,  172,    0,  157,  158,    0,  140,  139,    0,    0,
      147,    0,    0,    0,    0,    0,    0,  138,  136,  122,
      116,    0,   98,    0,   60,   43,    0,    0,    0,    0,
      372,  294,  298,  300,   66
    } ;

static yyconst short int yy_def[246] =
    {   0,
      241,    1,  241,  241,  241,  241,  241,  242,  241,  241,
      243,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  244,  244,  241,
      241,  241,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  241,  241,  241,
      241,  241,  242,  241,  242,  241,  241,  241,  241,  243,
      243,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  245,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  244,  242,  243,  241,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,

      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  245,  241,  241,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  241,  241,
      241,  241,  241,  241,  241,  241,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  241,  241,  244,  244,  244,  244,

      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
        0,  241,  241,  241,  241
    } ;

static yyconst short int yy_nxt[436] =
    {   0,
        4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
       14,   15,   16,   17,   18,   19,   20,   21,   22,   23,
       24,   25,   26,   27,   28,   28,   28,   28,   29,   28,
       28,   30,    4,   31,   32,   33,   34,   35,   36,   37,
       38,   39,   28,   40,   28,   41,   28,   28,   28,   28,
       42,   43,   44,   45,   46,   47,   28,   28,   28,   48,
       49,   50,   51,   54,   56,   57,   58,   63,  127,   68,
       65,   69,   69,   70,   84,   85,  115,   64,   66,   67,
       87,   59,  240,   88,   71,   72,  145,   77,   77,   79,
      100,   55,   72,  101,   73,   73,   74,  146,  239,   75,

       75,   54,   80,   74,   81,   82,   75,   75,   76,   95,
       74,   97,   92,   98,  103,  116,   75,   74,   96,   93,
      117,  104,   99,   75,   75,   94,  107,  108,  241,   55,
      156,   75,  157,   60,   76,  154,  109,   69,   69,  110,
       54,  121,  121,  155,  150,   61,  119,  120,  238,  120,
      122,  123,  125,  123,  125,  237,  148,  126,  126,  151,
      119,  120,   75,   75,  122,  123,  120,  236,   55,   72,
      123,   73,   73,  149,   72,  235,   77,   77,  234,   75,
       74,  126,  126,  124,  124,   74,  233,   75,   75,   75,
      159,  232,  159,  231,   74,  160,  160,  121,  121,   74,

      124,  230,  124,  124,  229,   75,  161,  162,  124,  162,
      163,  228,  163,   75,  227,  164,  164,  171,  172,  124,
      161,  162,  126,  126,  166,  166,  162,  124,  160,  160,
      160,  160,  165,  195,  165,  195,  164,  164,  196,  196,
      120,  166,  120,  164,  164,  226,  165,  196,  196,  166,
      225,  165,  224,  123,  120,  123,  166,  166,  223,  120,
      222,  221,  220,  219,  196,  196,  218,  123,  217,  216,
      215,  214,  123,  166,  162,  213,  162,  212,  211,  210,
      209,  166,  208,  207,  206,  205,  204,  203,  162,  202,
      201,  200,  199,  162,   53,   53,   53,   53,   60,  198,

       60,   60,   86,   86,  197,  194,  193,  192,  191,  190,
      189,  188,  187,  186,  185,  184,  183,  182,  181,  180,
      179,  178,  177,  176,  175,  174,  173,  170,  169,  168,
      167,  158,  153,  152,  147,  144,  143,  142,  141,  140,
      139,  138,  137,  136,  135,  134,  133,  132,  131,  130,
       61,  129,  128,  118,  241,  114,  113,  112,  111,  106,
      105,  102,   91,   90,   89,   83,   78,   62,   61,   52,
      241,    3,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,

      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241
    } ;

static yyconst short int yy_chk[436] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    8,    9,    9,   10,   15,  245,   18,
       17,   18,   18,   19,   26,   26,   49,   15,   17,   17,
       29,   10,  236,   29,   19,   21,  106,   21,   21,   24,
       38,    8,   20,   38,   20,   20,   21,  106,  235,   21,

       21,   53,   24,   20,   24,   24,   20,   20,   20,   36,
       21,   37,   35,   37,   40,   49,   21,   20,   36,   35,
       60,   40,   37,   20,   21,   35,   43,   43,   61,   53,
      113,   20,  113,   61,   20,  112,   43,   69,   69,   43,
       87,   72,   72,  112,  109,   60,   69,   69,  233,   69,
       72,   72,   74,   72,   74,  231,  108,   74,   74,  109,
       69,   69,   75,   75,   72,   72,   69,  230,   87,   73,
       72,   73,   73,  108,   77,  229,   77,   77,  228,   75,
       73,  125,  125,   73,   73,   77,  221,   75,   77,   77,
      119,  218,  119,  217,   73,  119,  119,  121,  121,   77,

       73,  215,  124,  124,  214,   77,  121,  121,   73,  121,
      122,  212,  122,   77,  211,  122,  122,  134,  134,  124,
      121,  121,  126,  126,  127,  127,  121,  124,  159,  159,
      160,  160,  126,  161,  126,  161,  163,  163,  161,  161,
      160,  127,  160,  164,  164,  210,  126,  195,  195,  127,
      209,  126,  208,  164,  160,  164,  166,  166,  207,  160,
      205,  204,  202,  201,  196,  196,  200,  164,  199,  194,
      193,  191,  164,  166,  196,  190,  196,  189,  188,  187,
      186,  166,  185,  184,  183,  182,  181,  178,  196,  177,
      174,  173,  172,  196,  242,  242,  242,  242,  243,  171,

      243,  243,  244,  244,  168,  158,  157,  156,  155,  154,
      153,  152,  151,  150,  149,  148,  147,  146,  145,  144,
      142,  140,  139,  138,  137,  136,  135,  133,  132,  131,
      130,  114,  111,  110,  107,  105,  104,  102,  101,  100,
       99,   98,   97,   96,   95,   94,   93,   92,   91,   90,
       88,   85,   81,   68,   55,   47,   46,   45,   44,   42,
       41,   39,   34,   33,   32,   25,   22,   14,   11,    7,
        3,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,

      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241,  241,  241,  241,  241,  241,
      241,  241,  241,  241,  241
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
#line 1 "c-gramar.l"
#define INITIAL 0
#line 9 "c-gramar.l"
#include <stdio.h>
#include "y.tab.h"

void count();
#line 555 "lex.yy.c"

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

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

#ifndef YY_NO_UNPUT
static void yyunput YY_PROTO(( int c, char *buf_ptr ));
#endif

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

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

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

#if YY_STACK_USED
static int yy_start_stack_ptr = 0;
static int yy_start_stack_depth = 0;
static int *yy_start_stack = 0;
#ifndef YY_NO_PUSH_STATE
static void yy_push_state YY_PROTO(( int new_state ));
#endif
#ifndef YY_NO_POP_STATE
static void yy_pop_state YY_PROTO(( void ));
#endif
#ifndef YY_NO_TOP_STATE
static int yy_top_state YY_PROTO(( void ));
#endif

#else
#define YY_NO_PUSH_STATE 1
#define YY_NO_POP_STATE 1
#define YY_NO_TOP_STATE 1
#endif

#ifdef YY_MALLOC_DECL
YY_MALLOC_DECL
#else
#if __STDC__
#ifndef __cplusplus
#include <stdlib.h>
#endif
#else
/* Just try to get by without declaring the routines.  This will fail
 * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
 * or sizeof(void*) != sizeof(int).
 */
#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->yy_is_interactive ) \
		{ \
		int c = '*', 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 if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
		  && ferror( yyin ) ) \
		YY_FATAL_ERROR( "input in flex scanner failed" );
#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

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL int yylex YY_PROTO(( void ))
#endif

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

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

#define YY_RULE_SETUP \
	YY_USER_ACTION

YY_DECL
	{
	register yy_state_type yy_current_state;
	register char *yy_cp = NULL, *yy_bp = NULL;
	register int yy_act;

#line 15 "c-gramar.l"

#line 708 "lex.yy.c"

	if ( yy_init )
		{
		yy_init = 0;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

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

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

		if ( ! yy_current_buffer )
			yy_current_buffer =
				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_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 >= 242 )
					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_base[yy_current_state] != 372 );

yy_find_action:
		yy_act = yy_accept[yy_current_state];
		if ( yy_act == 0 )
			{ /* have to back up */
			yy_cp = yy_last_accepting_cpos;
			yy_current_state = yy_last_accepting_state;
			yy_act = yy_accept[yy_current_state];
			}

		YY_DO_BEFORE_ACTION;


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


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

case 1:
YY_RULE_SETUP
#line 16 "c-gramar.l"
{ comment(); }
	YY_BREAK
case 2:
YY_RULE_SETUP
#line 18 "c-gramar.l"
{ count(); return(AUTO); }
	YY_BREAK
case 3:
YY_RULE_SETUP
#line 19 "c-gramar.l"
{ count(); return(BREAK); }
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 20 "c-gramar.l"
{ count(); return(CASE); }
	YY_BREAK
case 5:
YY_RULE_SETUP
#line 21 "c-gramar.l"
{ count(); return(CHAR); }
	YY_BREAK
case 6:
YY_RULE_SETUP
#line 22 "c-gramar.l"
{ count(); return(CONST); }
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 23 "c-gramar.l"
{ count(); return(CONTINUE); }
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 24 "c-gramar.l"
{ count(); return(DEFAULT); }
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 25 "c-gramar.l"
{ count(); return(DO); }
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 26 "c-gramar.l"
{ count(); return(DOUBLE); }
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 27 "c-gramar.l"
{ count(); return(ELSE); }
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 28 "c-gramar.l"
{ count(); return(ENUM); }
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 29 "c-gramar.l"
{ count(); return(EXTERN); }
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 30 "c-gramar.l"
{ count(); return(FLOAT); }
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 31 "c-gramar.l"
{ count(); return(FOR); }
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 32 "c-gramar.l"
{ count(); return(GOTO); }
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 33 "c-gramar.l"
{ count(); return(IF); }
	YY_BREAK
case 18:
YY_RULE_SETUP
#line 34 "c-gramar.l"
{ count(); return(INT); }
	YY_BREAK
case 19:
YY_RULE_SETUP
#line 35 "c-gramar.l"
{ count(); return(LONG); }
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 36 "c-gramar.l"
{ count(); return(REGISTER); }
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 37 "c-gramar.l"
{ count(); return(RETURN); }
	YY_BREAK
case 22:
YY_RULE_SETUP
#line 38 "c-gramar.l"
{ count(); return(SHORT); }
	YY_BREAK
case 23:
YY_RULE_SETUP
#line 39 "c-gramar.l"
{ count(); return(SIGNED); }
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 40 "c-gramar.l"
{ count(); return(SIZEOF); }
	YY_BREAK
case 25:
YY_RULE_SETUP
#line 41 "c-gramar.l"
{ count(); return(STATIC); }
	YY_BREAK
case 26:
YY_RULE_SETUP
#line 42 "c-gramar.l"
{ count(); return(STRUCT); }
	YY_BREAK
case 27:
YY_RULE_SETUP
#line 43 "c-gramar.l"
{ count(); return(SWITCH); }
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 44 "c-gramar.l"
{ count(); return(TYPEDEF); }
	YY_BREAK
case 29:
YY_RULE_SETUP
#line 45 "c-gramar.l"
{ count(); return(UNION); }
	YY_BREAK
case 30:
YY_RULE_SETUP
#line 46 "c-gramar.l"
{ count(); return(UNSIGNED); }
	YY_BREAK
case 31:
YY_RULE_SETUP
#line 47 "c-gramar.l"
{ count(); return(VOID); }
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 48 "c-gramar.l"
{ count(); return(VOLATILE); }
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 49 "c-gramar.l"
{ count(); return(WHILE); }
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 51 "c-gramar.l"
{ count(); return(check_type()); }
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 53 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 54 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 55 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 56 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 58 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 59 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 60 "c-gramar.l"
{ count(); return(CONSTANT); }
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 62 "c-gramar.l"
{ count(); return(STRING_LITERAL); }
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 64 "c-gramar.l"
{ count(); return(ELLIPSIS); }
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 65 "c-gramar.l"
{ count(); return(RIGHT_ASSIGN); }
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 66 "c-gramar.l"
{ count(); return(LEFT_ASSIGN); }
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 67 "c-gramar.l"
{ count(); return(ADD_ASSIGN); }
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 68 "c-gramar.l"
{ count(); return(SUB_ASSIGN); }
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 69 "c-gramar.l"
{ count(); return(MUL_ASSIGN); }
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 70 "c-gramar.l"
{ count(); return(DIV_ASSIGN); }
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 71 "c-gramar.l"
{ count(); return(MOD_ASSIGN); }
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 72 "c-gramar.l"
{ count(); return(AND_ASSIGN); }
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 73 "c-gramar.l"
{ count(); return(XOR_ASSIGN); }
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 74 "c-gramar.l"
{ count(); return(OR_ASSIGN); }
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 75 "c-gramar.l"
{ count(); return(RIGHT_OP); }
	YY_BREAK
case 55:
YY_RULE_SETUP
#line 76 "c-gramar.l"
{ count(); return(LEFT_OP); }
	YY_BREAK
case 56:
YY_RULE_SETUP
#line 77 "c-gramar.l"
{ count(); return(INC_OP); }
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 78 "c-gramar.l"
{ count(); return(DEC_OP); }
	YY_BREAK
case 58:
YY_RULE_SETUP
#line 79 "c-gramar.l"
{ count(); return(PTR_OP); }
	YY_BREAK
case 59:
YY_RULE_SETUP
#line 80 "c-gramar.l"
{ count(); return(AND_OP); }
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 81 "c-gramar.l"
{ count(); return(OR_OP); }
	YY_BREAK
case 61:
YY_RULE_SETUP
#line 82 "c-gramar.l"
{ count(); return(LE_OP); }
	YY_BREAK
case 62:
YY_RULE_SETUP
#line 83 "c-gramar.l"
{ count(); return(GE_OP); }
	YY_BREAK
case 63:
YY_RULE_SETUP
#line 84 "c-gramar.l"
{ count(); return(EQ_OP); }
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 85 "c-gramar.l"
{ count(); return(NE_OP); }
	YY_BREAK
case 65:
YY_RULE_SETUP
#line 86 "c-gramar.l"
{ count(); return(';'); }
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 87 "c-gramar.l"
{ count(); return('{'); }
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 88 "c-gramar.l"
{ count(); return('}'); }
	YY_BREAK
case 68:
YY_RULE_SETUP
#line 89 "c-gramar.l"
{ count(); return(','); }
	YY_BREAK
case 69:
YY_RULE_SETUP
#line 90 "c-gramar.l"
{ count(); return(':'); }
	YY_BREAK
case 70:
YY_RULE_SETUP
#line 91 "c-gramar.l"
{ count(); return('='); }
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 92 "c-gramar.l"
{ count(); return('('); }
	YY_BREAK
case 72:
YY_RULE_SETUP
#line 93 "c-gramar.l"
{ count(); return(')'); }
	YY_BREAK
case 73:
YY_RULE_SETUP
#line 94 "c-gramar.l"
{ count(); return('['); }
	YY_BREAK
case 74:
YY_RULE_SETUP
#line 95 "c-gramar.l"
{ count(); return(']'); }
	YY_BREAK
case 75:
YY_RULE_SETUP
#line 96 "c-gramar.l"
{ count(); return('.'); }
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 97 "c-gramar.l"
{ count(); return('&'); }
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 98 "c-gramar.l"
{ count(); return('!'); }
	YY_BREAK
case 78:
YY_RULE_SETUP
#line 99 "c-gramar.l"
{ count(); return('~'); }
	YY_BREAK
case 79:
YY_RULE_SETUP
#line 100 "c-gramar.l"
{ count(); return('-'); }
	YY_BREAK
case 80:
YY_RULE_SETUP
#line 101 "c-gramar.l"
{ count(); return('+'); }
	YY_BREAK
case 81:
YY_RULE_SETUP
#line 102 "c-gramar.l"
{ count(); return('*'); }
	YY_BREAK
case 82:
YY_RULE_SETUP
#line 103 "c-gramar.l"
{ count(); return('/'); }
	YY_BREAK
case 83:
YY_RULE_SETUP
#line 104 "c-gramar.l"
{ count(); return('%'); }
	YY_BREAK
case 84:
YY_RULE_SETUP
#line 105 "c-gramar.l"
{ count(); return('<'); }
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 106 "c-gramar.l"
{ count(); return('>'); }
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 107 "c-gramar.l"
{ count(); return('^'); }
	YY_BREAK
case 87:
YY_RULE_SETUP
#line 108 "c-gramar.l"
{ count(); return('|'); }
	YY_BREAK
case 88:
YY_RULE_SETUP
#line 109 "c-gramar.l"
{ count(); return('?'); }
	YY_BREAK
case 89:
YY_RULE_SETUP
#line 111 "c-gramar.l"
{ count(); }
	YY_BREAK
case 90:
YY_RULE_SETUP
#line 112 "c-gramar.l"
{ /* ignore bad characters */ }
	YY_BREAK
case 91:
YY_RULE_SETUP
#line 114 "c-gramar.l"
ECHO;
	YY_BREAK
#line 1246 "lex.yy.c"
case YY_STATE_EOF(INITIAL):
	yyterminate();

	case YY_END_OF_BUFFER:
		{
		/* Amount of text matched not including the EOB char. */
		int yy_amount_of_matched_text = (int) (yy_cp - 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->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->yy_n_chars;
			yy_current_buffer->yy_input_file = yyin;
			yy_current_buffer->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->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->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()
	{
	register char *dest = yy_current_buffer->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->yy_ch_buf[yy_n_chars + 1] )
		YY_FATAL_ERROR(
		"fatal flex scanner internal error--end of buffer missed" );

	if ( yy_current_buffer->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->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->yy_n_chars = yy_n_chars = 0;

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

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */
#ifdef YY_USES_REJECT
			YY_FATAL_ERROR(
"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
#else

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

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

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

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

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					yy_flex_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->yy_buf_size -
						number_to_move - 1;
#endif
			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

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

		yy_current_buffer->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->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

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

	yytext_ptr = &yy_current_buffer->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()
	{
	register yy_state_type yy_current_state;
	register char *yy_cp;

	yy_current_state = yy_start;

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

#ifdef YY_USE_PROTOS
static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
#else
static yy_state_type yy_try_NUL_trans( yy_current_state )
yy_state_type yy_current_state;
#endif
	{
	register int yy_is_jam;
	register char *yy_cp = yy_c_buf_p;

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

	return yy_is_jam ? 0 : yy_current_state;
	}


#ifndef YY_NO_UNPUT
#ifdef YY_USE_PROTOS
static void yyunput( int c, register char *yy_bp )
#else
static void yyunput( c, yy_bp )
int c;
register char *yy_bp;
#endif
	{
	register char *yy_cp = yy_c_buf_p;

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

	if ( yy_cp < yy_current_buffer->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->yy_ch_buf[
					yy_current_buffer->yy_buf_size + 2];
		register char *source =
				&yy_current_buffer->yy_ch_buf[number_to_move];

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

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

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

	*--yy_cp = (char) c;


	yytext_ptr = yy_bp;
	yy_hold_char = *yy_cp;
	yy_c_buf_p = yy_cp;
	}
#endif	/* ifndef YY_NO_UNPUT */


#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput()
#else
static int input()
#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->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 );

					/* fall through */

				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;


	return c;
	}
#endif /* YY_NO_INPUT */

#ifdef YY_USE_PROTOS
void yyrestart( FILE *input_file )
#else
void yyrestart( input_file )
FILE *input_file;
#endif
	{
	if ( ! yy_current_buffer )
		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );

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


#ifdef YY_USE_PROTOS
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
#else
void yy_switch_to_buffer( new_buffer )
YY_BUFFER_STATE new_buffer;
#endif
	{
	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->yy_buf_pos = yy_c_buf_p;
		yy_current_buffer->yy_n_chars = yy_n_chars;
		}

	yy_current_buffer = 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;
	}


#ifdef YY_USE_PROTOS
void yy_load_buffer_state( void )
#else
void yy_load_buffer_state()
#endif
	{
	yy_n_chars = yy_current_buffer->yy_n_chars;
	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
	yyin = yy_current_buffer->yy_input_file;
	yy_hold_char = *yy_c_buf_p;
	}


#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
#else
YY_BUFFER_STATE yy_create_buffer( file, size )
FILE *file;
int size;
#endif
	{
	YY_BUFFER_STATE b;

	b = (YY_BUFFER_STATE) yy_flex_alloc( 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 *) yy_flex_alloc( 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;
	}


#ifdef YY_USE_PROTOS
void yy_delete_buffer( YY_BUFFER_STATE b )
#else
void yy_delete_buffer( b )
YY_BUFFER_STATE b;
#endif
	{
	if ( ! b )
		return;

	if ( b == yy_current_buffer )
		yy_current_buffer = (YY_BUFFER_STATE) 0;

	if ( b->yy_is_our_buffer )
		yy_flex_free( (void *) b->yy_ch_buf );

	yy_flex_free( (void *) b );
	}



#ifdef YY_USE_PROTOS
void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
#else
void yy_init_buffer( b, file )
YY_BUFFER_STATE b;
FILE *file;
#endif


	{
	yy_flush_buffer( b );

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

#if YY_ALWAYS_INTERACTIVE
	b->yy_is_interactive = 1;
#else
#if YY_NEVER_INTERACTIVE
	b->yy_is_interactive = 0;
#else
	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
#endif
#endif
	}


#ifdef YY_USE_PROTOS
void yy_flush_buffer( YY_BUFFER_STATE b )
#else
void yy_flush_buffer( b )
YY_BUFFER_STATE b;
#endif

	{
	if ( ! b )
		return;

	b->yy_n_chars = 0;

	/* We always need two end-of-buffer characters.  The first causes
	 * a transition to the end-of-buffer state.  The second causes
	 * a jam in that state.
	 */
	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

	b->yy_buf_pos = &b->yy_ch_buf[0];

	b->yy_at_bol = 1;
	b->yy_buffer_status = YY_BUFFER_NEW;

	if ( b == yy_current_buffer )
		yy_load_buffer_state();
	}


#ifndef YY_NO_SCAN_BUFFER
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
#else
YY_BUFFER_STATE yy_scan_buffer( base, size )
char *base;
yy_size_t size;
#endif
	{
	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) yy_flex_alloc( 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;
	}
#endif


#ifndef YY_NO_SCAN_STRING
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
#else
YY_BUFFER_STATE yy_scan_string( yy_str )
yyconst char *yy_str;
#endif
	{
	int len;
	for ( len = 0; yy_str[len]; ++len )
		;

	return yy_scan_bytes( yy_str, len );
	}
#endif


#ifndef YY_NO_SCAN_BYTES
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
#else
YY_BUFFER_STATE yy_scan_bytes( bytes, len )
yyconst char *bytes;
int len;
#endif
	{
	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 *) yy_flex_alloc( 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;
	}
#endif


#ifndef YY_NO_PUSH_STATE
#ifdef YY_USE_PROTOS
static void yy_push_state( int new_state )
#else
static void yy_push_state( new_state )
int new_state;
#endif
	{
	if ( yy_start_stack_ptr >= yy_start_stack_depth )
		{
		yy_size_t new_size;

		yy_start_stack_depth += YY_START_STACK_INCR;
		new_size = yy_start_stack_depth * sizeof( int );

		if ( ! yy_start_stack )
			yy_start_stack = (int *) yy_flex_alloc( new_size );

		else
			yy_start_stack = (int *) yy_flex_realloc(
					(void *) yy_start_stack, new_size );

		if ( ! yy_start_stack )
			YY_FATAL_ERROR(
			"out of memory expanding start-condition stack" );
		}

	yy_start_stack[yy_start_stack_ptr++] = YY_START;

	BEGIN(new_state);
	}
#endif


#ifndef YY_NO_POP_STATE
static void yy_pop_state()
	{
	if ( --yy_start_stack_ptr < 0 )
		YY_FATAL_ERROR( "start-condition stack underflow" );

	BEGIN(yy_start_stack[yy_start_stack_ptr]);
	}
#endif


#ifndef YY_NO_TOP_STATE
static int yy_top_state()
	{
	return yy_start_stack[yy_start_stack_ptr - 1];
	}
#endif

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

#ifdef YY_USE_PROTOS
static void yy_fatal_error( yyconst char msg[] )
#else
static void yy_fatal_error( msg )
char msg[];
#endif
	{
	(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. */ \
		yytext[yyleng] = yy_hold_char; \
		yy_c_buf_p = yytext + n; \
		yy_hold_char = *yy_c_buf_p; \
		*yy_c_buf_p = '\0'; \
		yyleng = n; \
		} \
	while ( 0 )


/* Internal utility routines. */

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

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

	return n;
	}
#endif


#ifdef YY_USE_PROTOS
static void *yy_flex_alloc( yy_size_t size )
#else
static void *yy_flex_alloc( size )
yy_size_t size;
#endif
	{
	return (void *) malloc( size );
	}

#ifdef YY_USE_PROTOS
static void *yy_flex_realloc( void *ptr, yy_size_t size )
#else
static void *yy_flex_realloc( ptr, size )
void *ptr;
yy_size_t size;
#endif
	{
	/* 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 );
	}

#ifdef YY_USE_PROTOS
static void yy_flex_free( void *ptr )
#else
static void yy_flex_free( ptr )
void *ptr;
#endif
	{
	free( ptr );
	}

#if YY_MAIN
int main()
	{
	yylex();
	return 0;
	}
#endif
#line 114 "c-gramar.l"


yywrap()
{
	return(1);
}


comment()
{
	char c, c1;

loop:
	while ((c = input()) != '*' && c != 0)
		putchar(c);

	if ((c1 = input()) != '/' && c != 0)
	{
		unput(c1);
		goto loop;
	}

	if (c != 0)
		putchar(c1);
}


int column = 0;

void count()
{
	int i;

	for (i = 0; yytext[i] != '\0'; i++)
		if (yytext[i] == '\n')
			column = 0;
		else if (yytext[i] == '\t')
			column += 8 - (column % 8);
		else
			column++;

	ECHO;
}


int check_type()
{
/*
* pseudo code --- this is what it should check
*
*	if (yytext == type_name)
*		return(TYPE_NAME);
*
*	return(IDENTIFIER);
*/

/*
*	it actually will only return IDENTIFIER
*/

	return(IDENTIFIER);
}
