1#define YYFLAG -1000 2#define YYERROR goto yyerrlab 3#define YYACCEPT return(0) 4#define YYABORT return(1) 5#define yyclearin yychar = -1 6#define yyerrok yyerrflag = 0 7 8#ifdef yydebug 9#include "y.debug" 10#else 11#define yydebug 0 12char* yytoknames[1]; /* for debugging */ 13char* yystates[1]; /* for debugging */ 14#endif 15 16/* parser for yacc output */ 17 18int yynerrs = 0; /* number of errors */ 19int yyerrflag = 0; /* error recovery flag */ 20 21char* 22yytokname(int yyc) 23{ 24 static char x[16]; 25 26 if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) 27 if(yytoknames[yyc-1]) 28 return yytoknames[yyc-1]; 29 sprintf(x, "<%d>", yyc); 30 return x; 31} 32 33char* 34yystatname(int yys) 35{ 36 static char x[16]; 37 38 if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) 39 if(yystates[yys]) 40 return yystates[yys]; 41 sprintf(x, "<%d>\n", yys); 42 return x; 43} 44 45long 46yylex1(void) 47{ 48 long yychar; 49 long *t3p; 50 int c; 51 52 yychar = yylex(); 53 if(yychar <= 0) { 54 c = yytok1[0]; 55 goto out; 56 } 57 if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { 58 c = yytok1[yychar]; 59 goto out; 60 } 61 if(yychar >= YYPRIVATE) 62 if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { 63 c = yytok2[yychar-YYPRIVATE]; 64 goto out; 65 } 66 for(t3p=yytok3;; t3p+=2) { 67 c = t3p[0]; 68 if(c == yychar) { 69 c = t3p[1]; 70 goto out; 71 } 72 if(c == 0) 73 break; 74 } 75 c = 0; 76 77out: 78 if(c == 0) 79 c = yytok2[1]; /* unknown char */ 80 if(yydebug >= 3) 81 printf("lex %.4lX %s\n", yychar, yytokname(c)); 82 return c; 83} 84 85int 86yyparse(void) 87{ 88 struct 89 { 90 YYSTYPE yyv; 91 int yys; 92 } yys[YYMAXDEPTH], *yyp, *yypt; 93 short *yyxi; 94 int yyj, yym, yystate, yyn, yyg; 95 YYSTYPE save1, save2; 96 int save3, save4; 97 long yychar; 98 99 save1 = yylval; 100 save2 = yyval; 101 save3 = yynerrs; 102 save4 = yyerrflag; 103 104 yystate = 0; 105 yychar = -1; 106 yynerrs = 0; 107 yyerrflag = 0; 108 yyp = &yys[-1]; 109 goto yystack; 110 111ret0: 112 yyn = 0; 113 goto ret; 114 115ret1: 116 yyn = 1; 117 goto ret; 118 119ret: 120 yylval = save1; 121 yyval = save2; 122 yynerrs = save3; 123 yyerrflag = save4; 124 return yyn; 125 126yystack: 127 /* put a state and value onto the stack */ 128 if(yydebug >= 4) 129 printf("char %s in %s", yytokname(yychar), yystatname(yystate)); 130 131 yyp++; 132 if(yyp >= &yys[YYMAXDEPTH]) { 133 yyerror("yacc stack overflow"); 134 goto ret1; 135 } 136 yyp->yys = yystate; 137 yyp->yyv = yyval; 138 139yynewstate: 140 yyn = yypact[yystate]; 141 if(yyn <= YYFLAG) 142 goto yydefault; /* simple state */ 143 if(yychar < 0) 144 yychar = yylex1(); 145 yyn += yychar; 146 if(yyn < 0 || yyn >= YYLAST) 147 goto yydefault; 148 yyn = yyact[yyn]; 149 if(yychk[yyn] == yychar) { /* valid shift */ 150 yychar = -1; 151 yyval = yylval; 152 yystate = yyn; 153 if(yyerrflag > 0) 154 yyerrflag--; 155 goto yystack; 156 } 157 158yydefault: 159 /* default state action */ 160 yyn = yydef[yystate]; 161 if(yyn == -2) { 162 if(yychar < 0) 163 yychar = yylex1(); 164 165 /* look through exception table */ 166 for(yyxi=yyexca;; yyxi+=2) 167 if(yyxi[0] == -1 && yyxi[1] == yystate) 168 break; 169 for(yyxi += 2;; yyxi += 2) { 170 yyn = yyxi[0]; 171 if(yyn < 0 || yyn == yychar) 172 break; 173 } 174 yyn = yyxi[1]; 175 if(yyn < 0) 176 goto ret0; 177 } 178 if(yyn == 0) { 179 /* error ... attempt to resume parsing */ 180 switch(yyerrflag) { 181 case 0: /* brand new error */ 182 yyerror("syntax error"); 183 if(yydebug >= 1) { 184 printf("%s", yystatname(yystate)); 185 printf("saw %s\n", yytokname(yychar)); 186 } 187yyerrlab: 188 yynerrs++; 189 190 case 1: 191 case 2: /* incompletely recovered error ... try again */ 192 yyerrflag = 3; 193 194 /* find a state where "error" is a legal shift action */ 195 while(yyp >= yys) { 196 yyn = yypact[yyp->yys] + YYERRCODE; 197 if(yyn >= 0 && yyn < YYLAST) { 198 yystate = yyact[yyn]; /* simulate a shift of "error" */ 199 if(yychk[yystate] == YYERRCODE) 200 goto yystack; 201 } 202 203 /* the current yyp has no shift onn "error", pop stack */ 204 if(yydebug >= 2) 205 printf("error recovery pops state %d, uncovers %d\n", 206 yyp->yys, (yyp-1)->yys ); 207 yyp--; 208 } 209 /* there is no state on the stack with an error shift ... abort */ 210 goto ret1; 211 212 case 3: /* no shift yet; clobber input char */ 213 if(yydebug >= YYEOFCODE) 214 printf("error recovery discards %s\n", yytokname(yychar)); 215 if(yychar == YYEOFCODE) 216 goto ret1; 217 yychar = -1; 218 goto yynewstate; /* try again in the same state */ 219 } 220 } 221 222 /* reduction by production yyn */ 223 if(yydebug >= 2) 224 printf("reduce %d in:\n\t%s", yyn, yystatname(yystate)); 225 226 yypt = yyp; 227 yyp -= yyr2[yyn]; 228 yyval = (yyp+1)->yyv; 229 yym = yyn; 230 231 /* consult goto table to find next state */ 232 yyn = yyr1[yyn]; 233 yyg = yypgo[yyn]; 234 yyj = yyg + yyp->yys + 1; 235 236 if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) 237 yystate = yyact[yyg]; 238 switch(yym) { 239 $A 240 } 241 goto yystack; /* stack new state and value */ 242} 243