quote_calc4.tab.c revision 277086
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_calc4_parse
19#endif /* yyparse */
20
21#ifndef yylex
22#define yylex      quote_calc4_lex
23#endif /* yylex */
24
25#ifndef yyerror
26#define yyerror    quote_calc4_error
27#endif /* yyerror */
28
29#ifndef yychar
30#define yychar     quote_calc4_char
31#endif /* yychar */
32
33#ifndef yyval
34#define yyval      quote_calc4_val
35#endif /* yyval */
36
37#ifndef yylval
38#define yylval     quote_calc4_lval
39#endif /* yylval */
40
41#ifndef yydebug
42#define yydebug    quote_calc4_debug
43#endif /* yydebug */
44
45#ifndef yynerrs
46#define yynerrs    quote_calc4_nerrs
47#endif /* yynerrs */
48
49#ifndef yyerrflag
50#define yyerrflag  quote_calc4_errflag
51#endif /* yyerrflag */
52
53#ifndef yylhs
54#define yylhs      quote_calc4_lhs
55#endif /* yylhs */
56
57#ifndef yylen
58#define yylen      quote_calc4_len
59#endif /* yylen */
60
61#ifndef yydefred
62#define yydefred   quote_calc4_defred
63#endif /* yydefred */
64
65#ifndef yydgoto
66#define yydgoto    quote_calc4_dgoto
67#endif /* yydgoto */
68
69#ifndef yysindex
70#define yysindex   quote_calc4_sindex
71#endif /* yysindex */
72
73#ifndef yyrindex
74#define yyrindex   quote_calc4_rindex
75#endif /* yyrindex */
76
77#ifndef yygindex
78#define yygindex   quote_calc4_gindex
79#endif /* yygindex */
80
81#ifndef yytable
82#define yytable    quote_calc4_table
83#endif /* yytable */
84
85#ifndef yycheck
86#define yycheck    quote_calc4_check
87#endif /* yycheck */
88
89#ifndef yyname
90#define yyname     quote_calc4_name
91#endif /* yyname */
92
93#ifndef yyrule
94#define yyrule     quote_calc4_rule
95#endif /* yyrule */
96#define YYPREFIX "quote_calc4_"
97
98#define YYPURE 0
99
100#line 2 "quote_calc4.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_calc4.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_calc4_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_calc4_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_calc4_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_calc4_dgoto[] = {                1,
175    7,    8,    9,
176};
177static const YYINT quote_calc4_sindex[] = {               0,
178  -38,    4,  -36,    0,  -51,  -36,    6, -121, -249,    0,
179    0, -243,  -36,  -23,    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_calc4_rindex[] = {               0,
184    0,    0,    0,    0,   -9,    0,    0,   12,  -10,    0,
185    0,   -5,    0,    0,    0,    0,    0,    0,    0,    0,
186    0,    0,    0,   14,    0,   -3,   -2,   -1,    1,    2,
187    3,   -4,
188};
189static const YYINT quote_calc4_gindex[] = {               0,
190    0,   42,    0,
191};
192#define YYTABLESIZE 259
193static const YYINT quote_calc4_table[] = {               16,
194   15,    6,   22,    6,   14,   13,    7,    8,    9,   13,
195   10,   11,   12,   10,   16,   15,   17,   25,   18,   23,
196   19,    4,   20,    5,   21,    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   22,    0,    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,    0,   16,    0,   17,    0,
208   18,    0,   19,    0,   20,    0,   21,    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    0,    3,    0,    3,    0,    0,    0,    0,    0,    0,
217    4,    5,    4,   11,   16,    0,   17,    0,   18,    0,
218   19,    0,   20,    0,   21,    0,    0,   16,   15,   16,
219   15,   16,   15,   16,   15,   16,   15,   16,   15,
220};
221static const YYINT quote_calc4_check[] = {               10,
222   10,   40,  124,   40,   10,   10,   10,   10,   10,   61,
223   10,   10,   10,   10,  258,   10,  260,   41,  262,  269,
224  264,   10,  266,   10,  268,   -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  124,   -1,   -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,   -1,  258,   -1,  260,   -1,
236  262,   -1,  264,   -1,  266,   -1,  268,   -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   -1,  260,   -1,  260,   -1,   -1,   -1,   -1,   -1,   -1,
245  269,  270,  269,  270,  258,   -1,  260,   -1,  262,   -1,
246  264,   -1,  266,   -1,  268,   -1,   -1,  258,  258,  260,
247  260,  262,  262,  264,  264,  266,  266,  268,  268,
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_calc4_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_calc4_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 \"ADD-operator\" expr",
280"expr : expr \"SUB-operator\" expr",
281"expr : expr \"MUL-operator\" expr",
282"expr : expr \"DIV-operator\" expr",
283"expr : expr \"MOD-operator\" expr",
284"expr : expr \"AND-operator\" expr",
285"expr : expr '|' expr",
286"expr : \"SUB-operator\" 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_calc4.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_calc4.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    yynerrs = 0;
445    yyerrflag = 0;
446    yychar = YYEMPTY;
447    yystate = 0;
448
449#if YYPURE
450    memset(&yystack, 0, sizeof(yystack));
451#endif
452
453    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
454    yystack.s_mark = yystack.s_base;
455    yystack.l_mark = yystack.l_base;
456    yystate = 0;
457    *yystack.s_mark = 0;
458
459yyloop:
460    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
461    if (yychar < 0)
462    {
463        if ((yychar = YYLEX) < 0) yychar = YYEOF;
464#if YYDEBUG
465        if (yydebug)
466        {
467            yys = yyname[YYTRANSLATE(yychar)];
468            printf("%sdebug: state %d, reading %d (%s)\n",
469                    YYPREFIX, yystate, yychar, yys);
470        }
471#endif
472    }
473    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
474            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
475    {
476#if YYDEBUG
477        if (yydebug)
478            printf("%sdebug: state %d, shifting to state %d\n",
479                    YYPREFIX, yystate, yytable[yyn]);
480#endif
481        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
482        {
483            goto yyoverflow;
484        }
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]) && (yyn += yychar) >= 0 &&
493            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
494    {
495        yyn = yytable[yyn];
496        goto yyreduce;
497    }
498    if (yyerrflag) goto yyinrecovery;
499
500    YYERROR_CALL("syntax error");
501
502    goto yyerrlab;
503
504yyerrlab:
505    ++yynerrs;
506
507yyinrecovery:
508    if (yyerrflag < 3)
509    {
510        yyerrflag = 3;
511        for (;;)
512        {
513            if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
514                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
515            {
516#if YYDEBUG
517                if (yydebug)
518                    printf("%sdebug: state %d, error recovery shifting\
519 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
520#endif
521                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
522                {
523                    goto yyoverflow;
524                }
525                yystate = yytable[yyn];
526                *++yystack.s_mark = yytable[yyn];
527                *++yystack.l_mark = yylval;
528                goto yyloop;
529            }
530            else
531            {
532#if YYDEBUG
533                if (yydebug)
534                    printf("%sdebug: error recovery discarding state %d\n",
535                            YYPREFIX, *yystack.s_mark);
536#endif
537                if (yystack.s_mark <= yystack.s_base) goto yyabort;
538                --yystack.s_mark;
539                --yystack.l_mark;
540            }
541        }
542    }
543    else
544    {
545        if (yychar == YYEOF) goto yyabort;
546#if YYDEBUG
547        if (yydebug)
548        {
549            yys = yyname[YYTRANSLATE(yychar)];
550            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
551                    YYPREFIX, yystate, yychar, yys);
552        }
553#endif
554        yychar = YYEMPTY;
555        goto yyloop;
556    }
557
558yyreduce:
559#if YYDEBUG
560    if (yydebug)
561        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
562                YYPREFIX, yystate, yyn, yyrule[yyn]);
563#endif
564    yym = yylen[yyn];
565    if (yym)
566        yyval = yystack.l_mark[1-yym];
567    else
568        memset(&yyval, 0, sizeof yyval);
569    switch (yyn)
570    {
571case 3:
572#line 35 "quote_calc4.y"
573	{  yyerrok ; }
574break;
575case 4:
576#line 39 "quote_calc4.y"
577	{  printf("%d\n",yystack.l_mark[0]);}
578break;
579case 5:
580#line 41 "quote_calc4.y"
581	{  regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
582break;
583case 6:
584#line 45 "quote_calc4.y"
585	{  yyval = yystack.l_mark[-1]; }
586break;
587case 7:
588#line 47 "quote_calc4.y"
589	{  yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
590break;
591case 8:
592#line 49 "quote_calc4.y"
593	{  yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
594break;
595case 9:
596#line 51 "quote_calc4.y"
597	{  yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
598break;
599case 10:
600#line 53 "quote_calc4.y"
601	{  yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
602break;
603case 11:
604#line 55 "quote_calc4.y"
605	{  yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
606break;
607case 12:
608#line 57 "quote_calc4.y"
609	{  yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
610break;
611case 13:
612#line 59 "quote_calc4.y"
613	{  yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
614break;
615case 14:
616#line 61 "quote_calc4.y"
617	{  yyval = - yystack.l_mark[0]; }
618break;
619case 15:
620#line 63 "quote_calc4.y"
621	{  yyval = regs[yystack.l_mark[0]]; }
622break;
623case 17:
624#line 68 "quote_calc4.y"
625	{  yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
626break;
627case 18:
628#line 70 "quote_calc4.y"
629	{  yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
630break;
631#line 632 "quote_calc4.tab.c"
632    }
633    yystack.s_mark -= yym;
634    yystate = *yystack.s_mark;
635    yystack.l_mark -= yym;
636    yym = yylhs[yyn];
637    if (yystate == 0 && yym == 0)
638    {
639#if YYDEBUG
640        if (yydebug)
641            printf("%sdebug: after reduction, shifting from state 0 to\
642 state %d\n", YYPREFIX, YYFINAL);
643#endif
644        yystate = YYFINAL;
645        *++yystack.s_mark = YYFINAL;
646        *++yystack.l_mark = yyval;
647        if (yychar < 0)
648        {
649            if ((yychar = YYLEX) < 0) yychar = YYEOF;
650#if YYDEBUG
651            if (yydebug)
652            {
653                yys = yyname[YYTRANSLATE(yychar)];
654                printf("%sdebug: state %d, reading %d (%s)\n",
655                        YYPREFIX, YYFINAL, yychar, yys);
656            }
657#endif
658        }
659        if (yychar == YYEOF) goto yyaccept;
660        goto yyloop;
661    }
662    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
663            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
664        yystate = yytable[yyn];
665    else
666        yystate = yydgoto[yym];
667#if YYDEBUG
668    if (yydebug)
669        printf("%sdebug: after reduction, shifting from state %d \
670to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
671#endif
672    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
673    {
674        goto yyoverflow;
675    }
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