/*
 *   Copyright 2003-2004 The Apache Software Foundation.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

#ifdef WIN32
#pragma warning (disable : 4786)
#endif

#line 2 "cpplex.cpp"
/* A lexical scanner generated by flex */

/* Scanner skeleton version:
 * $Header: /home/cvs//ws-axis/c/src/wcg/cpplex.cpp,v 1.7 2003/10/20 03:27:33 
 * susantha 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 )

/* 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 ));
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 70
#define YY_END_OF_BUFFER 71
static yyconst short int yy_accept[187] =
    {   0,
        0,    0,    0,    0,    0,    0,   11,   11,   71,   69,
       67,   68,   29,   69,    6,   23,   27,   69,   13,   14,
       21,   19,   31,   20,   35,   22,   62,   62,   33,   32,
       25,   26,   24,   36,   66,   66,   17,   69,   18,   30,
       15,   28,   16,   34,    4,    3,    4,   10,    9,   10,
       10,   12,   11,   70,   50,    0,    0,   39,   48,   44,
        0,    0,   37,   57,   40,   58,   41,   59,   55,    0,
       63,    1,    5,   38,   63,   62,    0,    0,   62,   62,
        0,   62,   60,   53,   51,   49,   52,   54,   66,    0,
        0,    0,    0,    0,   45,   46,   47,    2,    8,    0,

       12,   11,   65,    0,    0,    0,    0,   64,    0,    0,
        0,    0,   56,   61,    0,   63,    5,    0,   63,   62,
       62,   62,   42,   43,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,   63,   63,
        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,   66,    0,    0,    0,    0,
        0,    0,    0,    7,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0
    } ;

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

       42,   43,   31,   31,   44,   31,   31,   45,   31,   46,
       31,   31,   31,   47,   31,   47,   48,   47,   31,   49,
       31,   31,   50,   51,   52,   53,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

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

static yyconst short int yy_base[244] =
    {   0,
        0,    0,   51,   52,   53,   54,   56,   58,  235,  490,
      490,  490,  208,  196,  490,  203,   53,  191,  490,  490,
      201,   49,  490,   50,   60,   69,   82,   51,  203,  490,
       43,  199,   58,  490,  186,   82,  490,   58,  490,  194,
      490,   44,  490,  490,  490,  490,  200,  490,  490,  214,
      168,    0,  207,  490,  490,   87,   88,  490,  490,  490,
       76,  100,  490,  490,  490,  490,  490,  194,  490,  189,
      131,  490,    0,  490,    0,   76,  124,  148,   80,   64,
        0,    0,  490,  170,  490,  490,  490,  157,  142,   84,
      141,  139,    0,    0,  490,  490,  490,  490,  490,  125,

        0,  152,  490,  120,    0,    0,    0,  490,  160,    0,
        0,    0,  490,  490,  167,  490,    0,  138,  170,  490,
      490,  160,  490,  490,    0,    0,    0,    0,  102,  165,
        0,    0,  210,  184,    0,    0,  244,  178,  191,  490,
        0,    0,    0,    0,   94,   98,    0,    0,    0,  119,
        0,    0,    0,    0,    0,    0,    0,   97,    0,    0,
        0,    0,    0,    0,    0,  257,   80,    0,   99,    0,
      136,    0,    0,  490,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,  490,  306,  316,  326,  336,
      346,  351,  361,  368,  375,  385,  390,  392,  394,  396,

      398,  400,  402,  404,  406,  408,  410,  412,  414,  416,
      418,  420,  422,  424,  426,  428,  430,  432,  434,  436,
      438,  440,  442,  444,  446,  448,  450,  452,  454,  456,
      458,  460,  462,  464,  466,  468,  470,  472,  474,  476,
      478,  480,  482
    } ;

static yyconst short int yy_def[244] =
    {   0,
      186,    1,  187,  187,  188,  188,  189,  189,  186,  186,
      186,  186,  186,  190,  186,  186,  186,  191,  186,  186,
      186,  186,  186,  186,  186,  186,  186,   27,  186,  186,
      186,  186,  186,  186,  192,  192,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  193,  186,  186,  186,  190,  194,  186,  186,  186,
      191,  195,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  196,  186,   71,   27,  186,  186,  186,  186,
      197,   28,  186,  186,  186,  186,  186,  186,  192,  186,
      190,  191,  198,  199,  186,  186,  186,  186,  186,  186,

      193,  186,  186,  190,  200,  201,  202,  186,  191,  203,
      204,  205,  186,  186,  186,  186,  196,  186,  186,  186,
      186,  197,  186,  186,  206,  207,  208,  209,  186,  190,
      210,  211,  190,  191,  212,  213,  191,  186,  186,  186,
      214,  215,  216,  217,  186,  190,  218,  219,  133,  191,
      220,  221,  137,  222,  223,  224,  225,  186,  226,  227,
      228,  229,  230,  231,  232,  231,  186,  233,  190,  234,
      191,  235,  236,  186,  237,  238,  239,  240,  241,  242,
      243,  225,  227,  229,  231,    0,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,

      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186
    } ;

static yyconst short int yy_nxt[544] =
    {   0,
       10,   11,   12,   11,   13,   14,   15,   16,   17,   18,
       19,   20,   21,   22,   23,   24,   25,   26,   27,   28,
       28,   29,   30,   31,   32,   33,   34,   35,   35,   35,
       35,   36,   35,   35,   37,   38,   39,   40,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   41,
       42,   43,   44,   46,   46,   49,   49,   53,   54,   53,
       54,   59,   64,   47,   47,   66,   84,   85,   96,   82,
       82,   82,   69,   65,   67,   68,   70,   60,   71,   71,
       71,   72,   87,   88,  186,  108,   73,   91,   50,   50,
       93,   92,  103,   74,   97,  121,   51,   51,   75,  186,

       76,   76,   77,  103,  103,   94,  104,  104,  121,  186,
       78,   62,  120,   79,   80,   81,  125,   90,  109,  109,
      105,  174,   57,   78,  186,  103,   79,  120,  108,   80,
       81,  126,  110,   57,   57,  106,  107,  167,  130,  130,
       75,  158,   77,   77,   77,  108,  145,  111,  112,   71,
       71,   71,   78,  102,   62,   57,  119,  119,  119,  115,
      116,  118,  116,  118,  129,   78,  119,  119,  119,  108,
      103,   62,  115,  116,   62,  116,   57,   90,  134,  134,
      138,  124,  138,  146,  146,  139,  139,  139,  119,  119,
      119,   79,   80,  108,  123,   62,  139,  139,  139,  140,

       57,  140,  150,  150,   79,  114,  113,   80,  102,  139,
      139,  139,  140,  100,  140,  103,   99,   98,   95,   62,
      116,   90,  116,   86,   83,   63,   62,   58,  149,  149,
      149,   57,   55,  116,  186,  116,  186,  149,  149,  149,
      186,  186,  186,  186,  186,   57,  186,  186,  149,  149,
      149,  149,  149,  108,  186,  186,  186,  186,  186,  186,
      186,  186,  153,  153,  153,  186,  186,  186,  186,  186,
      186,  153,  153,  153,  186,  186,  186,  186,  186,   62,
      186,  186,  153,  153,  153,  153,  153,   89,   89,   89,
       89,  186,   90,  186,  186,  186,  186,  186,  186,  186,

       89,   89,   89,   89,   89,   89,   45,   45,   45,   45,
       45,   45,   45,   45,   45,   45,   48,   48,   48,   48,
       48,   48,   48,   48,   48,   48,   52,   52,   52,   52,
       52,   52,   52,   52,   52,   52,   56,   56,  186,  186,
       56,   56,   56,   56,   56,   56,   61,   61,  186,   61,
      186,   61,   61,   61,   61,   61,   89,   89,  186,   89,
       89,  101,  186,  186,  101,  101,  101,  101,  101,  101,
      101,   56,   56,   56,  186,   56,  186,   56,   61,   61,
       61,  186,   61,  186,   61,  117,  117,  186,  117,  117,
      117,  117,  117,  117,  117,  122,  122,  127,  127,  128,

      128,  131,  131,  132,  132,  133,  133,  135,  135,  136,
      136,  137,  137,  141,  141,  142,  142,  143,  143,  144,
      144,  147,  147,  148,  148,  151,  151,  152,  152,  154,
      154,  155,  155,  156,  156,  157,  157,  159,  159,  160,
      160,  161,  161,  162,  162,  163,  163,  164,  164,  165,
      165,  166,  166,  168,  168,  169,  169,  170,  170,  171,
      171,  172,  172,   89,   89,  173,  173,  175,  175,  176,
      176,  177,  177,  178,  178,  179,  179,  180,  180,  181,
      181,  182,  182,  183,  183,  184,  184,  185,  185,    9,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,

      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186
    } ;

static yyconst short int yy_chk[544] =
    {   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,    3,    4,    5,    6,    7,    7,    8,
        8,   17,   22,    3,    4,   24,   31,   31,   42,   28,
       28,   28,   25,   22,   24,   24,   25,   17,   25,   25,
       25,   26,   33,   33,   28,   61,   26,   36,    5,    6,
       38,   36,   56,   26,   42,   80,    5,    6,   27,   28,

       27,   27,   27,  146,  169,   38,   57,   57,   80,   76,
       27,   61,   79,   27,   27,   27,   90,   36,   62,   62,
       57,  167,   56,   27,   76,  104,   27,   79,  150,   27,
       27,   90,   62,  146,  169,   57,   57,  158,  104,  104,
       77,  145,   77,   77,   77,  171,  129,   62,   62,   71,
       71,   71,   77,  102,  150,  104,  118,  118,  118,   71,
       71,   78,   71,   78,  100,   77,   78,   78,   78,  109,
      130,  171,   71,   71,   92,   71,   91,   89,  109,  109,
      115,   88,  115,  130,  130,  115,  115,  115,  119,  119,
      119,  122,  122,  134,   84,  109,  138,  138,  138,  119,

      130,  119,  134,  134,  122,   70,   68,  122,   53,  139,
      139,  139,  119,   51,  119,  133,   50,   47,   40,  134,
      139,   35,  139,   32,   29,   21,   18,   16,  133,  133,
      133,   14,   13,  139,    9,  139,    0,  133,  133,  133,
        0,    0,    0,    0,    0,  133,    0,    0,  133,  133,
      133,  133,  133,  137,    0,    0,    0,    0,    0,    0,
        0,    0,  137,  137,  137,    0,    0,    0,    0,    0,
        0,  137,  137,  137,    0,    0,    0,    0,    0,  137,
        0,    0,  137,  137,  137,  137,  137,  166,  166,  166,
      166,    0,  166,    0,    0,    0,    0,    0,    0,    0,

      166,  166,  166,  166,  166,  166,  187,  187,  187,  187,
      187,  187,  187,  187,  187,  187,  188,  188,  188,  188,
      188,  188,  188,  188,  188,  188,  189,  189,  189,  189,
      189,  189,  189,  189,  189,  189,  190,  190,    0,    0,
      190,  190,  190,  190,  190,  190,  191,  191,    0,  191,
        0,  191,  191,  191,  191,  191,  192,  192,    0,  192,
      192,  193,    0,    0,  193,  193,  193,  193,  193,  193,
      193,  194,  194,  194,    0,  194,    0,  194,  195,  195,
      195,    0,  195,    0,  195,  196,  196,    0,  196,  196,
      196,  196,  196,  196,  196,  197,  197,  198,  198,  199,

      199,  200,  200,  201,  201,  202,  202,  203,  203,  204,
      204,  205,  205,  206,  206,  207,  207,  208,  208,  209,
      209,  210,  210,  211,  211,  212,  212,  213,  213,  214,
      214,  215,  215,  216,  216,  217,  217,  218,  218,  219,
      219,  220,  220,  221,  221,  222,  222,  223,  223,  224,
      224,  225,  225,  226,  226,  227,  227,  228,  228,  229,
      229,  230,  230,  231,  231,  232,  232,  233,  233,  234,
      234,  235,  235,  236,  236,  237,  237,  238,  238,  239,
      239,  240,  240,  241,  241,  242,  242,  243,  243,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,

      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186,  186,  186,  186,  186,  186,  186,  186,
      186,  186,  186
    } ;

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 "cpp.l"
#define INITIAL 0
#line 2 "cpp.l"
  #include <map>
  #include <string>
  #include <iostream>
  
  using namespace std;

  #include "cppyacc.hpp"

  static int check_keyword(const char* name);
  int yyerror(char * msg);
  extern int yyparse();
  void do_newline();

  int line_number = 1;
  
  #define MAX_INCLUDE_DEPTH 10
  YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
  int include_stack_ptr = 0;  
/***** Start state for comments *****/
#define COMMENT 1

#define PREPROCESSOR 2

/* the "incl" state is used for picking up the name
 * of an include file
 */
#define INCLUDE 3

/***** DEFINITIONS *****/
/* Whitespace */
/* Integer Literals */
/* Float Literals */
/* Characters and Strings */
/* Identifiers */
/***** LEXICAL RULES *****/
#line 594 "cpplex.cpp"

/* 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 97 "cpp.l"


#line 748 "cpplex.cpp"

    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 >= 187 )
                    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] != 490 );

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 99 "cpp.l"
{ BEGIN(COMMENT); }
    YY_BREAK
case 2:
YY_RULE_SETUP
#line 100 "cpp.l"
{ BEGIN(0); }
    YY_BREAK
case 3:
YY_RULE_SETUP
#line 101 "cpp.l"
{ do_newline(); }
    YY_BREAK
case 4:
YY_RULE_SETUP
#line 102 "cpp.l"
{ ; }
    YY_BREAK
case 5:
YY_RULE_SETUP
#line 104 "cpp.l"
{ ; }
    YY_BREAK
case 6:
YY_RULE_SETUP
#line 106 "cpp.l"
{ BEGIN(PREPROCESSOR); }
    YY_BREAK
case 7:
YY_RULE_SETUP
#line 107 "cpp.l"
{ BEGIN(INCLUDE); }
    YY_BREAK
case 8:
YY_RULE_SETUP
#line 108 "cpp.l"
{ do_newline(); }
    YY_BREAK
case 9:
YY_RULE_SETUP
#line 109 "cpp.l"
{ do_newline(); BEGIN(0); }
    YY_BREAK
case 10:
YY_RULE_SETUP
#line 110 "cpp.l"
{ ; }
    YY_BREAK
case 11:
YY_RULE_SETUP
#line 111 "cpp.l"
/* eat the whitespace */
    YY_BREAK
case 12:
YY_RULE_SETUP
#line 112 "cpp.l"
{
    if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
    {
        cout << "Includes nested too deeply";
        exit(1);
    }
      string incfile = yytext;
    if (incfile.find('<') == string::npos) /* open only from local path */
    {
        include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
        yyin = fopen(incfile.substr(1,incfile.length()-2).c_str(), "r");
        if (!yyin)
        {
            cout << "File included from "<< yytext << " is not found on path"
                <<endl;
            exit(1);
        }
        yy_switch_to_buffer(yy_create_buffer( yyin, YY_BUF_SIZE ));
        BEGIN(0);
    }
    else
    {
        BEGIN(0);
    }
}
    YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(COMMENT):
case YY_STATE_EOF(PREPROCESSOR):
case YY_STATE_EOF(INCLUDE):
#line 137 "cpp.l"
{
    if ( --include_stack_ptr < 0 )
    {
        yyterminate();
    }
    else
    {
        yy_delete_buffer( YY_CURRENT_BUFFER );
        yy_switch_to_buffer(include_stack[include_stack_ptr]);
    }
}
    YY_BREAK
case 13:
YY_RULE_SETUP
#line 149 "cpp.l"
{ return LEFTPAREN; }
    YY_BREAK
case 14:
YY_RULE_SETUP
#line 150 "cpp.l"
{ return RIGHTPAREN; }
    YY_BREAK
case 15:
YY_RULE_SETUP
#line 151 "cpp.l"
{ return LEFTBRACK; }
    YY_BREAK
case 16:
YY_RULE_SETUP
#line 152 "cpp.l"
{ return RIGHTBRACK; }
    YY_BREAK
case 17:
YY_RULE_SETUP
#line 153 "cpp.l"
{ return LEFTARRAY; }
    YY_BREAK
case 18:
YY_RULE_SETUP
#line 154 "cpp.l"
{ return RIGHTARRAY; }
    YY_BREAK
case 19:
YY_RULE_SETUP
#line 155 "cpp.l"
{ return PLUS; }
    YY_BREAK
case 20:
YY_RULE_SETUP
#line 156 "cpp.l"
{ return MINUS; }
    YY_BREAK
case 21:
YY_RULE_SETUP
#line 157 "cpp.l"
{ return STAR; }
    YY_BREAK
case 22:
YY_RULE_SETUP
#line 158 "cpp.l"
{ return DIVIDE; }
    YY_BREAK
case 23:
YY_RULE_SETUP
#line 159 "cpp.l"
{ return MOD; }
    YY_BREAK
case 24:
YY_RULE_SETUP
#line 160 "cpp.l"
{ return GREATER; }
    YY_BREAK
case 25:
YY_RULE_SETUP
#line 161 "cpp.l"
{ return LESS; }
    YY_BREAK
case 26:
YY_RULE_SETUP
#line 162 "cpp.l"
{ return EQUAL; }
    YY_BREAK
case 27:
YY_RULE_SETUP
#line 163 "cpp.l"
{ return AND; }
    YY_BREAK
case 28:
YY_RULE_SETUP
#line 164 "cpp.l"
{ return OR; }
    YY_BREAK
case 29:
YY_RULE_SETUP
#line 165 "cpp.l"
{ return NOT; }
    YY_BREAK
case 30:
YY_RULE_SETUP
#line 166 "cpp.l"
{ return XOR; }
    YY_BREAK
case 31:
YY_RULE_SETUP
#line 167 "cpp.l"
{ return COMMA; }
    YY_BREAK
case 32:
YY_RULE_SETUP
#line 168 "cpp.l"
{ return SEMI; }
    YY_BREAK
case 33:
YY_RULE_SETUP
#line 169 "cpp.l"
{ return COLON; }
    YY_BREAK
case 34:
YY_RULE_SETUP
#line 170 "cpp.l"
{ return COMPLEMENT; }
    YY_BREAK
case 35:
YY_RULE_SETUP
#line 171 "cpp.l"
{ return DOT; }
    YY_BREAK
case 36:
YY_RULE_SETUP
#line 172 "cpp.l"
{ return QUESTION; }
    YY_BREAK
case 37:
YY_RULE_SETUP
#line 174 "cpp.l"
{ return STAREQ; }
    YY_BREAK
case 38:
YY_RULE_SETUP
#line 175 "cpp.l"
{ return DIVEQ; }
    YY_BREAK
case 39:
YY_RULE_SETUP
#line 176 "cpp.l"
{ return MODEQ; }
    YY_BREAK
case 40:
YY_RULE_SETUP
#line 177 "cpp.l"
{ return PLUSEQ; }
    YY_BREAK
case 41:
YY_RULE_SETUP
#line 178 "cpp.l"
{ return MINUSEQ; }
    YY_BREAK
case 42:
YY_RULE_SETUP
#line 179 "cpp.l"
{ return LTLTEQ; }
    YY_BREAK
case 43:
YY_RULE_SETUP
#line 180 "cpp.l"
{ return GTGTEQ; }
    YY_BREAK
case 44:
YY_RULE_SETUP
#line 181 "cpp.l"
{ return ANDEQ; }
    YY_BREAK
case 45:
YY_RULE_SETUP
#line 182 "cpp.l"
{ return XOREQ; }
    YY_BREAK
case 46:
YY_RULE_SETUP
#line 183 "cpp.l"
{ return OREQ; }
    YY_BREAK
case 47:
YY_RULE_SETUP
#line 184 "cpp.l"
{ return OROR; }
    YY_BREAK
case 48:
YY_RULE_SETUP
#line 185 "cpp.l"
{ return ANDAND; }
    YY_BREAK
case 49:
YY_RULE_SETUP
#line 186 "cpp.l"
{ return EQEQ; }
    YY_BREAK
case 50:
YY_RULE_SETUP
#line 187 "cpp.l"
{ return NOTEQ; }
    YY_BREAK
case 51:
YY_RULE_SETUP
#line 188 "cpp.l"
{ return LEQ; }
    YY_BREAK
case 52:
YY_RULE_SETUP
#line 189 "cpp.l"
{ return GEQ; }
    YY_BREAK
case 53:
YY_RULE_SETUP
#line 190 "cpp.l"
{ return LTLT; }
    YY_BREAK
case 54:
YY_RULE_SETUP
#line 191 "cpp.l"
{ return GTGT; }
    YY_BREAK
case 55:
YY_RULE_SETUP
#line 192 "cpp.l"
{ return DOTSTAR; }
    YY_BREAK
case 56:
YY_RULE_SETUP
#line 193 "cpp.l"
{ return ARROWSTAR; }
    YY_BREAK
case 57:
YY_RULE_SETUP
#line 194 "cpp.l"
{ return PLUSPLUS; }
    YY_BREAK
case 58:
YY_RULE_SETUP
#line 195 "cpp.l"
{ return MINUSMINUS; }
    YY_BREAK
case 59:
YY_RULE_SETUP
#line 196 "cpp.l"
{ return ARROW; }
    YY_BREAK
case 60:
YY_RULE_SETUP
#line 197 "cpp.l"
{ return COLCOL; }
    YY_BREAK
case 61:
YY_RULE_SETUP
#line 198 "cpp.l"
{ return ELLIPSES; }
    YY_BREAK
case 62:
YY_RULE_SETUP
#line 200 "cpp.l"
{ return INTEGER_LITERAL; }
    YY_BREAK
case 63:
YY_RULE_SETUP
#line 203 "cpp.l"
{ return FLOATING_LITERAL; }
    YY_BREAK
case 64:
YY_RULE_SETUP
#line 204 "cpp.l"
{ return CHARACTER_LITERAL; }
    YY_BREAK
case 65:
YY_RULE_SETUP
#line 205 "cpp.l"
{ return STRING_LITERAL; }
    YY_BREAK
case 66:
YY_RULE_SETUP
#line 207 "cpp.l"
{ return check_keyword(yytext); }
    YY_BREAK
case 67:
YY_RULE_SETUP
#line 209 "cpp.l"
;
    YY_BREAK
case 68:
YY_RULE_SETUP
#line 210 "cpp.l"
{ do_newline(); }
    YY_BREAK
case 69:
YY_RULE_SETUP
#line 212 "cpp.l"
{ yyerror("Lexical Error"); }
    YY_BREAK
case 70:
YY_RULE_SETUP
#line 214 "cpp.l"
ECHO;
    YY_BREAK
#line 1223 "cpplex.cpp"

    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 >= 187 )
                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 >= 187 )
            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 == 186);

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


#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;
}


#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 = 1;
#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 214 "cpp.l"


void init_keyword_map()
{
    lexer_keys["and"]=ANDAND;
    lexer_keys["and_eq"]=ANDEQ;
    lexer_keys["asm"]=KW_asm;
    lexer_keys["auto"]=KW_auto;
    lexer_keys["bitand"]=AND;
    lexer_keys["bitor"]=OR;
    lexer_keys["bool"]=KW_bool;
    lexer_keys["break"]=KW_break;
    lexer_keys["case"]=KW_case;
    lexer_keys["catch"]=KW_catch;
    lexer_keys["char"]=KW_char;
    lexer_keys["class"]=KW_class;
    lexer_keys["compl"]=COMPLEMENT;
    lexer_keys["const"]=KW_const;
    lexer_keys["const_cast"]=KW_const_cast;
    lexer_keys["continue"]=KW_continue;
    lexer_keys["default"]=KW_default;
    lexer_keys["delete"]=KW_delete;
    lexer_keys["do"]=KW_do;
    lexer_keys["double"]=KW_double;
    lexer_keys["dynamic_cast"]=KW_dynamic_cast;
    lexer_keys["else"]=KW_else;
    lexer_keys["enum"]=KW_enum;
    lexer_keys["explicit"]=KW_explicit;
    lexer_keys["export"]=KW_export;
    lexer_keys["extern"]=KW_extern;
    lexer_keys["false"]=KW_false;
    lexer_keys["float"]=KW_float;
    lexer_keys["for"]=KW_for;
    lexer_keys["friend"]=KW_friend;
    lexer_keys["goto"]=KW_goto;
    lexer_keys["if"]=KW_if;
    lexer_keys["inline"]=KW_inline;
    lexer_keys["int"]=KW_int;
    lexer_keys["long"]=KW_long;
    lexer_keys["mutable"]=KW_mutable;
    lexer_keys["namespace"]=KW_namespace;
    lexer_keys["new"]=KW_new;
    lexer_keys["not"]=NOT;
    lexer_keys["not_eq"]=NOTEQ;
    lexer_keys["operator"]=KW_operator;
    lexer_keys["or"]=OROR;
    lexer_keys["or_eq"]=OREQ;
    lexer_keys["private"]=KW_private;
    lexer_keys["protected"]=KW_protected;
    lexer_keys["public"]=KW_public;
    lexer_keys["register"]=KW_register;
    lexer_keys["reinterpret_cast"]=KW_reinterpret_cast;
    lexer_keys["return"]=KW_return;
    lexer_keys["short"]=KW_short;
    lexer_keys["signed"]=KW_signed;
    lexer_keys["sizeof"]=KW_sizeof;
    lexer_keys["static"]=KW_static;
    lexer_keys["static_cast"]=KW_static_cast;
    lexer_keys["struct"]=KW_struct;
    lexer_keys["switch"]=KW_switch;
    lexer_keys["template"]=KW_template;
    lexer_keys["this"]=KW_this;
    lexer_keys["throw"]=KW_throw;
    lexer_keys["true"]=KW_true;
    lexer_keys["try"]=KW_try;
    lexer_keys["typedef"]=KW_typedef;
    lexer_keys["typeid"]=KW_typeid;
    lexer_keys["typename"]=KW_typename;
    lexer_keys["union"]=KW_union;
    lexer_keys["unsigned"]=KW_unsigned;
    lexer_keys["using"]=KW_using;
    lexer_keys["virtual"]=KW_virtual;
    lexer_keys["void"]=KW_void;
    lexer_keys["volatile"]=KW_volatile;
    lexer_keys["wchar_t"]=KW_wchar_t;
    lexer_keys["while"]=KW_while;
    lexer_keys["xor"]=XOR;
    lexer_keys["xor_eq"]=XOREQ;
    /* following are added and considered basic types for Axis WCG. */
    lexer_keys["string"]=KW_string;
};  

int yywrap() 
{
   line_number = 0;
   return 1;
};

void do_newline()
{
  line_number++; 
}

/***********************************************************************
 *      check_keyword -- check for keyword or identifier
 ***********************************************************************/


static int check_keyword(const char* name) 
{
  int tok = IDENTIFIER;
  string sname = name;
  if (!sname.empty())
  {
    /* cout << sname.c_str() << endl; */
    if (lexer_keys.find(sname) != lexer_keys.end())
    {
      tok = lexer_keys[sname];
    }
    else if (is_defined_class(sname.c_str()))
    {
        /* cout << sname.c_str() << " is recognized as a class"<<endl; */
            tok = ID_class_name;
    }
/*    else if (is_accessbean_macro(sname))
    {
        tok = ACCESSBEAN_MACRO;
    }
*/
  }
  return tok;
}


/***********************************************************************
 *      yyerror -- give the text and line number
 ***********************************************************************/

int yyerror(char * msg) 
{
  printf("%s at line number: %d\t", msg, line_number);
  printf(yytext);
  return 0;
}
