xref: /freebsd/contrib/byacc/test/yacc/pure_calc.tab.c (revision c7d813a93eeb447470734c9bc0c140d90a54c271)
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 int 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     yym = 0;
443     yyn = 0;
444     yynerrs = 0;
445     yyerrflag = 0;
446     yychar = YYEMPTY;
447     yystate = 0;
448 
449 #if YYPURE
450     memset(&yystack, 0, sizeof(yystack));
451 #endif
452 
453     if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
454     yystack.s_mark = yystack.s_base;
455     yystack.l_mark = yystack.l_base;
456     yystate = 0;
457     *yystack.s_mark = 0;
458 
459 yyloop:
460     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
461     if (yychar < 0)
462     {
463         yychar = YYLEX;
464         if (yychar < 0) yychar = YYEOF;
465 #if YYDEBUG
466         if (yydebug)
467         {
468             if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
469             printf("%sdebug: state %d, reading %d (%s)\n",
470                     YYPREFIX, yystate, yychar, yys);
471         }
472 #endif
473     }
474     if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
475             yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
476     {
477 #if YYDEBUG
478         if (yydebug)
479             printf("%sdebug: state %d, shifting to state %d\n",
480                     YYPREFIX, yystate, yytable[yyn]);
481 #endif
482         if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
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]) != 0) && (yyn += yychar) >= 0 &&
491             yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
492     {
493         yyn = yytable[yyn];
494         goto yyreduce;
495     }
496     if (yyerrflag != 0) goto yyinrecovery;
497 
498     YYERROR_CALL("syntax error");
499 
500     goto yyerrlab; /* redundant goto avoids 'unused label' warning */
501 yyerrlab:
502     ++yynerrs;
503 
504 yyinrecovery:
505     if (yyerrflag < 3)
506     {
507         yyerrflag = 3;
508         for (;;)
509         {
510             if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
511                     yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
512             {
513 #if YYDEBUG
514                 if (yydebug)
515                     printf("%sdebug: state %d, error recovery shifting\
516  to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
517 #endif
518                 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
519                 yystate = yytable[yyn];
520                 *++yystack.s_mark = yytable[yyn];
521                 *++yystack.l_mark = yylval;
522                 goto yyloop;
523             }
524             else
525             {
526 #if YYDEBUG
527                 if (yydebug)
528                     printf("%sdebug: error recovery discarding state %d\n",
529                             YYPREFIX, *yystack.s_mark);
530 #endif
531                 if (yystack.s_mark <= yystack.s_base) goto yyabort;
532                 --yystack.s_mark;
533                 --yystack.l_mark;
534             }
535         }
536     }
537     else
538     {
539         if (yychar == YYEOF) goto yyabort;
540 #if YYDEBUG
541         if (yydebug)
542         {
543             if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
544             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
545                     YYPREFIX, yystate, yychar, yys);
546         }
547 #endif
548         yychar = YYEMPTY;
549         goto yyloop;
550     }
551 
552 yyreduce:
553 #if YYDEBUG
554     if (yydebug)
555         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
556                 YYPREFIX, yystate, yyn, yyrule[yyn]);
557 #endif
558     yym = yylen[yyn];
559     if (yym > 0)
560         yyval = yystack.l_mark[1-yym];
561     else
562         memset(&yyval, 0, sizeof yyval);
563 
564     switch (yyn)
565     {
566 case 3:
567 #line 34 "pure_calc.y"
568 	{  yyerrok ; }
569 break;
570 case 4:
571 #line 38 "pure_calc.y"
572 	{  printf("%d\n",yystack.l_mark[0]);}
573 break;
574 case 5:
575 #line 40 "pure_calc.y"
576 	{  regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
577 break;
578 case 6:
579 #line 44 "pure_calc.y"
580 	{  yyval = yystack.l_mark[-1]; }
581 break;
582 case 7:
583 #line 46 "pure_calc.y"
584 	{  yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
585 break;
586 case 8:
587 #line 48 "pure_calc.y"
588 	{  yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
589 break;
590 case 9:
591 #line 50 "pure_calc.y"
592 	{  yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
593 break;
594 case 10:
595 #line 52 "pure_calc.y"
596 	{  yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
597 break;
598 case 11:
599 #line 54 "pure_calc.y"
600 	{  yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
601 break;
602 case 12:
603 #line 56 "pure_calc.y"
604 	{  yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
605 break;
606 case 13:
607 #line 58 "pure_calc.y"
608 	{  yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
609 break;
610 case 14:
611 #line 60 "pure_calc.y"
612 	{  yyval = - yystack.l_mark[0]; }
613 break;
614 case 15:
615 #line 62 "pure_calc.y"
616 	{  yyval = regs[yystack.l_mark[0]]; }
617 break;
618 case 17:
619 #line 67 "pure_calc.y"
620 	{  yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
621 break;
622 case 18:
623 #line 69 "pure_calc.y"
624 	{  yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
625 break;
626 #line 627 "pure_calc.tab.c"
627     }
628     yystack.s_mark -= yym;
629     yystate = *yystack.s_mark;
630     yystack.l_mark -= yym;
631     yym = yylhs[yyn];
632     if (yystate == 0 && yym == 0)
633     {
634 #if YYDEBUG
635         if (yydebug)
636             printf("%sdebug: after reduction, shifting from state 0 to\
637  state %d\n", YYPREFIX, YYFINAL);
638 #endif
639         yystate = YYFINAL;
640         *++yystack.s_mark = YYFINAL;
641         *++yystack.l_mark = yyval;
642         if (yychar < 0)
643         {
644             yychar = YYLEX;
645             if (yychar < 0) yychar = YYEOF;
646 #if YYDEBUG
647             if (yydebug)
648             {
649                 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
650                 printf("%sdebug: state %d, reading %d (%s)\n",
651                         YYPREFIX, YYFINAL, yychar, yys);
652             }
653 #endif
654         }
655         if (yychar == YYEOF) goto yyaccept;
656         goto yyloop;
657     }
658     if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
659             yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
660         yystate = yytable[yyn];
661     else
662         yystate = yydgoto[yym];
663 #if YYDEBUG
664     if (yydebug)
665         printf("%sdebug: after reduction, shifting from state %d \
666 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
667 #endif
668     if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
669     *++yystack.s_mark = (YYINT) yystate;
670     *++yystack.l_mark = yyval;
671     goto yyloop;
672 
673 yyoverflow:
674     YYERROR_CALL("yacc stack overflow");
675 
676 yyabort:
677     yyfreestack(&yystack);
678     return (1);
679 
680 yyaccept:
681     yyfreestack(&yystack);
682     return (0);
683 }
684