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