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