# include "stdio.h"
# define U(x) x
# define NLSTATE yyprevious=YYNEWLINE
# define BEGIN yybgin = yysvec + 1 +
# define INITIAL 0
# define YYLERR yysvec
# define YYSTATE (yyestate-yysvec-1)
# define YYOPTIM 1
# define YYLMAX BUFSIZ
# define output(c) putc(c,yyout)
# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
# define yymore() (yymorfg=1)
# define ECHO fprintf(yyout, "%s",yytext)
# define REJECT { nstr = yyreject(); goto yyfussy;}
int yyleng; extern char yytext[];
int yymorfg;
extern char *yysptr, yysbuf[];
int yytchar;
FILE *yyin = {stdin}, *yyout = {stdout};
extern int yylineno;
struct yysvf { 
	struct yywork *yystoff;
	struct yysvf *yyother;
	int *yystops;};
struct yysvf *yyestate;
extern struct yysvf yysvec[], *yybgin;
/* Lexical analyzer for our project compiler for C. Note that CONSTANTS
 * are all positive in order to avoid confusions (to prevent a-1 from
 * being interpreted as NAME CONSTANT rather than NAME MINUS CONSTANT.
 * This file is modelled after Holubs "COMPILER DESIGN IN C", p 829.
 */

#include "types.h"
#include "y.tab.h"
#include "tree.h"
#include "symtbl.h"
#include <stdlib.h>

#define   YYDEBUG

#undef    YY_BREAK
#define   YY_BREAK ;

# define YYNEWLINE 10
yylex(){
int nstr; extern int yyprevious;
while((nstr = yylook()) >= 0)
yyfussy: switch(nstr){
case 0:
if(yywrap()) return(0); break;
case 1:
                        {
			       int i, last_i = 0;
			       while ((i = input()) && (i != EOF)) {
					if (i == '/' && last_i == '*' )
						break;
					last_i = i;
			       }
                               if (i == 0 || i == EOF)
                                  printf("End of file in comment \n");
                             }
break;
case 2:
    {  yylval.info.tree_info = create_node("STRING CONST");
			       add_child(yylval.info.tree_info,create_node(yytext));
                               return  STRING; }
break;
case 3:
{
                              printf("Adding missing quote to string constant\n");
			      yylval.info.tree_info = create_node("STRING CONST");
			      add_child(yylval.info.tree_info,create_node(yytext));
                               return  STRING; }
break;
case 4:
                    case 5:
           case 6:
            case 7:
                   /* '\x123', '\x12', '\x1'                    */
                           {  yylval.info.tree_info = create_node("CHAR CONST");
			      add_child(yylval.info.tree_info,create_node(yytext));
			      return CHARACTER_CONSTANT; }
break;
case 8:
         case 9:
        case 10:
        case 11:
         { yylval.info.tree_info = create_node("INTEGER CONST");
			      add_child(yylval.info.tree_info,create_node(yytext));
                              return  INTEGER_CONSTANT; }
break;
case 12:
{ yylval.info.tree_info = create_node("FLOAT CONST");
						 add_child(yylval.info.tree_info,
								create_node(yytext));
						return  FLOATING_CONSTANT; }
break;
case 13:
  { yylval.info.tree_info = create_node("FLOAT CONST");
				 add_child(yylval.info.tree_info,create_node(yytext));
				return  FLOATING_CONSTANT; }
break;
case 14:
                        {  yylval.info.tree_info = create_node("LEFT_PAREN"); 
				return  LEFT_PARENTH; }
break;
case 15:
                        {  yylval.info.tree_info = create_node("RIGHT_PAREN"); 
				return  RIGHT_PARENTH; }
break;
case 16:
                        {  yylval.info.tree_info = create_node("LEFT_BRACE"); 
				return  LEFT_BANANA; }
break;
case 17:
                        {  yylval.info.tree_info = create_node("RIGHT_BRACE"); 
				return  RIGHT_BANANA; }
break;
case 18:
                        {  yylval.info.tree_info = create_node("LEFT_BRACKET"); 
				return  LEFT_BRACKET; }
break;
case 19:
                        {  yylval.info.tree_info = create_node("RIGHT_BRACKET"); 
				return  RIGHT_BRACKET; }
break;
case 20:
                       {  yylval.info.tree_info = create_node("ARROW"); 
				return  ARROW; }
break;
case 21:
                        {  yylval.info.tree_info = create_node("POINT"); 
				return  POINT; }
break;
case 22:
                       {  yylval.info.tree_info = create_node("PLUS_PLUS"); 
				return  PLUS_PLUS; }
break;
case 23:
                       {  yylval.info.tree_info = create_node("MINUS_MINUS"); 
				return  MINUS_MINUS; }
break;
case 24:
                        {  yylval.info.tree_info = create_node("TILDE"); 
				return  TILDE;  }
break;
case 25:
                        {  yylval.info.tree_info = create_node("EXCLAMATION"); 
				return  EXCLAMATION; }
break;
case 26:
                        {  yylval.info.tree_info = create_node("ASTERISK"); 
				return  ASTERISK;  }
break;
case 27:
                        {  yylval.info.tree_info = create_node("SLASH"); 
				return  SLASH; }
break;
case 28:
                        {  yylval.info.tree_info = create_node("PERCENT"); 
				return  PERCENT; }
break;
case 29:
                        {  yylval.info.tree_info = create_node("PLUS"); 
				return  PLUS;  }
break;
case 30:
                        {  yylval.info.tree_info = create_node("MINUS"); 
				return  MOINUS; }
break;
case 31:
                       {  yylval.info.tree_info = create_node("RIGHT_SHIFT"); 
				return  RIGHT_SHIFT; }
break;
case 32:
                       {  yylval.info.tree_info = create_node("LEFT_SHIFT"); 
				return  LEFT_SHIFT; }
break;
case 33:
                        {  yylval.info.tree_info = create_node("LESS_THAN"); 
				return  LESS; }
break;
case 34:
                        {  yylval.info.tree_info = create_node("GREATER_THAN"); 
				return  MORE; }
break;
case 35:
                       {  yylval.info.tree_info = create_node("LESS_EQUAL"); 
				return  LESS_EQUAL; }
break;
case 36:
                       {  yylval.info.tree_info = create_node("GREATER_EQUAL"); 
				return  GREATER_EQUAL; }
break;
case 37:
                       {  yylval.info.tree_info = create_node("NOT_EQUAL"); 
				return  NOT_EQUAL; }
break;
case 38:
                       {  yylval.info.tree_info = create_node("EQUAL_EQUAL"); 
				return  EQUAL_EQUAL; }
break;
case 39:
                       {  yylval.info.tree_info = create_node("MINUS_EQUAL"); 
				return  MINUS_EQUAL; }
break;
case 40:
                       {  yylval.info.tree_info = create_node("DIVIDE_EQUAL"); 
				return  DIVIDE_EQUAL; }
break;
case 41:
                       {  yylval.info.tree_info = create_node("REMAINDER_EQUAL"); 
				return  REMAINDER_EQUAL; }
break;
case 42:
                       {  yylval.info.tree_info = create_node("PLUS_EQUAL"); 
				return  PLUS_EQUAL; }
break;
case 43:
                       {  yylval.info.tree_info = create_node("AND_EQUAL"); 
				return  AND_EQUAL; }
break;
case 44:
                       {  yylval.info.tree_info = create_node("OR_EQUAL"); 
				return  OR_EQUAL; }
break;
case 45:
                       {  yylval.info.tree_info = create_node("XOR_EQUAL"); 
				return  XOR_EQUAL; }
break;
case 46:
                       {  yylval.info.tree_info = create_node("TIMES_EQUAL"); 
				return  MULTIPLY_EQUAL; }
break;
case 47:
                      {  yylval.info.tree_info = create_node("LSHIFT_EQUAL"); 
				return  LEFT_SHIFT_EQUAL; }
break;
case 48:
                      {  yylval.info.tree_info = create_node("RSHIFT_EQUAL"); 
				return  RIGHT_SHIFT_EQUAL; }
break;
case 49:
                        {  yylval.info.tree_info = create_node("EQUAL"); 
				return  EQUAL; }
break;
case 50:
                        {  yylval.info.tree_info = create_node("AMPERSAND"); 
				return  AMPERSAND; }
break;
case 51:
                        {  yylval.info.tree_info = create_node("CIRCUMFLEX"); 
				return  CIRCONFLEX; }
break;
case 52:
                        {  yylval.info.tree_info = create_node("OR"); 
				return  OR;  }
break;
case 53:
                       {  yylval.info.tree_info = create_node("AND_AND"); 
				return  AND_AND; }
break;
case 54:
                       {  yylval.info.tree_info = create_node("OR_OR"); 
				return  OR_OR;  }
break;
case 55:
                        {  yylval.info.tree_info = create_node("QUESTION"); 
				return  QUESTION; }
break;
case 56:
                        {  yylval.info.tree_info = create_node("COLON"); 
				return  COLON; }
break;
case 57:
                        {  yylval.info.tree_info = create_node("COMMA"); 
				return  COMMA; }
break;
case 58:
                        {  yylval.info.tree_info = create_node("SEMICOLON"); 
				return  SEMICOLON;  }
break;
case 59:
                      {  yylval.info.tree_info = create_node("ELLIPSIS"); 
				return  ELLIPSIS; }
break;
case 60:
              { 
                              {
                                 int i,j;
                                 struct SymbolTableNode *p;
      
                                 i = id_or_keyword(yytext);
                                 if (i == IDENTIFIER)
                                   {
                                     j = Lookup(yytext);
                                     p = (struct SymbolTableNode *) j;
                                     if (j == 0)
                                       {
                                         j = Insert(yytext);
                                         p = (struct SymbolTableNode *) j;
                                         p->count = 1;
                                       }
                                     else
                                         p->count = (p->count) + 1;
				     /* see if we've got a typedef name, and */
				     /* build a tree for the token.          */
                                     if (p->symtype == TYPEDEF_T) {
					 i = TYPEDEF_NAME;
					 yylval.info.tree_info = create_node("TYPEDEF_NAME");
				     }
				     else {
					 yylval.info.tree_info = create_node("IDENTIFIER");
				     }
				     add_child(yylval.info.tree_info,create_node(yytext));
				     yylval.info.symptr = p;
                                    };
                                  return i;
                                };
			    }
break;
case 61:
                 { break;     }
break;
case 62:
                          { printf("Illegal character <%s> \n",yytext);
			      printf("   (that is to say, %x)\n",yytext[0]);
                              break;    }
break;
case -1:
break;
default:
fprintf(yyout,"bad switch yylook %d",nstr);
} return(0); }
/* end of yylex */

/* ---------------------------------------------------------------------  */

typedef struct               /* routine to recognize keywords             */
{  char *name;
    int   val;
}
KWORD;

KWORD  KTab[] =              /* alphabetic keywords                       */
{
   {"auto",      AUTO      },
   {"break",     BREAK      },
   {"case",      CASE       },
   {"char",      CHAR       },
   {"const",	 CONST	    },
   {"continue",  CONTINUE   },
   {"default",   DEFAULT    },
   {"do",        DO         },
   {"double",    DOUBLE       },
   {"else",      ELSE       },
   {"enum",      ENUM       },
   {"extern",    EXTERN      },
   {"float",     FLOAT       },
   {"for",       FOR        },
   {"goto",      GOTO       },
   {"if",        IF         },
   {"int",       INT       },
   {"long",      LONG       },
   {"neighbour", NEIGHBOUR  },
   {"plural",    PLURAL     },
   {"receive",   RECEIVE    },
   {"register",  REGISTER      },
   {"return",    RETURN     },
   {"send",      SEND       },
   {"shared",    SHARED     },
   {"short",     SHORT       },
   {"signed",    SIGNED       },
   {"sizeof",    SIZEOF     },
   {"static",    STATIC      },
   {"struct",    STRUCT     },
   {"switch",    SWITCH     },
   {"typedef",   TYPEDEF      },
   {"union",     C_UNION     },
   {"unsigned",  UNSIGNED       },
   {"vector",    VECTOR     },
   {"void",      VOID       },
   {"volatile",  VOLATILE       },
   {"while",     WHILE      },

};

int  cmp_str (a,b)
KWORD *a, *b;
{ return  strcmp(a->name, b->name);
}

int  cmp_val (a,b)
KWORD *a, *b;
{ return  (a->val > b->val);
}

int  id_or_keyword (lex)     /* do a binary search for a possible keyword*/
char  *lex;                  /* in KTab. Return the token if it is in the*/
{                            /* table, IDENTIFIER otherwise.             */
    KWORD  *p;
    KWORD  dummy;

    dummy.name = lex;
    p = (KWORD *) bsearch(&dummy,KTab, sizeof(KTab) / sizeof(KWORD),
                   sizeof(KWORD), cmp_str);

    /* build a node for keywords; identifiers and typedef names will get */
    /* build by the pattern matching code above.			 */
    if (p != NULL) {
	yylval.info.tree_info = create_node(p->name);
    }
    return(p ? p->val : IDENTIFIER);

}

#include "symtbl.c"
int yyvstop[] = {
0,

62,
0,

61,
62,
0,

61,
0,

25,
62,
0,

62,
0,

28,
62,
0,

50,
62,
0,

62,
0,

14,
62,
0,

15,
62,
0,

26,
62,
0,

29,
62,
0,

57,
62,
0,

30,
62,
0,

21,
62,
0,

27,
62,
0,

8,
62,
0,

11,
62,
0,

56,
62,
0,

58,
62,
0,

33,
62,
0,

49,
62,
0,

34,
62,
0,

55,
62,
0,

60,
62,
0,

18,
62,
0,

19,
62,
0,

51,
62,
0,

16,
62,
0,

52,
62,
0,

17,
62,
0,

24,
62,
0,

37,
0,

3,
0,

2,
0,

41,
0,

53,
0,

43,
0,

46,
0,

22,
0,

42,
0,

23,
0,

39,
0,

20,
0,

12,
0,

1,
0,

40,
0,

12,
0,

8,
0,

8,
0,

11,
0,

11,
0,

32,
0,

35,
0,

38,
0,

36,
0,

31,
0,

60,
0,

45,
0,

44,
0,

54,
0,

2,
0,

4,
0,

4,
0,

59,
0,

12,
0,

13,
0,

10,
0,

9,
0,

47,
0,

48,
0,

5,
0,

6,
0,

12,
0,

13,
0,

10,
0,

9,
0,

7,
0,
0};
# define YYTYPE char
struct yywork { YYTYPE verify, advance; } yycrank[] = {
0,0,	0,0,	1,3,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	1,4,	1,5,	
0,0,	0,0,	1,4,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
4,5,	4,5,	0,0,	0,0,	
4,5,	0,0,	1,6,	1,7,	
0,0,	0,0,	1,8,	1,9,	
1,10,	1,11,	1,12,	1,13,	
1,14,	1,15,	1,16,	1,17,	
1,18,	1,19,	1,20,	4,5,	
9,41,	43,76,	51,81,	14,46,	
77,90,	1,20,	99,91,	1,21,	
1,22,	1,23,	1,24,	1,25,	
1,26,	6,35,	1,27,	8,40,	
13,45,	18,53,	1,27,	1,27,	
1,27,	14,47,	16,48,	9,42,	
24,66,	1,27,	23,64,	23,65,	
25,67,	25,68,	30,70,	32,71,	
39,75,	64,88,	1,27,	68,89,	
18,54,	1,27,	16,49,	16,50,	
1,28,	1,3,	1,29,	1,30,	
36,39,	75,39,	1,27,	102,100,	
0,0,	0,0,	0,0,	1,27,	
0,0,	2,6,	0,0,	0,0,	
0,0,	2,8,	2,9,	1,27,	
2,11,	2,12,	2,13,	0,0,	
2,15,	2,16,	2,17,	2,18,	
0,0,	0,0,	0,0,	0,0,	
1,31,	1,32,	1,33,	1,34,	
0,0,	0,0,	2,21,	2,22,	
2,23,	2,24,	2,25,	2,26,	
7,36,	0,0,	0,0,	0,0,	
0,0,	0,0,	39,39,	0,0,	
7,36,	7,37,	32,72,	17,51,	
7,37,	17,52,	17,52,	17,52,	
17,52,	17,52,	17,52,	17,52,	
17,52,	17,52,	17,52,	0,0,	
0,0,	85,96,	86,97,	2,28,	
2,3,	2,29,	2,30,	85,96,	
0,0,	7,38,	0,0,	86,97,	
0,0,	0,0,	7,36,	0,0,	
87,98,	0,0,	7,36,	0,0,	
95,83,	0,0,	0,0,	7,36,	
7,36,	87,98,	95,83,	0,0,	
0,0,	0,0,	0,0,	7,36,	
0,0,	85,96,	86,97,	2,31,	
0,0,	2,33,	2,34,	85,96,	
7,36,	10,43,	0,0,	86,97,	
7,36,	7,36,	7,36,	0,0,	
87,98,	10,43,	10,0,	7,36,	
95,83,	10,43,	0,0,	0,0,	
0,0,	87,98,	95,83,	0,0,	
7,36,	0,0,	0,0,	7,36,	
0,0,	0,0,	0,0,	7,39,	
0,0,	0,0,	0,0,	0,0,	
7,36,	0,0,	10,43,	0,0,	
0,0,	7,36,	0,0,	10,43,	
0,0,	0,0,	0,0,	10,43,	
0,0,	7,36,	0,0,	0,0,	
10,43,	10,43,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
10,43,	0,0,	0,0,	7,36,	
0,0,	0,0,	0,0,	0,0,	
0,0,	10,43,	0,0,	0,0,	
79,91,	10,43,	10,43,	10,43,	
0,0,	0,0,	0,0,	0,0,	
10,43,	79,92,	79,92,	79,92,	
79,92,	79,92,	79,92,	79,92,	
79,92,	10,43,	0,0,	0,0,	
10,43,	0,0,	0,0,	0,0,	
10,44,	0,0,	0,0,	0,0,	
0,0,	10,43,	0,0,	0,0,	
0,0,	0,0,	10,43,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	19,55,	10,43,	19,56,	
19,56,	19,56,	19,56,	19,56,	
19,56,	19,56,	19,56,	19,57,	
19,57,	0,0,	0,0,	0,0,	
10,43,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
19,58,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	19,59,	
92,99,	92,99,	92,99,	92,99,	
92,99,	92,99,	92,99,	92,99,	
19,59,	0,0,	0,0,	19,60,	
20,55,	0,0,	20,62,	20,62,	
20,62,	20,62,	20,62,	20,62,	
20,62,	20,62,	20,62,	20,62,	
19,58,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	19,59,	
0,0,	0,0,	0,0,	20,58,	
0,0,	0,0,	0,0,	0,0,	
19,59,	0,0,	20,63,	19,61,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	20,63,	
55,55,	55,55,	55,55,	55,55,	
55,55,	55,55,	55,55,	55,55,	
55,55,	55,55,	0,0,	0,0,	
0,0,	0,0,	0,0,	20,58,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	20,63,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	20,63,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	0,0,	
0,0,	0,0,	0,0,	27,69,	
0,0,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	27,69,	
27,69,	27,69,	27,69,	37,73,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	37,73,	
0,0,	0,0,	0,0,	0,0,	
52,52,	52,52,	52,52,	52,52,	
52,52,	52,52,	52,52,	52,52,	
52,52,	52,52,	56,56,	56,56,	
56,56,	56,56,	56,56,	56,56,	
56,56,	56,56,	56,57,	56,57,	
37,0,	52,82,	52,83,	0,0,	
0,0,	37,73,	0,0,	0,0,	
52,83,	37,73,	0,0,	0,0,	
0,0,	0,0,	37,73,	37,73,	
0,0,	0,0,	56,59,	0,0,	
0,0,	0,0,	37,73,	0,0,	
0,0,	0,0,	0,0,	56,59,	
0,0,	0,0,	0,0,	37,73,	
0,0,	52,82,	52,83,	37,73,	
37,73,	37,73,	0,0,	0,0,	
52,83,	0,0,	37,73,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	56,59,	37,73,	
0,0,	0,0,	37,73,	0,0,	
0,0,	0,0,	37,74,	56,59,	
0,0,	0,0,	0,0,	37,73,	
44,77,	0,0,	0,0,	0,0,	
37,73,	44,78,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
37,73,	0,0,	44,79,	44,79,	
44,79,	44,79,	44,79,	44,79,	
44,79,	44,79,	0,0,	0,0,	
0,0,	0,0,	37,73,	0,0,	
57,55,	44,77,	57,57,	57,57,	
57,57,	57,57,	57,57,	57,57,	
57,57,	57,57,	57,57,	57,57,	
84,85,	84,85,	84,85,	84,85,	
84,85,	84,85,	84,85,	84,85,	
84,85,	84,85,	0,0,	57,58,	
0,0,	0,0,	44,80,	0,0,	
0,0,	0,0,	44,77,	0,0,	
0,0,	0,0,	0,0,	44,77,	
44,77,	0,0,	0,0,	0,0,	
44,77,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
44,77,	0,0,	0,0,	0,0,	
44,77,	0,0,	44,77,	57,58,	
44,77,	0,0,	44,80,	58,84,	
0,0,	58,84,	44,80,	0,0,	
58,85,	58,85,	58,85,	58,85,	
58,85,	58,85,	58,85,	58,85,	
58,85,	58,85,	60,86,	60,86,	
60,86,	60,86,	60,86,	60,86,	
60,86,	60,86,	60,86,	60,86,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	60,86,	
60,86,	60,86,	60,86,	60,86,	
60,86,	61,87,	61,87,	61,87,	
61,87,	61,87,	61,87,	61,87,	
61,87,	61,87,	61,87,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	61,87,	61,87,	
61,87,	61,87,	61,87,	61,87,	
0,0,	73,73,	0,0,	60,86,	
60,86,	60,86,	60,86,	60,86,	
60,86,	73,73,	82,94,	0,0,	
82,94,	0,0,	0,0,	82,95,	
82,95,	82,95,	82,95,	82,95,	
82,95,	82,95,	82,95,	82,95,	
82,95,	74,73,	61,87,	61,87,	
61,87,	61,87,	61,87,	61,87,	
0,0,	74,73,	73,0,	0,0,	
0,0,	0,0,	0,0,	73,73,	
0,0,	0,0,	0,0,	73,73,	
0,0,	0,0,	0,0,	0,0,	
73,73,	73,73,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
73,73,	0,0,	74,73,	0,0,	
0,0,	0,0,	0,0,	74,73,	
0,0,	73,73,	0,0,	74,73,	
0,0,	73,73,	73,73,	73,73,	
74,73,	74,73,	0,0,	0,0,	
73,73,	0,0,	0,0,	0,0,	
74,73,	0,0,	0,0,	0,0,	
0,0,	73,73,	0,0,	0,0,	
73,73,	74,73,	0,0,	0,0,	
73,74,	74,73,	74,73,	74,73,	
0,0,	73,73,	0,0,	0,0,	
74,73,	0,0,	73,73,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	74,73,	73,73,	0,0,	
74,73,	0,0,	0,0,	0,0,	
74,74,	0,0,	0,0,	0,0,	
0,0,	74,73,	0,0,	0,0,	
73,73,	0,0,	74,73,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	74,73,	80,93,	
80,93,	80,93,	80,93,	80,93,	
80,93,	80,93,	80,93,	80,93,	
80,93,	0,0,	0,0,	0,0,	
74,73,	93,100,	0,0,	0,0,	
80,93,	80,93,	80,93,	80,93,	
80,93,	80,93,	93,101,	93,101,	
93,101,	93,101,	93,101,	93,101,	
93,101,	93,101,	93,101,	93,101,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	93,101,	
93,101,	93,101,	93,101,	93,101,	
93,101,	0,0,	0,0,	0,0,	
80,93,	80,93,	80,93,	80,93,	
80,93,	80,93,	94,95,	94,95,	
94,95,	94,95,	94,95,	94,95,	
94,95,	94,95,	94,95,	94,95,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	93,101,	
93,101,	93,101,	93,101,	93,101,	
93,101,	101,102,	101,102,	101,102,	
101,102,	101,102,	101,102,	101,102,	
101,102,	101,102,	101,102,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	101,102,	101,102,	
101,102,	101,102,	101,102,	101,102,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	0,0,	0,0,	
0,0,	0,0,	101,102,	101,102,	
101,102,	101,102,	101,102,	101,102,	
0,0};
struct yysvf yysvec[] = {
0,	0,	0,
yycrank+-1,	0,		0,	
yycrank+-72,	yysvec+1,	0,	
yycrank+0,	0,		yyvstop+1,
yycrank+19,	0,		yyvstop+3,
yycrank+0,	yysvec+4,	yyvstop+6,
yycrank+4,	0,		yyvstop+8,
yycrank+-135,	0,		yyvstop+11,
yycrank+6,	0,		yyvstop+13,
yycrank+14,	0,		yyvstop+16,
yycrank+-200,	0,		yyvstop+19,
yycrank+0,	0,		yyvstop+21,
yycrank+0,	0,		yyvstop+24,
yycrank+7,	0,		yyvstop+27,
yycrank+12,	0,		yyvstop+30,
yycrank+0,	0,		yyvstop+33,
yycrank+29,	0,		yyvstop+36,
yycrank+101,	0,		yyvstop+39,
yycrank+27,	0,		yyvstop+42,
yycrank+263,	0,		yyvstop+45,
yycrank+306,	0,		yyvstop+48,
yycrank+0,	0,		yyvstop+51,
yycrank+0,	0,		yyvstop+54,
yycrank+18,	0,		yyvstop+57,
yycrank+15,	0,		yyvstop+60,
yycrank+19,	0,		yyvstop+63,
yycrank+0,	0,		yyvstop+66,
yycrank+376,	0,		yyvstop+69,
yycrank+0,	0,		yyvstop+72,
yycrank+0,	0,		yyvstop+75,
yycrank+21,	0,		yyvstop+78,
yycrank+0,	0,		yyvstop+81,
yycrank+22,	0,		yyvstop+84,
yycrank+0,	0,		yyvstop+87,
yycrank+0,	0,		yyvstop+90,
yycrank+0,	0,		yyvstop+93,
yycrank+-4,	yysvec+7,	0,	
yycrank+-498,	yysvec+7,	yyvstop+95,
yycrank+0,	0,		yyvstop+97,
yycrank+-50,	yysvec+7,	0,	
yycrank+0,	0,		yyvstop+99,
yycrank+0,	0,		yyvstop+101,
yycrank+0,	0,		yyvstop+103,
yycrank+14,	0,		0,	
yycrank+562,	0,		0,	
yycrank+0,	0,		yyvstop+105,
yycrank+0,	0,		yyvstop+107,
yycrank+0,	0,		yyvstop+109,
yycrank+0,	0,		yyvstop+111,
yycrank+0,	0,		yyvstop+113,
yycrank+0,	0,		yyvstop+115,
yycrank+8,	0,		0,	
yycrank+464,	0,		yyvstop+117,
yycrank+0,	0,		yyvstop+119,
yycrank+0,	0,		yyvstop+121,
yycrank+344,	yysvec+52,	yyvstop+123,
yycrank+474,	yysvec+20,	yyvstop+125,
yycrank+578,	0,		0,	
yycrank+640,	0,		0,	
yycrank+0,	0,		yyvstop+127,
yycrank+650,	0,		0,	
yycrank+673,	0,		0,	
yycrank+0,	yysvec+20,	yyvstop+129,
yycrank+0,	0,		yyvstop+131,
yycrank+24,	0,		yyvstop+133,
yycrank+0,	0,		yyvstop+135,
yycrank+0,	0,		yyvstop+137,
yycrank+0,	0,		yyvstop+139,
yycrank+26,	0,		yyvstop+141,
yycrank+0,	yysvec+27,	yyvstop+143,
yycrank+0,	0,		yyvstop+145,
yycrank+0,	0,		yyvstop+147,
yycrank+0,	0,		yyvstop+149,
yycrank+-744,	yysvec+7,	0,	
yycrank+-768,	yysvec+7,	0,	
yycrank+-5,	yysvec+7,	yyvstop+151,
yycrank+0,	0,		yyvstop+153,
yycrank+17,	0,		0,	
yycrank+0,	yysvec+77,	yyvstop+155,
yycrank+229,	0,		0,	
yycrank+831,	0,		0,	
yycrank+0,	0,		yyvstop+157,
yycrank+711,	0,		0,	
yycrank+0,	0,		yyvstop+159,
yycrank+588,	0,		0,	
yycrank+91,	yysvec+84,	yyvstop+161,
yycrank+86,	yysvec+60,	yyvstop+163,
yycrank+100,	yysvec+61,	yyvstop+165,
yycrank+0,	0,		yyvstop+167,
yycrank+0,	0,		yyvstop+169,
yycrank+0,	0,		yyvstop+171,
yycrank+0,	0,		yyvstop+173,
yycrank+292,	yysvec+79,	0,	
yycrank+854,	0,		0,	
yycrank+886,	0,		0,	
yycrank+110,	yysvec+94,	yyvstop+175,
yycrank+0,	0,		yyvstop+177,
yycrank+0,	0,		yyvstop+179,
yycrank+0,	0,		yyvstop+181,
yycrank+19,	0,		0,	
yycrank+0,	0,		yyvstop+183,
yycrank+909,	yysvec+93,	0,	
yycrank+60,	0,		0,	
0,	0,	0};
struct yywork *yytop = yycrank+1011;
struct yysvf *yybgin = yysvec+1;
char yymatch[] = {
00  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
01  ,011 ,012 ,01  ,01  ,015 ,01  ,01  ,
01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
011 ,01  ,'"' ,01  ,01  ,01  ,01  ,047 ,
01  ,01  ,01  ,'+' ,01  ,'+' ,01  ,01  ,
'0' ,'1' ,'1' ,'1' ,'1' ,'1' ,'1' ,'1' ,
'8' ,'8' ,01  ,01  ,01  ,01  ,01  ,047 ,
01  ,'A' ,'A' ,'A' ,'A' ,'E' ,'F' ,'G' ,
'G' ,'G' ,'G' ,'G' ,'L' ,'G' ,'G' ,'G' ,
'G' ,'G' ,'G' ,'G' ,'G' ,'U' ,'G' ,'G' ,
'X' ,'G' ,'G' ,01  ,047 ,01  ,01  ,'G' ,
01  ,'a' ,'a' ,'A' ,'A' ,'E' ,'f' ,'G' ,
'G' ,'G' ,'G' ,'G' ,'L' ,'G' ,'n' ,'G' ,
'G' ,'G' ,'n' ,'G' ,'n' ,'U' ,'n' ,'G' ,
'X' ,'G' ,'G' ,01  ,'|' ,01  ,01  ,01  ,
0};
char yyextra[] = {
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0};
#ifndef lint
static	char ncform_sccsid[] = "@(#)ncform 1.6 88/02/08 SMI"; /* from S5R2 1.2 */
#endif

int yylineno =1;
# define YYU(x) x
# define NLSTATE yyprevious=YYNEWLINE
char yytext[YYLMAX];
struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
char yysbuf[YYLMAX];
char *yysptr = yysbuf;
int *yyfnd;
extern struct yysvf *yyestate;
int yyprevious = YYNEWLINE;
yylook(){
	register struct yysvf *yystate, **lsp;
	register struct yywork *yyt;
	struct yysvf *yyz;
	int yych, yyfirst;
	struct yywork *yyr;
# ifdef LEXDEBUG
	int debug;
# endif
	char *yylastch;
	/* start off machines */
# ifdef LEXDEBUG
	debug = 0;
# endif
	yyfirst=1;
	if (!yymorfg)
		yylastch = yytext;
	else {
		yymorfg=0;
		yylastch = yytext+yyleng;
		}
	for(;;){
		lsp = yylstate;
		yyestate = yystate = yybgin;
		if (yyprevious==YYNEWLINE) yystate++;
		for (;;){
# ifdef LEXDEBUG
			if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
# endif
			yyt = yystate->yystoff;
			if(yyt == yycrank && !yyfirst){  /* may not be any transitions */
				yyz = yystate->yyother;
				if(yyz == 0)break;
				if(yyz->yystoff == yycrank)break;
				}
			*yylastch++ = yych = input();
			yyfirst=0;
		tryagain:
# ifdef LEXDEBUG
			if(debug){
				fprintf(yyout,"char ");
				allprint(yych);
				putchar('\n');
				}
# endif
			yyr = yyt;
			if ( (int)yyt > (int)yycrank){
				yyt = yyr + yych;
				if (yyt <= yytop && yyt->verify+yysvec == yystate){
					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
						{unput(*--yylastch);break;}
					*lsp++ = yystate = yyt->advance+yysvec;
					goto contin;
					}
				}
# ifdef YYOPTIM
			else if((int)yyt < (int)yycrank) {		/* r < yycrank */
				yyt = yyr = yycrank+(yycrank-yyt);
# ifdef LEXDEBUG
				if(debug)fprintf(yyout,"compressed state\n");
# endif
				yyt = yyt + yych;
				if(yyt <= yytop && yyt->verify+yysvec == yystate){
					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
						{unput(*--yylastch);break;}
					*lsp++ = yystate = yyt->advance+yysvec;
					goto contin;
					}
				yyt = yyr + YYU(yymatch[yych]);
# ifdef LEXDEBUG
				if(debug){
					fprintf(yyout,"try fall back character ");
					allprint(YYU(yymatch[yych]));
					putchar('\n');
					}
# endif
				if(yyt <= yytop && yyt->verify+yysvec == yystate){
					if(yyt->advance+yysvec == YYLERR)	/* error transition */
						{unput(*--yylastch);break;}
					*lsp++ = yystate = yyt->advance+yysvec;
					goto contin;
					}
				}
			if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
# ifdef LEXDEBUG
				if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
# endif
				goto tryagain;
				}
# endif
			else
				{unput(*--yylastch);break;}
		contin:
# ifdef LEXDEBUG
			if(debug){
				fprintf(yyout,"state %d char ",yystate-yysvec-1);
				allprint(yych);
				putchar('\n');
				}
# endif
			;
			}
# ifdef LEXDEBUG
		if(debug){
			fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
			allprint(yych);
			putchar('\n');
			}
# endif
		while (lsp-- > yylstate){
			*yylastch-- = 0;
			if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
				yyolsp = lsp;
				if(yyextra[*yyfnd]){		/* must backup */
					while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
						lsp--;
						unput(*yylastch--);
						}
					}
				yyprevious = YYU(*yylastch);
				yylsp = lsp;
				yyleng = yylastch-yytext+1;
				yytext[yyleng] = 0;
# ifdef LEXDEBUG
				if(debug){
					fprintf(yyout,"\nmatch ");
					sprint(yytext);
					fprintf(yyout," action %d\n",*yyfnd);
					}
# endif
				return(*yyfnd++);
				}
			unput(*yylastch);
			}
		if (yytext[0] == 0  /* && feof(yyin) */)
			{
			yysptr=yysbuf;
			return(0);
			}
		yyprevious = yytext[0] = input();
		if (yyprevious>0)
			output(yyprevious);
		yylastch=yytext;
# ifdef LEXDEBUG
		if(debug)putchar('\n');
# endif
		}
	}
yyback(p, m)
	int *p;
{
if (p==0) return(0);
while (*p)
	{
	if (*p++ == m)
		return(1);
	}
return(0);
}
	/* the following are only used in the lex library */
yyinput(){
	return(input());
	}
yyoutput(c)
  int c; {
	output(c);
	}
yyunput(c)
   int c; {
	unput(c);
	}
