1/* $Id: yaccpar.skel,v 1.12 2021/08/08 19:55:43 tom Exp $ */
2
3#include "defs.h"
4
5/*  If the skeleton is changed, the banner should be changed so that	*/
6/*  the altered version can be easily distinguished from the original.	*/
7/*									*/
8/*  The #defines included with the banner are there because they are	*/
9/*  useful in subsequent code.  The macros #defined in the header or	*/
10/*  the body either are not useful outside of semantic actions or	*/
11/*  are conditional.							*/
12
13%% banner
14/* original parser id follows */
15/* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
16/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
17
18#define YYBYACC 1
19%% insert VERSION here
20
21#define YYEMPTY        (-1)
22#define yyclearin      (yychar = YYEMPTY)
23#define yyerrok        (yyerrflag = 0)
24#define YYRECOVERING() (yyerrflag != 0)
25#define YYENOMEM       (-2)
26#define YYEOF          0
27%% xdecls
28
29extern int YYPARSE_DECL();
30%% tables
31extern YYINT yylhs[];
32extern YYINT yylen[];
33extern YYINT yydefred[];
34extern YYINT yydgoto[];
35extern YYINT yysindex[];
36extern YYINT yyrindex[];
37extern YYINT yygindex[];
38extern YYINT yytable[];
39extern YYINT yycheck[];
40
41#if YYDEBUG || defined(yytname)
42extern char *yyname[];
43#endif
44#if YYDEBUG
45extern char *yyrule[];
46#endif
47%% global_vars
48
49#if YYDEBUG
50int      yydebug;
51#endif
52%% impure_vars
53
54int      yyerrflag;
55int      yychar;
56YYSTYPE  yyval;
57YYSTYPE  yylval;
58int      yynerrs;
59%% hdr_defs
60
61/* define the initial stack-sizes */
62#ifdef YYSTACKSIZE
63#undef YYMAXDEPTH
64#define YYMAXDEPTH  YYSTACKSIZE
65#else
66#ifdef YYMAXDEPTH
67#define YYSTACKSIZE YYMAXDEPTH
68#else
69#define YYSTACKSIZE 10000
70#define YYMAXDEPTH  10000
71#endif
72#endif
73
74#define YYINITSTACKSIZE 200
75
76typedef struct {
77    unsigned stacksize;
78    YYINT    *s_base;
79    YYINT    *s_mark;
80    YYINT    *s_last;
81    YYSTYPE  *l_base;
82    YYSTYPE  *l_mark;
83} YYSTACKDATA;
84%% hdr_vars
85/* variables for the parser stack */
86static YYSTACKDATA yystack;
87%% body_vars
88    int      yyerrflag;
89    int      yychar;
90    YYSTYPE  yyval;
91    YYSTYPE  yylval;
92    int      yynerrs;
93
94    /* variables for the parser stack */
95    YYSTACKDATA yystack;
96%% body_1
97
98#if YYDEBUG
99#include <stdio.h>	/* needed for printf */
100#endif
101
102#include <stdlib.h>	/* needed for malloc, etc */
103#include <string.h>	/* needed for memset */
104
105/* allocate initial stack or double stack size, up to YYMAXDEPTH */
106static int yygrowstack(YYSTACKDATA *data)
107{
108    int i;
109    unsigned newsize;
110    YYINT *newss;
111    YYSTYPE *newvs;
112
113    if ((newsize = data->stacksize) == 0)
114        newsize = YYINITSTACKSIZE;
115    else if (newsize >= YYMAXDEPTH)
116        return YYENOMEM;
117    else if ((newsize *= 2) > YYMAXDEPTH)
118        newsize = YYMAXDEPTH;
119
120    i = (int) (data->s_mark - data->s_base);
121    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
122    if (newss == NULL)
123        return YYENOMEM;
124
125    data->s_base = newss;
126    data->s_mark = newss + i;
127
128    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
129    if (newvs == NULL)
130        return YYENOMEM;
131
132    data->l_base = newvs;
133    data->l_mark = newvs + i;
134
135    data->stacksize = newsize;
136    data->s_last = data->s_base + newsize - 1;
137    return 0;
138}
139
140#if YYPURE || defined(YY_NO_LEAKS)
141static void yyfreestack(YYSTACKDATA *data)
142{
143    free(data->s_base);
144    free(data->l_base);
145    memset(data, 0, sizeof(*data));
146}
147#else
148#define yyfreestack(data) /* nothing */
149#endif
150
151#define YYABORT  goto yyabort
152#define YYREJECT goto yyabort
153#define YYACCEPT goto yyaccept
154#define YYERROR  goto yyerrlab
155
156int
157YYPARSE_DECL()
158{
159%% body_2
160    int yym, yyn, yystate;
161#if YYDEBUG
162    const char *yys;
163
164    if ((yys = getenv("YYDEBUG")) != NULL)
165    {
166        yyn = *yys;
167        if (yyn >= '0' && yyn <= '9')
168            yydebug = yyn - '0';
169    }
170#endif
171
172%% init_vars
173    memset(&yyval,  0, sizeof(yyval));
174    memset(&yylval, 0, sizeof(yylval));
175
176%% body_3
177    /* yym is set below */
178    /* yyn is set below */
179    yynerrs = 0;
180    yyerrflag = 0;
181    yychar = YYEMPTY;
182    yystate = 0;
183
184#if YYPURE
185    memset(&yystack, 0, sizeof(yystack));
186#endif
187
188    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
189    yystack.s_mark = yystack.s_base;
190    yystack.l_mark = yystack.l_base;
191    yystate = 0;
192    *yystack.s_mark = 0;
193
194yyloop:
195    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
196    if (yychar < 0)
197    {
198        yychar = YYLEX;
199        if (yychar < 0) yychar = YYEOF;
200#if YYDEBUG
201        if (yydebug)
202        {
203            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
204            printf("%sdebug: state %d, reading %d (%s)\n",
205                    YYPREFIX, yystate, yychar, yys);
206        }
207#endif
208    }
209    if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
210            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
211    {
212#if YYDEBUG
213        if (yydebug)
214            printf("%sdebug: state %d, shifting to state %d\n",
215                    YYPREFIX, yystate, yytable[yyn]);
216#endif
217        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
218        yystate = yytable[yyn];
219        *++yystack.s_mark = yytable[yyn];
220        *++yystack.l_mark = yylval;
221        yychar = YYEMPTY;
222        if (yyerrflag > 0)  --yyerrflag;
223        goto yyloop;
224    }
225    if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
226            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
227    {
228        yyn = yytable[yyn];
229        goto yyreduce;
230    }
231    if (yyerrflag != 0) goto yyinrecovery;
232
233    YYERROR_CALL("syntax error");
234
235    goto yyerrlab; /* redundant goto avoids 'unused label' warning */
236yyerrlab:
237    ++yynerrs;
238
239yyinrecovery:
240    if (yyerrflag < 3)
241    {
242        yyerrflag = 3;
243        for (;;)
244        {
245            if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
246                    yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
247            {
248#if YYDEBUG
249                if (yydebug)
250                    printf("%sdebug: state %d, error recovery shifting\
251 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
252#endif
253                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
254                yystate = yytable[yyn];
255                *++yystack.s_mark = yytable[yyn];
256                *++yystack.l_mark = yylval;
257                goto yyloop;
258            }
259            else
260            {
261#if YYDEBUG
262                if (yydebug)
263                    printf("%sdebug: error recovery discarding state %d\n",
264                            YYPREFIX, *yystack.s_mark);
265#endif
266                if (yystack.s_mark <= yystack.s_base) goto yyabort;
267                --yystack.s_mark;
268                --yystack.l_mark;
269            }
270        }
271    }
272    else
273    {
274        if (yychar == YYEOF) goto yyabort;
275#if YYDEBUG
276        if (yydebug)
277        {
278            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
279            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
280                    YYPREFIX, yystate, yychar, yys);
281        }
282#endif
283        yychar = YYEMPTY;
284        goto yyloop;
285    }
286
287yyreduce:
288#if YYDEBUG
289    if (yydebug)
290        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
291                YYPREFIX, yystate, yyn, yyrule[yyn]);
292#endif
293    yym = yylen[yyn];
294    if (yym > 0)
295        yyval = yystack.l_mark[1-yym];
296    else
297        memset(&yyval, 0, sizeof yyval);
298
299    switch (yyn)
300    {
301%% trailer
302    }
303    yystack.s_mark -= yym;
304    yystate = *yystack.s_mark;
305    yystack.l_mark -= yym;
306    yym = yylhs[yyn];
307    if (yystate == 0 && yym == 0)
308    {
309#if YYDEBUG
310        if (yydebug)
311            printf("%sdebug: after reduction, shifting from state 0 to\
312 state %d\n", YYPREFIX, YYFINAL);
313#endif
314        yystate = YYFINAL;
315        *++yystack.s_mark = YYFINAL;
316        *++yystack.l_mark = yyval;
317        if (yychar < 0)
318        {
319            yychar = YYLEX;
320            if (yychar < 0) yychar = YYEOF;
321#if YYDEBUG
322            if (yydebug)
323            {
324                if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
325                printf("%sdebug: state %d, reading %d (%s)\n",
326                        YYPREFIX, YYFINAL, yychar, yys);
327            }
328#endif
329        }
330        if (yychar == YYEOF) goto yyaccept;
331        goto yyloop;
332    }
333    if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
334            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
335        yystate = yytable[yyn];
336    else
337        yystate = yydgoto[yym];
338#if YYDEBUG
339    if (yydebug)
340        printf("%sdebug: after reduction, shifting from state %d \
341to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
342#endif
343    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
344    *++yystack.s_mark = (YYINT) yystate;
345    *++yystack.l_mark = yyval;
346    goto yyloop;
347
348yyoverflow:
349    YYERROR_CALL("yacc stack overflow");
350
351yyabort:
352    yyfreestack(&yystack);
353    return (1);
354
355yyaccept:
356    yyfreestack(&yystack);
357    return (0);
358}
359