xref: /386bsd/usr/obj/games/atc/grammar.c (revision a2142627)
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