xref: /freebsd/contrib/byacc/yaccpar.skel (revision efe3b0de1438e7a8473d92f2be57072394559e3c)
1/* $Id: yaccpar.skel,v 1.8 2016/12/02 21:44:42 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
49int      yydebug;
50int      yynerrs;
51%% impure_vars
52
53int      yyerrflag;
54int      yychar;
55YYSTYPE  yyval;
56YYSTYPE  yylval;
57%% hdr_defs
58
59/* define the initial stack-sizes */
60#ifdef YYSTACKSIZE
61#undef YYMAXDEPTH
62#define YYMAXDEPTH  YYSTACKSIZE
63#else
64#ifdef YYMAXDEPTH
65#define YYSTACKSIZE YYMAXDEPTH
66#else
67#define YYSTACKSIZE 10000
68#define YYMAXDEPTH  10000
69#endif
70#endif
71
72#define YYINITSTACKSIZE 200
73
74typedef struct {
75    unsigned stacksize;
76    YYINT    *s_base;
77    YYINT    *s_mark;
78    YYINT    *s_last;
79    YYSTYPE  *l_base;
80    YYSTYPE  *l_mark;
81} YYSTACKDATA;
82%% hdr_vars
83/* variables for the parser stack */
84static YYSTACKDATA yystack;
85%% body_vars
86    int      yyerrflag;
87    int      yychar;
88    YYSTYPE  yyval;
89    YYSTYPE  yylval;
90
91    /* variables for the parser stack */
92    YYSTACKDATA yystack;
93%% body_1
94
95#if YYDEBUG
96#include <stdio.h>	/* needed for printf */
97#endif
98
99#include <stdlib.h>	/* needed for malloc, etc */
100#include <string.h>	/* needed for memset */
101
102/* allocate initial stack or double stack size, up to YYMAXDEPTH */
103static int yygrowstack(YYSTACKDATA *data)
104{
105    int i;
106    unsigned newsize;
107    YYINT *newss;
108    YYSTYPE *newvs;
109
110    if ((newsize = data->stacksize) == 0)
111        newsize = YYINITSTACKSIZE;
112    else if (newsize >= YYMAXDEPTH)
113        return YYENOMEM;
114    else if ((newsize *= 2) > YYMAXDEPTH)
115        newsize = YYMAXDEPTH;
116
117    i = (int) (data->s_mark - data->s_base);
118    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
119    if (newss == 0)
120        return YYENOMEM;
121
122    data->s_base = newss;
123    data->s_mark = newss + i;
124
125    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
126    if (newvs == 0)
127        return YYENOMEM;
128
129    data->l_base = newvs;
130    data->l_mark = newvs + i;
131
132    data->stacksize = newsize;
133    data->s_last = data->s_base + newsize - 1;
134    return 0;
135}
136
137#if YYPURE || defined(YY_NO_LEAKS)
138static void yyfreestack(YYSTACKDATA *data)
139{
140    free(data->s_base);
141    free(data->l_base);
142    memset(data, 0, sizeof(*data));
143}
144#else
145#define yyfreestack(data) /* nothing */
146#endif
147
148#define YYABORT  goto yyabort
149#define YYREJECT goto yyabort
150#define YYACCEPT goto yyaccept
151#define YYERROR  goto yyerrlab
152
153int
154YYPARSE_DECL()
155{
156%% body_2
157    int yym, yyn, yystate;
158#if YYDEBUG
159    const char *yys;
160
161    if ((yys = getenv("YYDEBUG")) != 0)
162    {
163        yyn = *yys;
164        if (yyn >= '0' && yyn <= '9')
165            yydebug = yyn - '0';
166    }
167#endif
168
169%% body_3
170    yym = 0;
171    yyn = 0;
172    yynerrs = 0;
173    yyerrflag = 0;
174    yychar = YYEMPTY;
175    yystate = 0;
176
177#if YYPURE
178    memset(&yystack, 0, sizeof(yystack));
179#endif
180
181    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
182    yystack.s_mark = yystack.s_base;
183    yystack.l_mark = yystack.l_base;
184    yystate = 0;
185    *yystack.s_mark = 0;
186
187yyloop:
188    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
189    if (yychar < 0)
190    {
191        yychar = YYLEX;
192        if (yychar < 0) yychar = YYEOF;
193#if YYDEBUG
194        if (yydebug)
195        {
196            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
197            printf("%sdebug: state %d, reading %d (%s)\n",
198                    YYPREFIX, yystate, yychar, yys);
199        }
200#endif
201    }
202    if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
203            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
204    {
205#if YYDEBUG
206        if (yydebug)
207            printf("%sdebug: state %d, shifting to state %d\n",
208                    YYPREFIX, yystate, yytable[yyn]);
209#endif
210        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
211        yystate = yytable[yyn];
212        *++yystack.s_mark = yytable[yyn];
213        *++yystack.l_mark = yylval;
214        yychar = YYEMPTY;
215        if (yyerrflag > 0)  --yyerrflag;
216        goto yyloop;
217    }
218    if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
219            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
220    {
221        yyn = yytable[yyn];
222        goto yyreduce;
223    }
224    if (yyerrflag != 0) goto yyinrecovery;
225
226    YYERROR_CALL("syntax error");
227
228    goto yyerrlab; /* redundant goto avoids 'unused label' warning */
229yyerrlab:
230    ++yynerrs;
231
232yyinrecovery:
233    if (yyerrflag < 3)
234    {
235        yyerrflag = 3;
236        for (;;)
237        {
238            if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
239                    yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
240            {
241#if YYDEBUG
242                if (yydebug)
243                    printf("%sdebug: state %d, error recovery shifting\
244 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
245#endif
246                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
247                yystate = yytable[yyn];
248                *++yystack.s_mark = yytable[yyn];
249                *++yystack.l_mark = yylval;
250                goto yyloop;
251            }
252            else
253            {
254#if YYDEBUG
255                if (yydebug)
256                    printf("%sdebug: error recovery discarding state %d\n",
257                            YYPREFIX, *yystack.s_mark);
258#endif
259                if (yystack.s_mark <= yystack.s_base) goto yyabort;
260                --yystack.s_mark;
261                --yystack.l_mark;
262            }
263        }
264    }
265    else
266    {
267        if (yychar == YYEOF) goto yyabort;
268#if YYDEBUG
269        if (yydebug)
270        {
271            if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
272            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
273                    YYPREFIX, yystate, yychar, yys);
274        }
275#endif
276        yychar = YYEMPTY;
277        goto yyloop;
278    }
279
280yyreduce:
281#if YYDEBUG
282    if (yydebug)
283        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
284                YYPREFIX, yystate, yyn, yyrule[yyn]);
285#endif
286    yym = yylen[yyn];
287    if (yym > 0)
288        yyval = yystack.l_mark[1-yym];
289    else
290        memset(&yyval, 0, sizeof yyval);
291
292    switch (yyn)
293    {
294%% trailer
295    }
296    yystack.s_mark -= yym;
297    yystate = *yystack.s_mark;
298    yystack.l_mark -= yym;
299    yym = yylhs[yyn];
300    if (yystate == 0 && yym == 0)
301    {
302#if YYDEBUG
303        if (yydebug)
304            printf("%sdebug: after reduction, shifting from state 0 to\
305 state %d\n", YYPREFIX, YYFINAL);
306#endif
307        yystate = YYFINAL;
308        *++yystack.s_mark = YYFINAL;
309        *++yystack.l_mark = yyval;
310        if (yychar < 0)
311        {
312            yychar = YYLEX;
313            if (yychar < 0) yychar = YYEOF;
314#if YYDEBUG
315            if (yydebug)
316            {
317                if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
318                printf("%sdebug: state %d, reading %d (%s)\n",
319                        YYPREFIX, YYFINAL, yychar, yys);
320            }
321#endif
322        }
323        if (yychar == YYEOF) goto yyaccept;
324        goto yyloop;
325    }
326    if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
327            yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
328        yystate = yytable[yyn];
329    else
330        yystate = yydgoto[yym];
331#if YYDEBUG
332    if (yydebug)
333        printf("%sdebug: after reduction, shifting from state %d \
334to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
335#endif
336    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
337    *++yystack.s_mark = (YYINT) yystate;
338    *++yystack.l_mark = yyval;
339    goto yyloop;
340
341yyoverflow:
342    YYERROR_CALL("yacc stack overflow");
343
344yyabort:
345    yyfreestack(&yystack);
346    return (1);
347
348yyaccept:
349    yyfreestack(&yystack);
350    return (0);
351}
352