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