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-s.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_calc_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_calc_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_calc_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_calc_dgoto[] = {                 1,
175    7,    8,    9,
176};
177static const YYINT quote_calc_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_calc_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_calc_gindex[] = {                0,
190    0,   42,    0,
191};
192#define YYTABLESIZE 258
193static const YYINT quote_calc_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_calc_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_calc_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\"","OP_SUB","\"SUB\"","OP_MUL","\"MUL\"","OP_DIV",
267"\"DIV\"","OP_MOD","\"MOD\"","OP_AND","\"AND\"","DIGIT","LETTER","UMINUS",0,0,0,
2680,0,"illegal-symbol",
269};
270static const char *const quote_calc_rule[] = {
271"$accept : list",
272"list :",
273"list : list stat '\\n'",
274"list : list error '\\n'",
275"stat : expr",
276"stat : LETTER '=' expr",
277"expr : '(' expr ')'",
278"expr : expr OP_ADD expr",
279"expr : expr OP_SUB expr",
280"expr : expr OP_MUL expr",
281"expr : expr OP_DIV expr",
282"expr : expr OP_MOD expr",
283"expr : expr OP_AND expr",
284"expr : expr '|' expr",
285"expr : OP_SUB expr",
286"expr : LETTER",
287"expr : number",
288"number : DIGIT",
289"number : number DIGIT",
290
291};
292#endif
293
294int      yydebug;
295int      yynerrs;
296
297int      yyerrflag;
298int      yychar;
299YYSTYPE  yyval;
300YYSTYPE  yylval;
301
302/* define the initial stack-sizes */
303#ifdef YYSTACKSIZE
304#undef YYMAXDEPTH
305#define YYMAXDEPTH  YYSTACKSIZE
306#else
307#ifdef YYMAXDEPTH
308#define YYSTACKSIZE YYMAXDEPTH
309#else
310#define YYSTACKSIZE 10000
311#define YYMAXDEPTH  10000
312#endif
313#endif
314
315#define YYINITSTACKSIZE 200
316
317typedef struct {
318    unsigned stacksize;
319    YYINT    *s_base;
320    YYINT    *s_mark;
321    YYINT    *s_last;
322    YYSTYPE  *l_base;
323    YYSTYPE  *l_mark;
324} YYSTACKDATA;
325/* variables for the parser stack */
326static YYSTACKDATA yystack;
327#line 73 "quote_calc.y"
328 /* start of programs */
329
330int
331main (void)
332{
333    while(!feof(stdin)) {
334	yyparse();
335    }
336    return 0;
337}
338
339static void
340yyerror(const char *s)
341{
342    fprintf(stderr, "%s\n", s);
343}
344
345int
346yylex(void) {
347	/* lexical analysis routine */
348	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
349	/* return DIGIT for a digit, yylval = 0 through 9 */
350	/* all other characters are returned immediately */
351
352    int c;
353
354    while( (c=getchar()) == ' ' )   { /* skip blanks */ }
355
356    /* c is now nonblank */
357
358    if( islower( c )) {
359	yylval = c - 'a';
360	return ( LETTER );
361    }
362    if( isdigit( c )) {
363	yylval = c - '0';
364	return ( DIGIT );
365    }
366    return( c );
367}
368#line 369 "quote_calc-s.tab.c"
369
370#if YYDEBUG
371#include <stdio.h>	/* needed for printf */
372#endif
373
374#include <stdlib.h>	/* needed for malloc, etc */
375#include <string.h>	/* needed for memset */
376
377/* allocate initial stack or double stack size, up to YYMAXDEPTH */
378static int yygrowstack(YYSTACKDATA *data)
379{
380    int i;
381    unsigned newsize;
382    YYINT *newss;
383    YYSTYPE *newvs;
384
385    if ((newsize = data->stacksize) == 0)
386        newsize = YYINITSTACKSIZE;
387    else if (newsize >= YYMAXDEPTH)
388        return YYENOMEM;
389    else if ((newsize *= 2) > YYMAXDEPTH)
390        newsize = YYMAXDEPTH;
391
392    i = (int) (data->s_mark - data->s_base);
393    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
394    if (newss == 0)
395        return YYENOMEM;
396
397    data->s_base = newss;
398    data->s_mark = newss + i;
399
400    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
401    if (newvs == 0)
402        return YYENOMEM;
403
404    data->l_base = newvs;
405    data->l_mark = newvs + i;
406
407    data->stacksize = newsize;
408    data->s_last = data->s_base + newsize - 1;
409    return 0;
410}
411
412#if YYPURE || defined(YY_NO_LEAKS)
413static void yyfreestack(YYSTACKDATA *data)
414{
415    free(data->s_base);
416    free(data->l_base);
417    memset(data, 0, sizeof(*data));
418}
419#else
420#define yyfreestack(data) /* nothing */
421#endif
422
423#define YYABORT  goto yyabort
424#define YYREJECT goto yyabort
425#define YYACCEPT goto yyaccept
426#define YYERROR  goto yyerrlab
427
428int
429YYPARSE_DECL()
430{
431    int yym, yyn, yystate;
432#if YYDEBUG
433    const char *yys;
434
435    if ((yys = getenv("YYDEBUG")) != 0)
436    {
437        yyn = *yys;
438        if (yyn >= '0' && yyn <= '9')
439            yydebug = yyn - '0';
440    }
441#endif
442
443    yym = 0;
444    yyn = 0;
445    yynerrs = 0;
446    yyerrflag = 0;
447    yychar = YYEMPTY;
448    yystate = 0;
449
450#if YYPURE
451    memset(&yystack, 0, sizeof(yystack));
452#endif
453
454    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
455    yystack.s_mark = yystack.s_base;
456    yystack.l_mark = yystack.l_base;
457    yystate = 0;
458    *yystack.s_mark = 0;
459
460yyloop:
461    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
462    if (yychar < 0)
463    {
464        yychar = YYLEX;
465        if (yychar < 0) yychar = YYEOF;
466#if YYDEBUG
467        if (yydebug)
468        {
469            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
470            printf("%sdebug: state %d, reading %d (%s)\n",
471                    YYPREFIX, yystate, yychar, yys);
472        }
473#endif
474    }
475    if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
476            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) 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) goto yyoverflow;
484        yystate = yytable[yyn];
485        *++yystack.s_mark = yytable[yyn];
486        *++yystack.l_mark = yylval;
487        yychar = YYEMPTY;
488        if (yyerrflag > 0)  --yyerrflag;
489        goto yyloop;
490    }
491    if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
492            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
493    {
494        yyn = yytable[yyn];
495        goto yyreduce;
496    }
497    if (yyerrflag != 0) goto yyinrecovery;
498
499    YYERROR_CALL("syntax error");
500
501    goto yyerrlab; /* redundant goto avoids 'unused label' warning */
502yyerrlab:
503    ++yynerrs;
504
505yyinrecovery:
506    if (yyerrflag < 3)
507    {
508        yyerrflag = 3;
509        for (;;)
510        {
511            if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
512                    yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
513            {
514#if YYDEBUG
515                if (yydebug)
516                    printf("%sdebug: state %d, error recovery shifting\
517 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
518#endif
519                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
520                yystate = yytable[yyn];
521                *++yystack.s_mark = yytable[yyn];
522                *++yystack.l_mark = yylval;
523                goto yyloop;
524            }
525            else
526            {
527#if YYDEBUG
528                if (yydebug)
529                    printf("%sdebug: error recovery discarding state %d\n",
530                            YYPREFIX, *yystack.s_mark);
531#endif
532                if (yystack.s_mark <= yystack.s_base) goto yyabort;
533                --yystack.s_mark;
534                --yystack.l_mark;
535            }
536        }
537    }
538    else
539    {
540        if (yychar == YYEOF) goto yyabort;
541#if YYDEBUG
542        if (yydebug)
543        {
544            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
545            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
546                    YYPREFIX, yystate, yychar, yys);
547        }
548#endif
549        yychar = YYEMPTY;
550        goto yyloop;
551    }
552
553yyreduce:
554#if YYDEBUG
555    if (yydebug)
556        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
557                YYPREFIX, yystate, yyn, yyrule[yyn]);
558#endif
559    yym = yylen[yyn];
560    if (yym > 0)
561        yyval = yystack.l_mark[1-yym];
562    else
563        memset(&yyval, 0, sizeof yyval);
564
565    switch (yyn)
566    {
567case 3:
568#line 35 "quote_calc.y"
569	{  yyerrok ; }
570break;
571case 4:
572#line 39 "quote_calc.y"
573	{  printf("%d\n",yystack.l_mark[0]);}
574break;
575case 5:
576#line 41 "quote_calc.y"
577	{  regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
578break;
579case 6:
580#line 45 "quote_calc.y"
581	{  yyval = yystack.l_mark[-1]; }
582break;
583case 7:
584#line 47 "quote_calc.y"
585	{  yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
586break;
587case 8:
588#line 49 "quote_calc.y"
589	{  yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
590break;
591case 9:
592#line 51 "quote_calc.y"
593	{  yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
594break;
595case 10:
596#line 53 "quote_calc.y"
597	{  yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
598break;
599case 11:
600#line 55 "quote_calc.y"
601	{  yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
602break;
603case 12:
604#line 57 "quote_calc.y"
605	{  yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
606break;
607case 13:
608#line 59 "quote_calc.y"
609	{  yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
610break;
611case 14:
612#line 61 "quote_calc.y"
613	{  yyval = - yystack.l_mark[0]; }
614break;
615case 15:
616#line 63 "quote_calc.y"
617	{  yyval = regs[yystack.l_mark[0]]; }
618break;
619case 17:
620#line 68 "quote_calc.y"
621	{  yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
622break;
623case 18:
624#line 70 "quote_calc.y"
625	{  yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
626break;
627#line 628 "quote_calc-s.tab.c"
628    }
629    yystack.s_mark -= yym;
630    yystate = *yystack.s_mark;
631    yystack.l_mark -= yym;
632    yym = yylhs[yyn];
633    if (yystate == 0 && yym == 0)
634    {
635#if YYDEBUG
636        if (yydebug)
637            printf("%sdebug: after reduction, shifting from state 0 to\
638 state %d\n", YYPREFIX, YYFINAL);
639#endif
640        yystate = YYFINAL;
641        *++yystack.s_mark = YYFINAL;
642        *++yystack.l_mark = yyval;
643        if (yychar < 0)
644        {
645            yychar = YYLEX;
646            if (yychar < 0) yychar = YYEOF;
647#if YYDEBUG
648            if (yydebug)
649            {
650                if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
651                printf("%sdebug: state %d, reading %d (%s)\n",
652                        YYPREFIX, YYFINAL, yychar, yys);
653            }
654#endif
655        }
656        if (yychar == YYEOF) goto yyaccept;
657        goto yyloop;
658    }
659    if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
660            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
661        yystate = yytable[yyn];
662    else
663        yystate = yydgoto[yym];
664#if YYDEBUG
665    if (yydebug)
666        printf("%sdebug: after reduction, shifting from state %d \
667to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
668#endif
669    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
670    *++yystack.s_mark = (YYINT) yystate;
671    *++yystack.l_mark = yyval;
672    goto yyloop;
673
674yyoverflow:
675    YYERROR_CALL("yacc stack overflow");
676
677yyabort:
678    yyfreestack(&yystack);
679    return (1);
680
681yyaccept:
682    yyfreestack(&yystack);
683    return (0);
684}
685