xref: /freebsd/contrib/byacc/test/yacc/pure_calc.tab.c (revision 6574b8ed19b093f0af09501d2c9676c28993cb97)
1 /* original parser id follows */
2 /* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
3 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
4 
5 #define YYBYACC 1
6 #define YYMAJOR 1
7 #define YYMINOR 9
8 #define YYCHECK "yyyymmdd"
9 
10 #define YYEMPTY        (-1)
11 #define yyclearin      (yychar = YYEMPTY)
12 #define yyerrok        (yyerrflag = 0)
13 #define YYRECOVERING() (yyerrflag != 0)
14 #define YYENOMEM       (-2)
15 #define YYEOF          0
16 
17 #ifndef yyparse
18 #define yyparse    calc_parse
19 #endif /* yyparse */
20 
21 #ifndef yylex
22 #define yylex      calc_lex
23 #endif /* yylex */
24 
25 #ifndef yyerror
26 #define yyerror    calc_error
27 #endif /* yyerror */
28 
29 #ifndef yychar
30 #define yychar     calc_char
31 #endif /* yychar */
32 
33 #ifndef yyval
34 #define yyval      calc_val
35 #endif /* yyval */
36 
37 #ifndef yylval
38 #define yylval     calc_lval
39 #endif /* yylval */
40 
41 #ifndef yydebug
42 #define yydebug    calc_debug
43 #endif /* yydebug */
44 
45 #ifndef yynerrs
46 #define yynerrs    calc_nerrs
47 #endif /* yynerrs */
48 
49 #ifndef yyerrflag
50 #define yyerrflag  calc_errflag
51 #endif /* yyerrflag */
52 
53 #ifndef yylhs
54 #define yylhs      calc_lhs
55 #endif /* yylhs */
56 
57 #ifndef yylen
58 #define yylen      calc_len
59 #endif /* yylen */
60 
61 #ifndef yydefred
62 #define yydefred   calc_defred
63 #endif /* yydefred */
64 
65 #ifndef yydgoto
66 #define yydgoto    calc_dgoto
67 #endif /* yydgoto */
68 
69 #ifndef yysindex
70 #define yysindex   calc_sindex
71 #endif /* yysindex */
72 
73 #ifndef yyrindex
74 #define yyrindex   calc_rindex
75 #endif /* yyrindex */
76 
77 #ifndef yygindex
78 #define yygindex   calc_gindex
79 #endif /* yygindex */
80 
81 #ifndef yytable
82 #define yytable    calc_table
83 #endif /* yytable */
84 
85 #ifndef yycheck
86 #define yycheck    calc_check
87 #endif /* yycheck */
88 
89 #ifndef yyname
90 #define yyname     calc_name
91 #endif /* yyname */
92 
93 #ifndef yyrule
94 #define yyrule     calc_rule
95 #endif /* yyrule */
96 #define YYPREFIX "calc_"
97 
98 #define YYPURE 1
99 
100 #line 2 "pure_calc.y"
101 # include <stdio.h>
102 # include <ctype.h>
103 
104 int regs[26];
105 int base;
106 
107 #ifdef YYBISON
108 #define YYSTYPE int
109 #define YYLEX_PARAM &yylval
110 #define YYLEX_DECL() yylex(YYSTYPE *yylval)
111 #define YYERROR_DECL() yyerror(const char *s)
112 int YYLEX_DECL();
113 static void YYERROR_DECL();
114 #endif
115 
116 #line 117 "pure_calc.tab.c"
117 
118 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
119 /* Default: YYSTYPE is the semantic value type. */
120 typedef int YYSTYPE;
121 # define YYSTYPE_IS_DECLARED 1
122 #endif
123 
124 /* compatibility with bison */
125 #ifdef YYPARSE_PARAM
126 /* compatibility with FreeBSD */
127 # ifdef YYPARSE_PARAM_TYPE
128 #  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
129 # else
130 #  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
131 # endif
132 #else
133 # define YYPARSE_DECL() yyparse(void)
134 #endif
135 
136 /* Parameters sent to lex. */
137 #ifdef YYLEX_PARAM
138 # ifdef YYLEX_PARAM_TYPE
139 #  define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM)
140 # else
141 #  define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM)
142 # endif
143 # define YYLEX yylex(&yylval, YYLEX_PARAM)
144 #else
145 # define YYLEX_DECL() yylex(YYSTYPE *yylval)
146 # define YYLEX yylex(&yylval)
147 #endif
148 
149 /* Parameters sent to yyerror. */
150 #ifndef YYERROR_DECL
151 #define YYERROR_DECL() yyerror(const char *s)
152 #endif
153 #ifndef YYERROR_CALL
154 #define YYERROR_CALL(msg) yyerror(msg)
155 #endif
156 
157 extern int YYPARSE_DECL();
158 
159 #define DIGIT 257
160 #define LETTER 258
161 #define UMINUS 259
162 #define YYERRCODE 256
163 typedef short YYINT;
164 static const YYINT calc_lhs[] = {                        -1,
165     0,    0,    0,    1,    1,    2,    2,    2,    2,    2,
166     2,    2,    2,    2,    2,    2,    3,    3,
167 };
168 static const YYINT calc_len[] = {                         2,
169     0,    3,    3,    1,    3,    3,    3,    3,    3,    3,
170     3,    3,    3,    2,    1,    1,    1,    2,
171 };
172 static const YYINT calc_defred[] = {                      1,
173     0,    0,   17,    0,    0,    0,    0,    0,    0,    3,
174     0,   15,   14,    0,    2,    0,    0,    0,    0,    0,
175     0,    0,   18,    0,    6,    0,    0,    0,    0,    9,
176    10,   11,
177 };
178 static const YYINT calc_dgoto[] = {                       1,
179     7,    8,    9,
180 };
181 static const YYINT calc_sindex[] = {                      0,
182   -40,   -7,    0,  -55,  -38,  -38,    1,  -29, -247,    0,
183   -38,    0,    0,   22,    0,  -38,  -38,  -38,  -38,  -38,
184   -38,  -38,    0,  -29,    0,   51,   60,  -20,  -20,    0,
185     0,    0,
186 };
187 static const YYINT calc_rindex[] = {                      0,
188     0,    0,    0,    2,    0,    0,    0,    9,   -9,    0,
189     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
190     0,    0,    0,   10,    0,   -6,   14,    5,   13,    0,
191     0,    0,
192 };
193 static const YYINT calc_gindex[] = {                      0,
194     0,   65,    0,
195 };
196 #define YYTABLESIZE 220
197 static const YYINT calc_table[] = {                       6,
198    16,    6,   10,   13,    5,   11,    5,   22,   17,   23,
199    15,   15,   20,   18,    7,   19,   22,   21,    4,    5,
200     0,   20,    8,   12,    0,    0,   21,   16,   16,    0,
201     0,   16,   16,   16,   13,   16,    0,   16,   15,   15,
202     0,    0,    7,   15,   15,    7,   15,    7,   15,    7,
203     8,   12,    0,    8,   12,    8,    0,    8,   22,   17,
204     0,    0,   25,   20,   18,    0,   19,    0,   21,   13,
205    14,    0,    0,    0,    0,   24,    0,    0,    0,    0,
206    26,   27,   28,   29,   30,   31,   32,   22,   17,    0,
207     0,    0,   20,   18,   16,   19,   22,   21,    0,    0,
208     0,   20,   18,    0,   19,    0,   21,    0,    0,    0,
209     0,    0,    0,    0,   16,    0,    0,   13,    0,    0,
210     0,    0,    0,    0,    0,   15,    0,    0,    7,    0,
211     0,    0,    0,    0,    0,    0,    8,   12,    0,    0,
212     0,    0,    0,    0,    0,   16,    0,    0,    0,    0,
213     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
214     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
215     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
216     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
217     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
218     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
219     0,    0,    0,    0,    0,    2,    3,    4,    3,   12,
220 };
221 static const YYINT calc_check[] = {                      40,
222    10,   40,   10,   10,   45,   61,   45,   37,   38,  257,
223    10,   10,   42,   43,   10,   45,   37,   47,   10,   10,
224    -1,   42,   10,   10,   -1,   -1,   47,   37,   38,   -1,
225    -1,   41,   42,   43,   41,   45,   -1,   47,   37,   38,
226    -1,   -1,   38,   42,   43,   41,   45,   43,   47,   45,
227    38,   38,   -1,   41,   41,   43,   -1,   45,   37,   38,
228    -1,   -1,   41,   42,   43,   -1,   45,   -1,   47,    5,
229     6,   -1,   -1,   -1,   -1,   11,   -1,   -1,   -1,   -1,
230    16,   17,   18,   19,   20,   21,   22,   37,   38,   -1,
231    -1,   -1,   42,   43,  124,   45,   37,   47,   -1,   -1,
232    -1,   42,   43,   -1,   45,   -1,   47,   -1,   -1,   -1,
233    -1,   -1,   -1,   -1,  124,   -1,   -1,  124,   -1,   -1,
234    -1,   -1,   -1,   -1,   -1,  124,   -1,   -1,  124,   -1,
235    -1,   -1,   -1,   -1,   -1,   -1,  124,  124,   -1,   -1,
236    -1,   -1,   -1,   -1,   -1,  124,   -1,   -1,   -1,   -1,
237    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
238    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
239    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
240    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
241    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
242    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
243    -1,   -1,   -1,   -1,   -1,  256,  257,  258,  257,  258,
244 };
245 #define YYFINAL 1
246 #ifndef YYDEBUG
247 #define YYDEBUG 0
248 #endif
249 #define YYMAXTOKEN 259
250 #define YYUNDFTOKEN 265
251 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
252 #if YYDEBUG
253 static const char *const calc_name[] = {
254 
255 "end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
256 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
257 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,
258 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,
259 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,
260 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,
261 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,
262 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
263 };
264 static const char *const calc_rule[] = {
265 "$accept : list",
266 "list :",
267 "list : list stat '\\n'",
268 "list : list error '\\n'",
269 "stat : expr",
270 "stat : LETTER '=' expr",
271 "expr : '(' expr ')'",
272 "expr : expr '+' expr",
273 "expr : expr '-' expr",
274 "expr : expr '*' expr",
275 "expr : expr '/' expr",
276 "expr : expr '%' expr",
277 "expr : expr '&' expr",
278 "expr : expr '|' expr",
279 "expr : '-' expr",
280 "expr : LETTER",
281 "expr : number",
282 "number : DIGIT",
283 "number : number DIGIT",
284 
285 };
286 #endif
287 
288 int      yydebug;
289 int      yynerrs;
290 
291 /* define the initial stack-sizes */
292 #ifdef YYSTACKSIZE
293 #undef YYMAXDEPTH
294 #define YYMAXDEPTH  YYSTACKSIZE
295 #else
296 #ifdef YYMAXDEPTH
297 #define YYSTACKSIZE YYMAXDEPTH
298 #else
299 #define YYSTACKSIZE 10000
300 #define YYMAXDEPTH  10000
301 #endif
302 #endif
303 
304 #define YYINITSTACKSIZE 200
305 
306 typedef struct {
307     unsigned stacksize;
308     YYINT    *s_base;
309     YYINT    *s_mark;
310     YYINT    *s_last;
311     YYSTYPE  *l_base;
312     YYSTYPE  *l_mark;
313 } YYSTACKDATA;
314 #line 72 "pure_calc.y"
315  /* start of programs */
316 
317 #ifdef YYBYACC
318 static int YYLEX_DECL();
319 #endif
320 
321 int
322 main (void)
323 {
324     while(!feof(stdin)) {
325 	yyparse();
326     }
327     return 0;
328 }
329 
330 static void
331 YYERROR_DECL()
332 {
333     fprintf(stderr, "%s\n", s);
334 }
335 
336 int
337 YYLEX_DECL()
338 {
339 	/* lexical analysis routine */
340 	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
341 	/* return DIGIT for a digit, yylval = 0 through 9 */
342 	/* all other characters are returned immediately */
343 
344     int c;
345 
346     while( (c=getchar()) == ' ' )   { /* skip blanks */ }
347 
348     /* c is now nonblank */
349 
350     if( islower( c )) {
351 	*yylval = c - 'a';
352 	return ( LETTER );
353     }
354     if( isdigit( c )) {
355 	*yylval = c - '0';
356 	return ( DIGIT );
357     }
358     return( c );
359 }
360 #line 361 "pure_calc.tab.c"
361 
362 #if YYDEBUG
363 #include <stdio.h>		/* needed for printf */
364 #endif
365 
366 #include <stdlib.h>	/* needed for malloc, etc */
367 #include <string.h>	/* needed for memset */
368 
369 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
370 static int yygrowstack(YYSTACKDATA *data)
371 {
372     int i;
373     unsigned newsize;
374     YYINT *newss;
375     YYSTYPE *newvs;
376 
377     if ((newsize = data->stacksize) == 0)
378         newsize = YYINITSTACKSIZE;
379     else if (newsize >= YYMAXDEPTH)
380         return YYENOMEM;
381     else if ((newsize *= 2) > YYMAXDEPTH)
382         newsize = YYMAXDEPTH;
383 
384     i = (int) (data->s_mark - data->s_base);
385     newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
386     if (newss == 0)
387         return YYENOMEM;
388 
389     data->s_base = newss;
390     data->s_mark = newss + i;
391 
392     newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
393     if (newvs == 0)
394         return YYENOMEM;
395 
396     data->l_base = newvs;
397     data->l_mark = newvs + i;
398 
399     data->stacksize = newsize;
400     data->s_last = data->s_base + newsize - 1;
401     return 0;
402 }
403 
404 #if YYPURE || defined(YY_NO_LEAKS)
405 static void yyfreestack(YYSTACKDATA *data)
406 {
407     free(data->s_base);
408     free(data->l_base);
409     memset(data, 0, sizeof(*data));
410 }
411 #else
412 #define yyfreestack(data) /* nothing */
413 #endif
414 
415 #define YYABORT  goto yyabort
416 #define YYREJECT goto yyabort
417 #define YYACCEPT goto yyaccept
418 #define YYERROR  goto yyerrlab
419 
420 int
421 YYPARSE_DECL()
422 {
423     int      yyerrflag;
424     int      yychar;
425     YYSTYPE  yyval;
426     YYSTYPE  yylval;
427 
428     /* variables for the parser stack */
429     YYSTACKDATA yystack;
430     int yym, yyn, yystate;
431 #if YYDEBUG
432     const char *yys;
433 
434     if ((yys = getenv("YYDEBUG")) != 0)
435     {
436         yyn = *yys;
437         if (yyn >= '0' && yyn <= '9')
438             yydebug = yyn - '0';
439     }
440 #endif
441 
442     yynerrs = 0;
443     yyerrflag = 0;
444     yychar = YYEMPTY;
445     yystate = 0;
446 
447 #if YYPURE
448     memset(&yystack, 0, sizeof(yystack));
449 #endif
450 
451     if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
452     yystack.s_mark = yystack.s_base;
453     yystack.l_mark = yystack.l_base;
454     yystate = 0;
455     *yystack.s_mark = 0;
456 
457 yyloop:
458     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
459     if (yychar < 0)
460     {
461         if ((yychar = YYLEX) < 0) yychar = YYEOF;
462 #if YYDEBUG
463         if (yydebug)
464         {
465             yys = yyname[YYTRANSLATE(yychar)];
466             printf("%sdebug: state %d, reading %d (%s)\n",
467                     YYPREFIX, yystate, yychar, yys);
468         }
469 #endif
470     }
471     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
472             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
473     {
474 #if YYDEBUG
475         if (yydebug)
476             printf("%sdebug: state %d, shifting to state %d\n",
477                     YYPREFIX, yystate, yytable[yyn]);
478 #endif
479         if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
480         {
481             goto yyoverflow;
482         }
483         yystate = yytable[yyn];
484         *++yystack.s_mark = yytable[yyn];
485         *++yystack.l_mark = yylval;
486         yychar = YYEMPTY;
487         if (yyerrflag > 0)  --yyerrflag;
488         goto yyloop;
489     }
490     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
491             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
492     {
493         yyn = yytable[yyn];
494         goto yyreduce;
495     }
496     if (yyerrflag) goto yyinrecovery;
497 
498     YYERROR_CALL("syntax error");
499 
500     goto yyerrlab;
501 
502 yyerrlab:
503     ++yynerrs;
504 
505 yyinrecovery:
506     if (yyerrflag < 3)
507     {
508         yyerrflag = 3;
509         for (;;)
510         {
511             if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
512                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
513             {
514 #if YYDEBUG
515                 if (yydebug)
516                     printf("%sdebug: state %d, error recovery shifting\
517  to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
518 #endif
519                 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
520                 {
521                     goto yyoverflow;
522                 }
523                 yystate = yytable[yyn];
524                 *++yystack.s_mark = yytable[yyn];
525                 *++yystack.l_mark = yylval;
526                 goto yyloop;
527             }
528             else
529             {
530 #if YYDEBUG
531                 if (yydebug)
532                     printf("%sdebug: error recovery discarding state %d\n",
533                             YYPREFIX, *yystack.s_mark);
534 #endif
535                 if (yystack.s_mark <= yystack.s_base) goto yyabort;
536                 --yystack.s_mark;
537                 --yystack.l_mark;
538             }
539         }
540     }
541     else
542     {
543         if (yychar == YYEOF) goto yyabort;
544 #if YYDEBUG
545         if (yydebug)
546         {
547             yys = yyname[YYTRANSLATE(yychar)];
548             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
549                     YYPREFIX, yystate, yychar, yys);
550         }
551 #endif
552         yychar = YYEMPTY;
553         goto yyloop;
554     }
555 
556 yyreduce:
557 #if YYDEBUG
558     if (yydebug)
559         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
560                 YYPREFIX, yystate, yyn, yyrule[yyn]);
561 #endif
562     yym = yylen[yyn];
563     if (yym)
564         yyval = yystack.l_mark[1-yym];
565     else
566         memset(&yyval, 0, sizeof yyval);
567     switch (yyn)
568     {
569 case 3:
570 #line 34 "pure_calc.y"
571 	{  yyerrok ; }
572 break;
573 case 4:
574 #line 38 "pure_calc.y"
575 	{  printf("%d\n",yystack.l_mark[0]);}
576 break;
577 case 5:
578 #line 40 "pure_calc.y"
579 	{  regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
580 break;
581 case 6:
582 #line 44 "pure_calc.y"
583 	{  yyval = yystack.l_mark[-1]; }
584 break;
585 case 7:
586 #line 46 "pure_calc.y"
587 	{  yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
588 break;
589 case 8:
590 #line 48 "pure_calc.y"
591 	{  yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
592 break;
593 case 9:
594 #line 50 "pure_calc.y"
595 	{  yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
596 break;
597 case 10:
598 #line 52 "pure_calc.y"
599 	{  yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
600 break;
601 case 11:
602 #line 54 "pure_calc.y"
603 	{  yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
604 break;
605 case 12:
606 #line 56 "pure_calc.y"
607 	{  yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
608 break;
609 case 13:
610 #line 58 "pure_calc.y"
611 	{  yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
612 break;
613 case 14:
614 #line 60 "pure_calc.y"
615 	{  yyval = - yystack.l_mark[0]; }
616 break;
617 case 15:
618 #line 62 "pure_calc.y"
619 	{  yyval = regs[yystack.l_mark[0]]; }
620 break;
621 case 17:
622 #line 67 "pure_calc.y"
623 	{  yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
624 break;
625 case 18:
626 #line 69 "pure_calc.y"
627 	{  yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
628 break;
629 #line 630 "pure_calc.tab.c"
630     }
631     yystack.s_mark -= yym;
632     yystate = *yystack.s_mark;
633     yystack.l_mark -= yym;
634     yym = yylhs[yyn];
635     if (yystate == 0 && yym == 0)
636     {
637 #if YYDEBUG
638         if (yydebug)
639             printf("%sdebug: after reduction, shifting from state 0 to\
640  state %d\n", YYPREFIX, YYFINAL);
641 #endif
642         yystate = YYFINAL;
643         *++yystack.s_mark = YYFINAL;
644         *++yystack.l_mark = yyval;
645         if (yychar < 0)
646         {
647             if ((yychar = YYLEX) < 0) yychar = YYEOF;
648 #if YYDEBUG
649             if (yydebug)
650             {
651                 yys = yyname[YYTRANSLATE(yychar)];
652                 printf("%sdebug: state %d, reading %d (%s)\n",
653                         YYPREFIX, YYFINAL, yychar, yys);
654             }
655 #endif
656         }
657         if (yychar == YYEOF) goto yyaccept;
658         goto yyloop;
659     }
660     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
661             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
662         yystate = yytable[yyn];
663     else
664         yystate = yydgoto[yym];
665 #if YYDEBUG
666     if (yydebug)
667         printf("%sdebug: after reduction, shifting from state %d \
668 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
669 #endif
670     if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
671     {
672         goto yyoverflow;
673     }
674     *++yystack.s_mark = (YYINT) yystate;
675     *++yystack.l_mark = yyval;
676     goto yyloop;
677 
678 yyoverflow:
679     YYERROR_CALL("yacc stack overflow");
680 
681 yyabort:
682     yyfreestack(&yystack);
683     return (1);
684 
685 yyaccept:
686     yyfreestack(&yystack);
687     return (0);
688 }
689