1264790Sbapt/* $Id: yaccpar.skel,v 1.5 2014/04/07 21:51:00 tom Exp $ */
2264790Sbapt
3264790Sbapt#include "defs.h"
4264790Sbapt
5264790Sbapt/*  If the skeleton is changed, the banner should be changed so that	*/
6264790Sbapt/*  the altered version can be easily distinguished from the original.	*/
7264790Sbapt/*									*/
8264790Sbapt/*  The #defines included with the banner are there because they are	*/
9264790Sbapt/*  useful in subsequent code.  The macros #defined in the header or	*/
10264790Sbapt/*  the body either are not useful outside of semantic actions or	*/
11264790Sbapt/*  are conditional.							*/
12264790Sbapt
13264790Sbapt%% banner
14264790Sbapt/* original parser id follows */
15264790Sbapt/* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
16264790Sbapt/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
17264790Sbapt
18264790Sbapt#define YYBYACC 1
19264790Sbapt%% insert VERSION here
20264790Sbapt
21264790Sbapt#define YYEMPTY        (-1)
22264790Sbapt#define yyclearin      (yychar = YYEMPTY)
23264790Sbapt#define yyerrok        (yyerrflag = 0)
24264790Sbapt#define YYRECOVERING() (yyerrflag != 0)
25264790Sbapt#define YYENOMEM       (-2)
26264790Sbapt#define YYEOF          0
27264790Sbapt%% xdecls
28264790Sbapt
29264790Sbaptextern int YYPARSE_DECL();
30264790Sbapt%% tables
31264790Sbaptextern YYINT yylhs[];
32264790Sbaptextern YYINT yylen[];
33264790Sbaptextern YYINT yydefred[];
34264790Sbaptextern YYINT yydgoto[];
35264790Sbaptextern YYINT yysindex[];
36264790Sbaptextern YYINT yyrindex[];
37264790Sbaptextern YYINT yygindex[];
38264790Sbaptextern YYINT yytable[];
39264790Sbaptextern YYINT yycheck[];
40264790Sbapt
41264790Sbapt#if YYDEBUG
42264790Sbaptextern char *yyname[];
43264790Sbaptextern char *yyrule[];
44264790Sbapt#endif
45264790Sbapt%% global_vars
46264790Sbapt
47264790Sbaptint      yydebug;
48264790Sbaptint      yynerrs;
49264790Sbapt%% impure_vars
50264790Sbapt
51264790Sbaptint      yyerrflag;
52264790Sbaptint      yychar;
53264790SbaptYYSTYPE  yyval;
54264790SbaptYYSTYPE  yylval;
55264790Sbapt%% hdr_defs
56264790Sbapt
57264790Sbapt/* define the initial stack-sizes */
58264790Sbapt#ifdef YYSTACKSIZE
59264790Sbapt#undef YYMAXDEPTH
60264790Sbapt#define YYMAXDEPTH  YYSTACKSIZE
61264790Sbapt#else
62264790Sbapt#ifdef YYMAXDEPTH
63264790Sbapt#define YYSTACKSIZE YYMAXDEPTH
64264790Sbapt#else
65264790Sbapt#define YYSTACKSIZE 10000
66264790Sbapt#define YYMAXDEPTH  10000
67264790Sbapt#endif
68264790Sbapt#endif
69264790Sbapt
70264790Sbapt#define YYINITSTACKSIZE 200
71264790Sbapt
72264790Sbapttypedef struct {
73264790Sbapt    unsigned stacksize;
74264790Sbapt    YYINT    *s_base;
75264790Sbapt    YYINT    *s_mark;
76264790Sbapt    YYINT    *s_last;
77264790Sbapt    YYSTYPE  *l_base;
78264790Sbapt    YYSTYPE  *l_mark;
79264790Sbapt} YYSTACKDATA;
80264790Sbapt%% hdr_vars
81264790Sbapt/* variables for the parser stack */
82264790Sbaptstatic YYSTACKDATA yystack;
83264790Sbapt%% body_vars
84264790Sbapt    int      yyerrflag;
85264790Sbapt    int      yychar;
86264790Sbapt    YYSTYPE  yyval;
87264790Sbapt    YYSTYPE  yylval;
88264790Sbapt
89264790Sbapt    /* variables for the parser stack */
90264790Sbapt    YYSTACKDATA yystack;
91264790Sbapt%% body_1
92264790Sbapt
93264790Sbapt#if YYDEBUG
94264790Sbapt#include <stdio.h>		/* needed for printf */
95264790Sbapt#endif
96264790Sbapt
97264790Sbapt#include <stdlib.h>	/* needed for malloc, etc */
98264790Sbapt#include <string.h>	/* needed for memset */
99264790Sbapt
100264790Sbapt/* allocate initial stack or double stack size, up to YYMAXDEPTH */
101264790Sbaptstatic int yygrowstack(YYSTACKDATA *data)
102264790Sbapt{
103264790Sbapt    int i;
104264790Sbapt    unsigned newsize;
105264790Sbapt    YYINT *newss;
106264790Sbapt    YYSTYPE *newvs;
107264790Sbapt
108264790Sbapt    if ((newsize = data->stacksize) == 0)
109264790Sbapt        newsize = YYINITSTACKSIZE;
110264790Sbapt    else if (newsize >= YYMAXDEPTH)
111264790Sbapt        return YYENOMEM;
112264790Sbapt    else if ((newsize *= 2) > YYMAXDEPTH)
113264790Sbapt        newsize = YYMAXDEPTH;
114264790Sbapt
115264790Sbapt    i = (int) (data->s_mark - data->s_base);
116264790Sbapt    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
117264790Sbapt    if (newss == 0)
118264790Sbapt        return YYENOMEM;
119264790Sbapt
120264790Sbapt    data->s_base = newss;
121264790Sbapt    data->s_mark = newss + i;
122264790Sbapt
123264790Sbapt    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
124264790Sbapt    if (newvs == 0)
125264790Sbapt        return YYENOMEM;
126264790Sbapt
127264790Sbapt    data->l_base = newvs;
128264790Sbapt    data->l_mark = newvs + i;
129264790Sbapt
130264790Sbapt    data->stacksize = newsize;
131264790Sbapt    data->s_last = data->s_base + newsize - 1;
132264790Sbapt    return 0;
133264790Sbapt}
134264790Sbapt
135264790Sbapt#if YYPURE || defined(YY_NO_LEAKS)
136264790Sbaptstatic void yyfreestack(YYSTACKDATA *data)
137264790Sbapt{
138264790Sbapt    free(data->s_base);
139264790Sbapt    free(data->l_base);
140264790Sbapt    memset(data, 0, sizeof(*data));
141264790Sbapt}
142264790Sbapt#else
143264790Sbapt#define yyfreestack(data) /* nothing */
144264790Sbapt#endif
145264790Sbapt
146264790Sbapt#define YYABORT  goto yyabort
147264790Sbapt#define YYREJECT goto yyabort
148264790Sbapt#define YYACCEPT goto yyaccept
149264790Sbapt#define YYERROR  goto yyerrlab
150264790Sbapt
151264790Sbaptint
152264790SbaptYYPARSE_DECL()
153264790Sbapt{
154264790Sbapt%% body_2
155264790Sbapt    int yym, yyn, yystate;
156264790Sbapt#if YYDEBUG
157264790Sbapt    const char *yys;
158264790Sbapt
159264790Sbapt    if ((yys = getenv("YYDEBUG")) != 0)
160264790Sbapt    {
161264790Sbapt        yyn = *yys;
162264790Sbapt        if (yyn >= '0' && yyn <= '9')
163264790Sbapt            yydebug = yyn - '0';
164264790Sbapt    }
165264790Sbapt#endif
166264790Sbapt
167264790Sbapt    yynerrs = 0;
168264790Sbapt    yyerrflag = 0;
169264790Sbapt    yychar = YYEMPTY;
170264790Sbapt    yystate = 0;
171264790Sbapt
172264790Sbapt#if YYPURE
173264790Sbapt    memset(&yystack, 0, sizeof(yystack));
174264790Sbapt#endif
175264790Sbapt
176264790Sbapt    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
177264790Sbapt    yystack.s_mark = yystack.s_base;
178264790Sbapt    yystack.l_mark = yystack.l_base;
179264790Sbapt    yystate = 0;
180264790Sbapt    *yystack.s_mark = 0;
181264790Sbapt
182264790Sbaptyyloop:
183264790Sbapt    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
184264790Sbapt    if (yychar < 0)
185264790Sbapt    {
186264790Sbapt        if ((yychar = YYLEX) < 0) yychar = YYEOF;
187264790Sbapt#if YYDEBUG
188264790Sbapt        if (yydebug)
189264790Sbapt        {
190264790Sbapt            yys = yyname[YYTRANSLATE(yychar)];
191264790Sbapt            printf("%sdebug: state %d, reading %d (%s)\n",
192264790Sbapt                    YYPREFIX, yystate, yychar, yys);
193264790Sbapt        }
194264790Sbapt#endif
195264790Sbapt    }
196264790Sbapt    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
197264790Sbapt            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
198264790Sbapt    {
199264790Sbapt#if YYDEBUG
200264790Sbapt        if (yydebug)
201264790Sbapt            printf("%sdebug: state %d, shifting to state %d\n",
202264790Sbapt                    YYPREFIX, yystate, yytable[yyn]);
203264790Sbapt#endif
204264790Sbapt        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
205264790Sbapt        {
206264790Sbapt            goto yyoverflow;
207264790Sbapt        }
208264790Sbapt        yystate = yytable[yyn];
209264790Sbapt        *++yystack.s_mark = yytable[yyn];
210264790Sbapt        *++yystack.l_mark = yylval;
211264790Sbapt        yychar = YYEMPTY;
212264790Sbapt        if (yyerrflag > 0)  --yyerrflag;
213264790Sbapt        goto yyloop;
214264790Sbapt    }
215264790Sbapt    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
216264790Sbapt            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
217264790Sbapt    {
218264790Sbapt        yyn = yytable[yyn];
219264790Sbapt        goto yyreduce;
220264790Sbapt    }
221264790Sbapt    if (yyerrflag) goto yyinrecovery;
222264790Sbapt
223264790Sbapt    YYERROR_CALL("syntax error");
224264790Sbapt
225264790Sbapt    goto yyerrlab;
226264790Sbapt
227264790Sbaptyyerrlab:
228264790Sbapt    ++yynerrs;
229264790Sbapt
230264790Sbaptyyinrecovery:
231264790Sbapt    if (yyerrflag < 3)
232264790Sbapt    {
233264790Sbapt        yyerrflag = 3;
234264790Sbapt        for (;;)
235264790Sbapt        {
236264790Sbapt            if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
237264790Sbapt                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
238264790Sbapt            {
239264790Sbapt#if YYDEBUG
240264790Sbapt                if (yydebug)
241264790Sbapt                    printf("%sdebug: state %d, error recovery shifting\
242264790Sbapt to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
243264790Sbapt#endif
244264790Sbapt                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
245264790Sbapt                {
246264790Sbapt                    goto yyoverflow;
247264790Sbapt                }
248264790Sbapt                yystate = yytable[yyn];
249264790Sbapt                *++yystack.s_mark = yytable[yyn];
250264790Sbapt                *++yystack.l_mark = yylval;
251264790Sbapt                goto yyloop;
252264790Sbapt            }
253264790Sbapt            else
254264790Sbapt            {
255264790Sbapt#if YYDEBUG
256264790Sbapt                if (yydebug)
257264790Sbapt                    printf("%sdebug: error recovery discarding state %d\n",
258264790Sbapt                            YYPREFIX, *yystack.s_mark);
259264790Sbapt#endif
260264790Sbapt                if (yystack.s_mark <= yystack.s_base) goto yyabort;
261264790Sbapt                --yystack.s_mark;
262264790Sbapt                --yystack.l_mark;
263264790Sbapt            }
264264790Sbapt        }
265264790Sbapt    }
266264790Sbapt    else
267264790Sbapt    {
268264790Sbapt        if (yychar == YYEOF) goto yyabort;
269264790Sbapt#if YYDEBUG
270264790Sbapt        if (yydebug)
271264790Sbapt        {
272264790Sbapt            yys = yyname[YYTRANSLATE(yychar)];
273264790Sbapt            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
274264790Sbapt                    YYPREFIX, yystate, yychar, yys);
275264790Sbapt        }
276264790Sbapt#endif
277264790Sbapt        yychar = YYEMPTY;
278264790Sbapt        goto yyloop;
279264790Sbapt    }
280264790Sbapt
281264790Sbaptyyreduce:
282264790Sbapt#if YYDEBUG
283264790Sbapt    if (yydebug)
284264790Sbapt        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
285264790Sbapt                YYPREFIX, yystate, yyn, yyrule[yyn]);
286264790Sbapt#endif
287264790Sbapt    yym = yylen[yyn];
288264790Sbapt    if (yym)
289264790Sbapt        yyval = yystack.l_mark[1-yym];
290264790Sbapt    else
291264790Sbapt        memset(&yyval, 0, sizeof yyval);
292264790Sbapt    switch (yyn)
293264790Sbapt    {
294264790Sbapt%% trailer
295264790Sbapt    }
296264790Sbapt    yystack.s_mark -= yym;
297264790Sbapt    yystate = *yystack.s_mark;
298264790Sbapt    yystack.l_mark -= yym;
299264790Sbapt    yym = yylhs[yyn];
300264790Sbapt    if (yystate == 0 && yym == 0)
301264790Sbapt    {
302264790Sbapt#if YYDEBUG
303264790Sbapt        if (yydebug)
304264790Sbapt            printf("%sdebug: after reduction, shifting from state 0 to\
305264790Sbapt state %d\n", YYPREFIX, YYFINAL);
306264790Sbapt#endif
307264790Sbapt        yystate = YYFINAL;
308264790Sbapt        *++yystack.s_mark = YYFINAL;
309264790Sbapt        *++yystack.l_mark = yyval;
310264790Sbapt        if (yychar < 0)
311264790Sbapt        {
312264790Sbapt            if ((yychar = YYLEX) < 0) yychar = YYEOF;
313264790Sbapt#if YYDEBUG
314264790Sbapt            if (yydebug)
315264790Sbapt            {
316264790Sbapt                yys = yyname[YYTRANSLATE(yychar)];
317264790Sbapt                printf("%sdebug: state %d, reading %d (%s)\n",
318264790Sbapt                        YYPREFIX, YYFINAL, yychar, yys);
319264790Sbapt            }
320264790Sbapt#endif
321264790Sbapt        }
322264790Sbapt        if (yychar == YYEOF) goto yyaccept;
323264790Sbapt        goto yyloop;
324264790Sbapt    }
325264790Sbapt    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
326264790Sbapt            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
327264790Sbapt        yystate = yytable[yyn];
328264790Sbapt    else
329264790Sbapt        yystate = yydgoto[yym];
330264790Sbapt#if YYDEBUG
331264790Sbapt    if (yydebug)
332264790Sbapt        printf("%sdebug: after reduction, shifting from state %d \
333264790Sbaptto state %d\n", YYPREFIX, *yystack.s_mark, yystate);
334264790Sbapt#endif
335264790Sbapt    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
336264790Sbapt    {
337264790Sbapt        goto yyoverflow;
338264790Sbapt    }
339264790Sbapt    *++yystack.s_mark = (YYINT) yystate;
340264790Sbapt    *++yystack.l_mark = yyval;
341264790Sbapt    goto yyloop;
342264790Sbapt
343264790Sbaptyyoverflow:
344264790Sbapt    YYERROR_CALL("yacc stack overflow");
345264790Sbapt
346264790Sbaptyyabort:
347264790Sbapt    yyfreestack(&yystack);
348264790Sbapt    return (1);
349264790Sbapt
350264790Sbaptyyaccept:
351264790Sbapt    yyfreestack(&yystack);
352264790Sbapt    return (0);
353264790Sbapt}
354