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