1319297Sdelphij/* $Id: yaccpar.skel,v 1.8 2016/12/02 21:44:42 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
41319297Sdelphij#if YYDEBUG || defined(yytname)
42319297Sdelphijextern char *yyname[];
43319297Sdelphij#endif
44264790Sbapt#if YYDEBUG
45264790Sbaptextern char *yyrule[];
46264790Sbapt#endif
47264790Sbapt%% global_vars
48264790Sbapt
49264790Sbaptint      yydebug;
50264790Sbaptint      yynerrs;
51264790Sbapt%% impure_vars
52264790Sbapt
53264790Sbaptint      yyerrflag;
54264790Sbaptint      yychar;
55264790SbaptYYSTYPE  yyval;
56264790SbaptYYSTYPE  yylval;
57264790Sbapt%% hdr_defs
58264790Sbapt
59264790Sbapt/* define the initial stack-sizes */
60264790Sbapt#ifdef YYSTACKSIZE
61264790Sbapt#undef YYMAXDEPTH
62264790Sbapt#define YYMAXDEPTH  YYSTACKSIZE
63264790Sbapt#else
64264790Sbapt#ifdef YYMAXDEPTH
65264790Sbapt#define YYSTACKSIZE YYMAXDEPTH
66264790Sbapt#else
67264790Sbapt#define YYSTACKSIZE 10000
68264790Sbapt#define YYMAXDEPTH  10000
69264790Sbapt#endif
70264790Sbapt#endif
71264790Sbapt
72264790Sbapt#define YYINITSTACKSIZE 200
73264790Sbapt
74264790Sbapttypedef struct {
75264790Sbapt    unsigned stacksize;
76264790Sbapt    YYINT    *s_base;
77264790Sbapt    YYINT    *s_mark;
78264790Sbapt    YYINT    *s_last;
79264790Sbapt    YYSTYPE  *l_base;
80264790Sbapt    YYSTYPE  *l_mark;
81264790Sbapt} YYSTACKDATA;
82264790Sbapt%% hdr_vars
83264790Sbapt/* variables for the parser stack */
84264790Sbaptstatic YYSTACKDATA yystack;
85264790Sbapt%% body_vars
86264790Sbapt    int      yyerrflag;
87264790Sbapt    int      yychar;
88264790Sbapt    YYSTYPE  yyval;
89264790Sbapt    YYSTYPE  yylval;
90264790Sbapt
91264790Sbapt    /* variables for the parser stack */
92264790Sbapt    YYSTACKDATA yystack;
93264790Sbapt%% body_1
94264790Sbapt
95264790Sbapt#if YYDEBUG
96319297Sdelphij#include <stdio.h>	/* needed for printf */
97264790Sbapt#endif
98264790Sbapt
99264790Sbapt#include <stdlib.h>	/* needed for malloc, etc */
100264790Sbapt#include <string.h>	/* needed for memset */
101264790Sbapt
102264790Sbapt/* allocate initial stack or double stack size, up to YYMAXDEPTH */
103264790Sbaptstatic int yygrowstack(YYSTACKDATA *data)
104264790Sbapt{
105264790Sbapt    int i;
106264790Sbapt    unsigned newsize;
107264790Sbapt    YYINT *newss;
108264790Sbapt    YYSTYPE *newvs;
109264790Sbapt
110264790Sbapt    if ((newsize = data->stacksize) == 0)
111264790Sbapt        newsize = YYINITSTACKSIZE;
112264790Sbapt    else if (newsize >= YYMAXDEPTH)
113264790Sbapt        return YYENOMEM;
114264790Sbapt    else if ((newsize *= 2) > YYMAXDEPTH)
115264790Sbapt        newsize = YYMAXDEPTH;
116264790Sbapt
117264790Sbapt    i = (int) (data->s_mark - data->s_base);
118264790Sbapt    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
119264790Sbapt    if (newss == 0)
120264790Sbapt        return YYENOMEM;
121264790Sbapt
122264790Sbapt    data->s_base = newss;
123264790Sbapt    data->s_mark = newss + i;
124264790Sbapt
125264790Sbapt    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
126264790Sbapt    if (newvs == 0)
127264790Sbapt        return YYENOMEM;
128264790Sbapt
129264790Sbapt    data->l_base = newvs;
130264790Sbapt    data->l_mark = newvs + i;
131264790Sbapt
132264790Sbapt    data->stacksize = newsize;
133264790Sbapt    data->s_last = data->s_base + newsize - 1;
134264790Sbapt    return 0;
135264790Sbapt}
136264790Sbapt
137264790Sbapt#if YYPURE || defined(YY_NO_LEAKS)
138264790Sbaptstatic void yyfreestack(YYSTACKDATA *data)
139264790Sbapt{
140264790Sbapt    free(data->s_base);
141264790Sbapt    free(data->l_base);
142264790Sbapt    memset(data, 0, sizeof(*data));
143264790Sbapt}
144264790Sbapt#else
145264790Sbapt#define yyfreestack(data) /* nothing */
146264790Sbapt#endif
147264790Sbapt
148264790Sbapt#define YYABORT  goto yyabort
149264790Sbapt#define YYREJECT goto yyabort
150264790Sbapt#define YYACCEPT goto yyaccept
151264790Sbapt#define YYERROR  goto yyerrlab
152264790Sbapt
153264790Sbaptint
154264790SbaptYYPARSE_DECL()
155264790Sbapt{
156264790Sbapt%% body_2
157264790Sbapt    int yym, yyn, yystate;
158264790Sbapt#if YYDEBUG
159264790Sbapt    const char *yys;
160264790Sbapt
161264790Sbapt    if ((yys = getenv("YYDEBUG")) != 0)
162264790Sbapt    {
163264790Sbapt        yyn = *yys;
164264790Sbapt        if (yyn >= '0' && yyn <= '9')
165264790Sbapt            yydebug = yyn - '0';
166264790Sbapt    }
167264790Sbapt#endif
168264790Sbapt
169319297Sdelphij%% body_3
170319297Sdelphij    yym = 0;
171319297Sdelphij    yyn = 0;
172264790Sbapt    yynerrs = 0;
173264790Sbapt    yyerrflag = 0;
174264790Sbapt    yychar = YYEMPTY;
175264790Sbapt    yystate = 0;
176264790Sbapt
177264790Sbapt#if YYPURE
178264790Sbapt    memset(&yystack, 0, sizeof(yystack));
179264790Sbapt#endif
180264790Sbapt
181264790Sbapt    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
182264790Sbapt    yystack.s_mark = yystack.s_base;
183264790Sbapt    yystack.l_mark = yystack.l_base;
184264790Sbapt    yystate = 0;
185264790Sbapt    *yystack.s_mark = 0;
186264790Sbapt
187264790Sbaptyyloop:
188264790Sbapt    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
189264790Sbapt    if (yychar < 0)
190264790Sbapt    {
191319297Sdelphij        yychar = YYLEX;
192319297Sdelphij        if (yychar < 0) yychar = YYEOF;
193264790Sbapt#if YYDEBUG
194264790Sbapt        if (yydebug)
195264790Sbapt        {
196319297Sdelphij            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
197264790Sbapt            printf("%sdebug: state %d, reading %d (%s)\n",
198264790Sbapt                    YYPREFIX, yystate, yychar, yys);
199264790Sbapt        }
200264790Sbapt#endif
201264790Sbapt    }
202319297Sdelphij    if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
203319297Sdelphij            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
204264790Sbapt    {
205264790Sbapt#if YYDEBUG
206264790Sbapt        if (yydebug)
207264790Sbapt            printf("%sdebug: state %d, shifting to state %d\n",
208264790Sbapt                    YYPREFIX, yystate, yytable[yyn]);
209264790Sbapt#endif
210319297Sdelphij        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
211264790Sbapt        yystate = yytable[yyn];
212264790Sbapt        *++yystack.s_mark = yytable[yyn];
213264790Sbapt        *++yystack.l_mark = yylval;
214264790Sbapt        yychar = YYEMPTY;
215264790Sbapt        if (yyerrflag > 0)  --yyerrflag;
216264790Sbapt        goto yyloop;
217264790Sbapt    }
218319297Sdelphij    if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
219319297Sdelphij            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
220264790Sbapt    {
221264790Sbapt        yyn = yytable[yyn];
222264790Sbapt        goto yyreduce;
223264790Sbapt    }
224319297Sdelphij    if (yyerrflag != 0) goto yyinrecovery;
225264790Sbapt
226264790Sbapt    YYERROR_CALL("syntax error");
227264790Sbapt
228319297Sdelphij    goto yyerrlab; /* redundant goto avoids 'unused label' warning */
229264790Sbaptyyerrlab:
230264790Sbapt    ++yynerrs;
231264790Sbapt
232264790Sbaptyyinrecovery:
233264790Sbapt    if (yyerrflag < 3)
234264790Sbapt    {
235264790Sbapt        yyerrflag = 3;
236264790Sbapt        for (;;)
237264790Sbapt        {
238319297Sdelphij            if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
239319297Sdelphij                    yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
240264790Sbapt            {
241264790Sbapt#if YYDEBUG
242264790Sbapt                if (yydebug)
243264790Sbapt                    printf("%sdebug: state %d, error recovery shifting\
244264790Sbapt to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
245264790Sbapt#endif
246319297Sdelphij                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
247264790Sbapt                yystate = yytable[yyn];
248264790Sbapt                *++yystack.s_mark = yytable[yyn];
249264790Sbapt                *++yystack.l_mark = yylval;
250264790Sbapt                goto yyloop;
251264790Sbapt            }
252264790Sbapt            else
253264790Sbapt            {
254264790Sbapt#if YYDEBUG
255264790Sbapt                if (yydebug)
256264790Sbapt                    printf("%sdebug: error recovery discarding state %d\n",
257264790Sbapt                            YYPREFIX, *yystack.s_mark);
258264790Sbapt#endif
259264790Sbapt                if (yystack.s_mark <= yystack.s_base) goto yyabort;
260264790Sbapt                --yystack.s_mark;
261264790Sbapt                --yystack.l_mark;
262264790Sbapt            }
263264790Sbapt        }
264264790Sbapt    }
265264790Sbapt    else
266264790Sbapt    {
267264790Sbapt        if (yychar == YYEOF) goto yyabort;
268264790Sbapt#if YYDEBUG
269264790Sbapt        if (yydebug)
270264790Sbapt        {
271319297Sdelphij            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
272264790Sbapt            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
273264790Sbapt                    YYPREFIX, yystate, yychar, yys);
274264790Sbapt        }
275264790Sbapt#endif
276264790Sbapt        yychar = YYEMPTY;
277264790Sbapt        goto yyloop;
278264790Sbapt    }
279264790Sbapt
280264790Sbaptyyreduce:
281264790Sbapt#if YYDEBUG
282264790Sbapt    if (yydebug)
283264790Sbapt        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
284264790Sbapt                YYPREFIX, yystate, yyn, yyrule[yyn]);
285264790Sbapt#endif
286264790Sbapt    yym = yylen[yyn];
287319297Sdelphij    if (yym > 0)
288264790Sbapt        yyval = yystack.l_mark[1-yym];
289264790Sbapt    else
290264790Sbapt        memset(&yyval, 0, sizeof yyval);
291319297Sdelphij
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        {
312319297Sdelphij            yychar = YYLEX;
313319297Sdelphij            if (yychar < 0) yychar = YYEOF;
314264790Sbapt#if YYDEBUG
315264790Sbapt            if (yydebug)
316264790Sbapt            {
317319297Sdelphij                if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
318264790Sbapt                printf("%sdebug: state %d, reading %d (%s)\n",
319264790Sbapt                        YYPREFIX, YYFINAL, yychar, yys);
320264790Sbapt            }
321264790Sbapt#endif
322264790Sbapt        }
323264790Sbapt        if (yychar == YYEOF) goto yyaccept;
324264790Sbapt        goto yyloop;
325264790Sbapt    }
326319297Sdelphij    if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
327319297Sdelphij            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
328264790Sbapt        yystate = yytable[yyn];
329264790Sbapt    else
330264790Sbapt        yystate = yydgoto[yym];
331264790Sbapt#if YYDEBUG
332264790Sbapt    if (yydebug)
333264790Sbapt        printf("%sdebug: after reduction, shifting from state %d \
334264790Sbaptto state %d\n", YYPREFIX, *yystack.s_mark, yystate);
335264790Sbapt#endif
336319297Sdelphij    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
337264790Sbapt    *++yystack.s_mark = (YYINT) yystate;
338264790Sbapt    *++yystack.l_mark = yyval;
339264790Sbapt    goto yyloop;
340264790Sbapt
341264790Sbaptyyoverflow:
342264790Sbapt    YYERROR_CALL("yacc stack overflow");
343264790Sbapt
344264790Sbaptyyabort:
345264790Sbapt    yyfreestack(&yystack);
346264790Sbapt    return (1);
347264790Sbapt
348264790Sbaptyyaccept:
349264790Sbapt    yyfreestack(&yystack);
350264790Sbapt    return (0);
351264790Sbapt}
352