1 #ifndef lint
2 static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90";
3 #endif
4 #define YYBYACC 1
5 #line 56 "/usr/src/games/atc/grammar.y"
6 typedef union {
7 int ival;
8 char cval;
9 } YYSTYPE;
10 #line 62 "/usr/src/games/atc/grammar.y"
11 #include "include.h"
12
13 #ifndef lint
14 static char sccsid[] = "@(#)grammar.y 5.2 (Berkeley) 4/30/90";
15 #endif /* not lint */
16
17 int errors = 0;
18 int line = 1;
19 #line 20 "y.tab.c"
20 #define HeightOp 257
21 #define WidthOp 258
22 #define UpdateOp 259
23 #define NewplaneOp 260
24 #define DirOp 261
25 #define ConstOp 262
26 #define LineOp 263
27 #define AirportOp 264
28 #define BeaconOp 265
29 #define ExitOp 266
30 #define YYERRCODE 256
31 short yylhs[] = { -1,
32 3, 0, 1, 1, 4, 4, 4, 4, 5, 6,
33 8, 7, 2, 2, 9, 9, 9, 9, 10, 10,
34 14, 11, 11, 15, 13, 13, 16, 12, 12, 17,
35 };
36 short yylen[] = { 2,
37 0, 3, 2, 1, 1, 1, 1, 1, 4, 4,
38 4, 4, 2, 1, 4, 4, 4, 4, 2, 1,
39 4, 2, 1, 5, 2, 1, 5, 2, 1, 10,
40 };
41 short yydefred[] = { 0,
42 0, 0, 0, 0, 0, 1, 0, 5, 6, 7,
43 8, 0, 0, 0, 0, 0, 3, 0, 0, 0,
44 0, 0, 0, 0, 0, 2, 0, 11, 12, 9,
45 10, 0, 0, 0, 0, 13, 0, 0, 0, 0,
46 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
47 28, 0, 18, 25, 0, 15, 19, 0, 16, 22,
48 0, 0, 0, 0, 0, 0, 21, 0, 0, 27,
49 24, 0, 0, 0, 0, 30,
50 };
51 short yydgoto[] = { 5,
52 6, 26, 16, 7, 8, 9, 10, 11, 27, 44,
53 47, 38, 41, 45, 48, 42, 39,
54 };
55 short yysindex[] = { -257,
56 -49, -48, -47, -46, 0, 0, -257, 0, 0, 0,
57 0, -246, -245, -244, -243, -259, 0, -39, -38, -37,
58 -36, -34, -33, -32, -31, 0, -259, 0, 0, 0,
59 0, -63, -11, -10, -9, 0, -8, -26, -63, -228,
60 -24, -11, -226, -22, -10, -224, -20, -9, -222, 0,
61 0, -221, 0, 0, -220, 0, 0, -219, 0, 0,
62 -218, -216, 5, -214, 7, 8, 0, 9, 11, 0,
63 0, -210, -209, 13, -35, 0,
64 };
65 short yyrindex[] = { 0,
66 0, 0, 0, 0, 0, 0, -255, 0, 0, 0,
67 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0, 55, 0, 0, 0,
69 0, 0, 0, 0, 0, 0, 0, 0, -38, 0,
70 0, -3, 0, 0, -2, 0, 0, 1, 0, 0,
71 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73 0, 0, 0, 0, 0, 0,
74 };
75 short yygindex[] = { 0,
76 52, 34, 0, 0, 0, 0, 0, 0, 0, 17,
77 15, 25, 23, 0, 0, 0, 0,
78 };
79 #define YYTABLESIZE 65
80 short yytable[] = { 1,
81 2, 3, 4, 22, 23, 24, 25, 4, 4, 4,
82 4, 12, 13, 14, 15, 18, 19, 20, 21, 28,
83 29, 30, 31, 32, 33, 34, 35, 37, 40, 43,
84 46, 49, 50, 52, 53, 55, 56, 58, 59, 61,
85 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
86 72, 73, 74, 75, 14, 26, 20, 76, 17, 23,
87 36, 57, 60, 51, 54,
88 };
89 short yycheck[] = { 257,
90 258, 259, 260, 263, 264, 265, 266, 263, 264, 265,
91 266, 61, 61, 61, 61, 262, 262, 262, 262, 59,
92 59, 59, 59, 58, 58, 58, 58, 91, 40, 40,
93 40, 40, 59, 262, 59, 262, 59, 262, 59, 262,
94 262, 262, 262, 262, 261, 41, 261, 41, 41, 41,
95 40, 262, 262, 41, 0, 59, 59, 93, 7, 59,
96 27, 45, 48, 39, 42,
97 };
98 #define YYFINAL 5
99 #ifndef YYDEBUG
100 #define YYDEBUG 0
101 #endif
102 #define YYMAXTOKEN 266
103 #if YYDEBUG
104 char *yyname[] = {
105 "end-of-file",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,
106 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,
107 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,
108 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,
109 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,
110 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,
111 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,
112 "HeightOp","WidthOp","UpdateOp","NewplaneOp","DirOp","ConstOp","LineOp",
113 "AirportOp","BeaconOp","ExitOp",
114 };
115 char *yyrule[] = {
116 "$accept : file",
117 "$$1 :",
118 "file : bunch_of_defs $$1 bunch_of_lines",
119 "bunch_of_defs : def bunch_of_defs",
120 "bunch_of_defs : def",
121 "def : udef",
122 "def : ndef",
123 "def : wdef",
124 "def : hdef",
125 "udef : UpdateOp '=' ConstOp ';'",
126 "ndef : NewplaneOp '=' ConstOp ';'",
127 "hdef : HeightOp '=' ConstOp ';'",
128 "wdef : WidthOp '=' ConstOp ';'",
129 "bunch_of_lines : line bunch_of_lines",
130 "bunch_of_lines : line",
131 "line : BeaconOp ':' Bpoint_list ';'",
132 "line : ExitOp ':' Epoint_list ';'",
133 "line : LineOp ':' Lline_list ';'",
134 "line : AirportOp ':' Apoint_list ';'",
135 "Bpoint_list : Bpoint Bpoint_list",
136 "Bpoint_list : Bpoint",
137 "Bpoint : '(' ConstOp ConstOp ')'",
138 "Epoint_list : Epoint Epoint_list",
139 "Epoint_list : Epoint",
140 "Epoint : '(' ConstOp ConstOp DirOp ')'",
141 "Apoint_list : Apoint Apoint_list",
142 "Apoint_list : Apoint",
143 "Apoint : '(' ConstOp ConstOp DirOp ')'",
144 "Lline_list : Lline Lline_list",
145 "Lline_list : Lline",
146 "Lline : '[' '(' ConstOp ConstOp ')' '(' ConstOp ConstOp ')' ']'",
147 };
148 #endif
149 #define yyclearin (yychar=(-1))
150 #define yyerrok (yyerrflag=0)
151 #ifdef YYSTACKSIZE
152 #ifndef YYMAXDEPTH
153 #define YYMAXDEPTH YYSTACKSIZE
154 #endif
155 #else
156 #ifdef YYMAXDEPTH
157 #define YYSTACKSIZE YYMAXDEPTH
158 #else
159 #define YYSTACKSIZE 500
160 #define YYMAXDEPTH 500
161 #endif
162 #endif
163 int yydebug;
164 int yynerrs;
165 int yyerrflag;
166 int yychar;
167 short *yyssp;
168 YYSTYPE *yyvsp;
169 YYSTYPE yyval;
170 YYSTYPE yylval;
171 short yyss[YYSTACKSIZE];
172 YYSTYPE yyvs[YYSTACKSIZE];
173 #define yystacksize YYSTACKSIZE
174 #line 284 "/usr/src/games/atc/grammar.y"
175
check_edge(x,y)176 check_edge(x, y)
177 {
178 if (!(x == 0) && !(x == sp->width - 1) &&
179 !(y == 0) && !(y == sp->height - 1))
180 yyerror("edge value not on edge.");
181 }
182
check_point(x,y)183 check_point(x, y)
184 {
185 if (x < 1 || x >= sp->width - 1)
186 yyerror("X value out of range.");
187 if (y < 1 || y >= sp->height - 1)
188 yyerror("Y value out of range.");
189 }
190
check_linepoint(x,y)191 check_linepoint(x, y)
192 {
193 if (x < 0 || x >= sp->width)
194 yyerror("X value out of range.");
195 if (y < 0 || y >= sp->height)
196 yyerror("Y value out of range.");
197 }
198
check_line(x1,y1,x2,y2)199 check_line(x1, y1, x2, y2)
200 {
201 int d1, d2;
202
203 check_linepoint(x1, y1);
204 check_linepoint(x2, y2);
205
206 d1 = ABS(x2 - x1);
207 d2 = ABS(y2 - y1);
208
209 if (!(d1 == d2) && !(d1 == 0) && !(d2 == 0))
210 yyerror("Bad line endpoints.");
211 }
212
yyerror(s)213 yyerror(s)
214 {
215 fprintf(stderr, "\"%s\": line %d: %s\n", file, line, s);
216 errors++;
217
218 return (errors);
219 }
220
check_edir(x,y,dir)221 check_edir(x, y, dir)
222 {
223 int bad = 0;
224
225 if (x == sp->width - 1)
226 x = 2;
227 else if (x != 0)
228 x = 1;
229 if (y == sp->height - 1)
230 y = 2;
231 else if (y != 0)
232 y = 1;
233
234 switch (x * 10 + y) {
235 case 00: if (dir != 3) bad++; break;
236 case 01: if (dir < 1 || dir > 3) bad++; break;
237 case 02: if (dir != 1) bad++; break;
238 case 10: if (dir < 3 || dir > 5) bad++; break;
239 case 11: break;
240 case 12: if (dir > 1 && dir < 7) bad++; break;
241 case 20: if (dir != 5) bad++; break;
242 case 21: if (dir < 5) bad++; break;
243 case 22: if (dir != 7) bad++; break;
244 default:
245 yyerror("Unknown value in checkdir! Get help!");
246 break;
247 }
248 if (bad)
249 yyerror("Bad direction for entrance at exit.");
250 }
251
check_adir(x,y,dir)252 check_adir(x, y, dir)
253 {
254 }
255
checkdefs()256 checkdefs()
257 {
258 int err = 0;
259
260 if (sp->width == 0) {
261 yyerror("'width' undefined.");
262 err++;
263 }
264 if (sp->height == 0) {
265 yyerror("'height' undefined.");
266 err++;
267 }
268 if (sp->update_secs == 0) {
269 yyerror("'update' undefined.");
270 err++;
271 }
272 if (sp->newplane_time == 0) {
273 yyerror("'newplane' undefined.");
274 err++;
275 }
276 if (err)
277 return (-1);
278 else
279 return (0);
280 }
281 #line 282 "y.tab.c"
282 #define YYABORT goto yyabort
283 #define YYACCEPT goto yyaccept
284 #define YYERROR goto yyerrlab
285 int
yyparse()286 yyparse()
287 {
288 register int yym, yyn, yystate;
289 #if YYDEBUG
290 register char *yys;
291 extern char *getenv();
292
293 if (yys = getenv("YYDEBUG"))
294 {
295 yyn = *yys;
296 if (yyn >= '0' && yyn <= '9')
297 yydebug = yyn - '0';
298 }
299 #endif
300
301 yynerrs = 0;
302 yyerrflag = 0;
303 yychar = (-1);
304
305 yyssp = yyss;
306 yyvsp = yyvs;
307 *yyssp = yystate = 0;
308
309 yyloop:
310 if (yyn = yydefred[yystate]) goto yyreduce;
311 if (yychar < 0)
312 {
313 if ((yychar = yylex()) < 0) yychar = 0;
314 #if YYDEBUG
315 if (yydebug)
316 {
317 yys = 0;
318 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
319 if (!yys) yys = "illegal-symbol";
320 printf("yydebug: state %d, reading %d (%s)\n", yystate,
321 yychar, yys);
322 }
323 #endif
324 }
325 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
326 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
327 {
328 #if YYDEBUG
329 if (yydebug)
330 printf("yydebug: state %d, shifting to state %d\n",
331 yystate, yytable[yyn]);
332 #endif
333 if (yyssp >= yyss + yystacksize - 1)
334 {
335 goto yyoverflow;
336 }
337 *++yyssp = yystate = yytable[yyn];
338 *++yyvsp = yylval;
339 yychar = (-1);
340 if (yyerrflag > 0) --yyerrflag;
341 goto yyloop;
342 }
343 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
344 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
345 {
346 yyn = yytable[yyn];
347 goto yyreduce;
348 }
349 if (yyerrflag) goto yyinrecovery;
350 #ifdef lint
351 goto yynewerror;
352 #endif
353 yynewerror:
354 yyerror("syntax error");
355 #ifdef lint
356 goto yyerrlab;
357 #endif
358 yyerrlab:
359 ++yynerrs;
360 yyinrecovery:
361 if (yyerrflag < 3)
362 {
363 yyerrflag = 3;
364 for (;;)
365 {
366 if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
367 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
368 {
369 #if YYDEBUG
370 if (yydebug)
371 printf("yydebug: state %d, error recovery shifting\
372 to state %d\n", *yyssp, yytable[yyn]);
373 #endif
374 if (yyssp >= yyss + yystacksize - 1)
375 {
376 goto yyoverflow;
377 }
378 *++yyssp = yystate = yytable[yyn];
379 *++yyvsp = yylval;
380 goto yyloop;
381 }
382 else
383 {
384 #if YYDEBUG
385 if (yydebug)
386 printf("yydebug: error recovery discarding state %d\n",
387 *yyssp);
388 #endif
389 if (yyssp <= yyss) goto yyabort;
390 --yyssp;
391 --yyvsp;
392 }
393 }
394 }
395 else
396 {
397 if (yychar == 0) goto yyabort;
398 #if YYDEBUG
399 if (yydebug)
400 {
401 yys = 0;
402 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
403 if (!yys) yys = "illegal-symbol";
404 printf("yydebug: state %d, error recovery discards token %d (%s)\n",
405 yystate, yychar, yys);
406 }
407 #endif
408 yychar = (-1);
409 goto yyloop;
410 }
411 yyreduce:
412 #if YYDEBUG
413 if (yydebug)
414 printf("yydebug: state %d, reducing by rule %d (%s)\n",
415 yystate, yyn, yyrule[yyn]);
416 #endif
417 yym = yylen[yyn];
418 yyval = yyvsp[1-yym];
419 switch (yyn)
420 {
421 case 1:
422 #line 74 "/usr/src/games/atc/grammar.y"
423 { if (checkdefs() < 0) return (errors); }
424 break;
425 case 2:
426 #line 75 "/usr/src/games/atc/grammar.y"
427 {
428 if (sp->num_exits + sp->num_airports < 2)
429 yyerror("Need at least 2 airports and/or exits.");
430 return (errors);
431 }
432 break;
433 case 9:
434 #line 96 "/usr/src/games/atc/grammar.y"
435 {
436 if (sp->update_secs != 0)
437 return (yyerror("Redefinition of 'update'."));
438 else if (yyvsp[-1].ival < 1)
439 return (yyerror("'update' is too small."));
440 else
441 sp->update_secs = yyvsp[-1].ival;
442 }
443 break;
444 case 10:
445 #line 108 "/usr/src/games/atc/grammar.y"
446 {
447 if (sp->newplane_time != 0)
448 return (yyerror("Redefinition of 'newplane'."));
449 else if (yyvsp[-1].ival < 1)
450 return (yyerror("'newplane' is too small."));
451 else
452 sp->newplane_time = yyvsp[-1].ival;
453 }
454 break;
455 case 11:
456 #line 120 "/usr/src/games/atc/grammar.y"
457 {
458 if (sp->height != 0)
459 return (yyerror("Redefinition of 'height'."));
460 else if (yyvsp[-1].ival < 3)
461 return (yyerror("'height' is too small."));
462 else
463 sp->height = yyvsp[-1].ival;
464 }
465 break;
466 case 12:
467 #line 132 "/usr/src/games/atc/grammar.y"
468 {
469 if (sp->height != 0)
470 return (yyerror("Redefinition of 'width'."));
471 else if (yyvsp[-1].ival < 3)
472 return (yyerror("'width' is too small."));
473 else
474 sp->width = yyvsp[-1].ival;
475 }
476 break;
477 case 13:
478 #line 144 "/usr/src/games/atc/grammar.y"
479 {}
480 break;
481 case 14:
482 #line 146 "/usr/src/games/atc/grammar.y"
483 {}
484 break;
485 case 15:
486 #line 151 "/usr/src/games/atc/grammar.y"
487 {}
488 break;
489 case 16:
490 #line 153 "/usr/src/games/atc/grammar.y"
491 {}
492 break;
493 case 17:
494 #line 155 "/usr/src/games/atc/grammar.y"
495 {}
496 break;
497 case 18:
498 #line 157 "/usr/src/games/atc/grammar.y"
499 {}
500 break;
501 case 19:
502 #line 162 "/usr/src/games/atc/grammar.y"
503 {}
504 break;
505 case 20:
506 #line 164 "/usr/src/games/atc/grammar.y"
507 {}
508 break;
509 case 21:
510 #line 169 "/usr/src/games/atc/grammar.y"
511 {
512 if (sp->num_beacons % REALLOC == 0) {
513 if (sp->beacon == NULL)
514 sp->beacon = (BEACON *) malloc((sp->num_beacons
515 + REALLOC) * sizeof (BEACON));
516 else
517 sp->beacon = (BEACON *) realloc(sp->beacon,
518 (sp->num_beacons + REALLOC) *
519 sizeof (BEACON));
520 if (sp->beacon == NULL)
521 return (yyerror("No memory available."));
522 }
523 sp->beacon[sp->num_beacons].x = yyvsp[-2].ival;
524 sp->beacon[sp->num_beacons].y = yyvsp[-1].ival;
525 check_point(yyvsp[-2].ival, yyvsp[-1].ival);
526 sp->num_beacons++;
527 }
528 break;
529 case 22:
530 #line 190 "/usr/src/games/atc/grammar.y"
531 {}
532 break;
533 case 23:
534 #line 192 "/usr/src/games/atc/grammar.y"
535 {}
536 break;
537 case 24:
538 #line 197 "/usr/src/games/atc/grammar.y"
539 {
540 int dir;
541
542 if (sp->num_exits % REALLOC == 0) {
543 if (sp->exit == NULL)
544 sp->exit = (EXIT *) malloc((sp->num_exits +
545 REALLOC) * sizeof (EXIT));
546 else
547 sp->exit = (EXIT *) realloc(sp->exit,
548 (sp->num_exits + REALLOC) *
549 sizeof (EXIT));
550 if (sp->exit == NULL)
551 return (yyerror("No memory available."));
552 }
553 dir = dir_no(yyvsp[-1].cval);
554 sp->exit[sp->num_exits].x = yyvsp[-3].ival;
555 sp->exit[sp->num_exits].y = yyvsp[-2].ival;
556 sp->exit[sp->num_exits].dir = dir;
557 check_edge(yyvsp[-3].ival, yyvsp[-2].ival);
558 check_edir(yyvsp[-3].ival, yyvsp[-2].ival, dir);
559 sp->num_exits++;
560 }
561 break;
562 case 25:
563 #line 223 "/usr/src/games/atc/grammar.y"
564 {}
565 break;
566 case 26:
567 #line 225 "/usr/src/games/atc/grammar.y"
568 {}
569 break;
570 case 27:
571 #line 230 "/usr/src/games/atc/grammar.y"
572 {
573 int dir;
574
575 if (sp->num_airports % REALLOC == 0) {
576 if (sp->airport == NULL)
577 sp->airport=(AIRPORT *)malloc((sp->num_airports
578 + REALLOC) * sizeof(AIRPORT));
579 else
580 sp->airport = (AIRPORT *) realloc(sp->airport,
581 (sp->num_airports + REALLOC) *
582 sizeof(AIRPORT));
583 if (sp->airport == NULL)
584 return (yyerror("No memory available."));
585 }
586 dir = dir_no(yyvsp[-1].cval);
587 sp->airport[sp->num_airports].x = yyvsp[-3].ival;
588 sp->airport[sp->num_airports].y = yyvsp[-2].ival;
589 sp->airport[sp->num_airports].dir = dir;
590 check_point(yyvsp[-3].ival, yyvsp[-2].ival);
591 check_adir(yyvsp[-3].ival, yyvsp[-2].ival, dir);
592 sp->num_airports++;
593 }
594 break;
595 case 28:
596 #line 256 "/usr/src/games/atc/grammar.y"
597 {}
598 break;
599 case 29:
600 #line 258 "/usr/src/games/atc/grammar.y"
601 {}
602 break;
603 case 30:
604 #line 263 "/usr/src/games/atc/grammar.y"
605 {
606 if (sp->num_lines % REALLOC == 0) {
607 if (sp->line == NULL)
608 sp->line = (LINE *) malloc((sp->num_lines +
609 REALLOC) * sizeof (LINE));
610 else
611 sp->line = (LINE *) realloc(sp->line,
612 (sp->num_lines + REALLOC) *
613 sizeof (LINE));
614 if (sp->line == NULL)
615 return (yyerror("No memory available."));
616 }
617 sp->line[sp->num_lines].p1.x = yyvsp[-7].ival;
618 sp->line[sp->num_lines].p1.y = yyvsp[-6].ival;
619 sp->line[sp->num_lines].p2.x = yyvsp[-3].ival;
620 sp->line[sp->num_lines].p2.y = yyvsp[-2].ival;
621 check_line(yyvsp[-7].ival, yyvsp[-6].ival, yyvsp[-3].ival, yyvsp[-2].ival);
622 sp->num_lines++;
623 }
624 break;
625 #line 626 "y.tab.c"
626 }
627 yyssp -= yym;
628 yystate = *yyssp;
629 yyvsp -= yym;
630 yym = yylhs[yyn];
631 if (yystate == 0 && yym == 0)
632 {
633 #if YYDEBUG
634 if (yydebug)
635 printf("yydebug: after reduction, shifting from state 0 to\
636 state %d\n", YYFINAL);
637 #endif
638 yystate = YYFINAL;
639 *++yyssp = YYFINAL;
640 *++yyvsp = yyval;
641 if (yychar < 0)
642 {
643 if ((yychar = yylex()) < 0) yychar = 0;
644 #if YYDEBUG
645 if (yydebug)
646 {
647 yys = 0;
648 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
649 if (!yys) yys = "illegal-symbol";
650 printf("yydebug: state %d, reading %d (%s)\n",
651 YYFINAL, yychar, yys);
652 }
653 #endif
654 }
655 if (yychar == 0) goto yyaccept;
656 goto yyloop;
657 }
658 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
659 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
660 yystate = yytable[yyn];
661 else
662 yystate = yydgoto[yym];
663 #if YYDEBUG
664 if (yydebug)
665 printf("yydebug: after reduction, shifting from state %d \
666 to state %d\n", *yyssp, yystate);
667 #endif
668 if (yyssp >= yyss + yystacksize - 1)
669 {
670 goto yyoverflow;
671 }
672 *++yyssp = yystate;
673 *++yyvsp = yyval;
674 goto yyloop;
675 yyoverflow:
676 yyerror("yacc stack overflow");
677 yyabort:
678 return (1);
679 yyaccept:
680 return (0);
681 }
682