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