yaccpar.skel revision 268899
1230557Sjimharris/* $Id: yaccpar.skel,v 1.5 2014/04/07 21:51:00 tom Exp $ */
2230557Sjimharris
3230557Sjimharris#include "defs.h"
4230557Sjimharris
5230557Sjimharris/*  If the skeleton is changed, the banner should be changed so that	*/
6230557Sjimharris/*  the altered version can be easily distinguished from the original.	*/
7230557Sjimharris/*									*/
8230557Sjimharris/*  The #defines included with the banner are there because they are	*/
9230557Sjimharris/*  useful in subsequent code.  The macros #defined in the header or	*/
10230557Sjimharris/*  the body either are not useful outside of semantic actions or	*/
11230557Sjimharris/*  are conditional.							*/
12230557Sjimharris
13230557Sjimharris%% banner
14230557Sjimharris/* original parser id follows */
15230557Sjimharris/* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
16230557Sjimharris/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
17230557Sjimharris
18230557Sjimharris#define YYBYACC 1
19230557Sjimharris%% insert VERSION here
20230557Sjimharris
21230557Sjimharris#define YYEMPTY        (-1)
22230557Sjimharris#define yyclearin      (yychar = YYEMPTY)
23230557Sjimharris#define yyerrok        (yyerrflag = 0)
24230557Sjimharris#define YYRECOVERING() (yyerrflag != 0)
25230557Sjimharris#define YYENOMEM       (-2)
26230557Sjimharris#define YYEOF          0
27230557Sjimharris%% xdecls
28230557Sjimharris
29230557Sjimharrisextern int YYPARSE_DECL();
30230557Sjimharris%% tables
31230557Sjimharrisextern YYINT yylhs[];
32230557Sjimharrisextern YYINT yylen[];
33230557Sjimharrisextern YYINT yydefred[];
34230557Sjimharrisextern YYINT yydgoto[];
35230557Sjimharrisextern YYINT yysindex[];
36230557Sjimharrisextern YYINT yyrindex[];
37230557Sjimharrisextern YYINT yygindex[];
38230557Sjimharrisextern YYINT yytable[];
39230557Sjimharrisextern YYINT yycheck[];
40230557Sjimharris
41230557Sjimharris#if YYDEBUG
42230557Sjimharrisextern char *yyname[];
43230557Sjimharrisextern char *yyrule[];
44230557Sjimharris#endif
45230557Sjimharris%% global_vars
46230557Sjimharris
47230557Sjimharrisint      yydebug;
48230557Sjimharrisint      yynerrs;
49230557Sjimharris%% impure_vars
50230557Sjimharris
51230557Sjimharrisint      yyerrflag;
52230557Sjimharrisint      yychar;
53230557SjimharrisYYSTYPE  yyval;
54230557SjimharrisYYSTYPE  yylval;
55230557Sjimharris%% hdr_defs
56230557Sjimharris
57230557Sjimharris/* define the initial stack-sizes */
58230557Sjimharris#ifdef YYSTACKSIZE
59230557Sjimharris#undef YYMAXDEPTH
60230557Sjimharris#define YYMAXDEPTH  YYSTACKSIZE
61230557Sjimharris#else
62230557Sjimharris#ifdef YYMAXDEPTH
63230557Sjimharris#define YYSTACKSIZE YYMAXDEPTH
64230557Sjimharris#else
65230557Sjimharris#define YYSTACKSIZE 10000
66230557Sjimharris#define YYMAXDEPTH  10000
67230557Sjimharris#endif
68230557Sjimharris#endif
69230557Sjimharris
70230557Sjimharris#define YYINITSTACKSIZE 200
71230557Sjimharris
72230557Sjimharristypedef struct {
73230557Sjimharris    unsigned stacksize;
74230557Sjimharris    YYINT    *s_base;
75230557Sjimharris    YYINT    *s_mark;
76230557Sjimharris    YYINT    *s_last;
77230557Sjimharris    YYSTYPE  *l_base;
78230557Sjimharris    YYSTYPE  *l_mark;
79230557Sjimharris} YYSTACKDATA;
80230557Sjimharris%% hdr_vars
81230557Sjimharris/* variables for the parser stack */
82230557Sjimharrisstatic YYSTACKDATA yystack;
83230557Sjimharris%% body_vars
84230557Sjimharris    int      yyerrflag;
85230557Sjimharris    int      yychar;
86230557Sjimharris    YYSTYPE  yyval;
87230557Sjimharris    YYSTYPE  yylval;
88230557Sjimharris
89230557Sjimharris    /* variables for the parser stack */
90230557Sjimharris    YYSTACKDATA yystack;
91230557Sjimharris%% body_1
92230557Sjimharris
93230557Sjimharris#if YYDEBUG
94230557Sjimharris#include <stdio.h>		/* needed for printf */
95230557Sjimharris#endif
96230557Sjimharris
97230557Sjimharris#include <stdlib.h>	/* needed for malloc, etc */
98230557Sjimharris#include <string.h>	/* needed for memset */
99230557Sjimharris
100230557Sjimharris/* allocate initial stack or double stack size, up to YYMAXDEPTH */
101230557Sjimharrisstatic int yygrowstack(YYSTACKDATA *data)
102230557Sjimharris{
103230557Sjimharris    int i;
104230557Sjimharris    unsigned newsize;
105230557Sjimharris    YYINT *newss;
106    YYSTYPE *newvs;
107
108    if ((newsize = data->stacksize) == 0)
109        newsize = YYINITSTACKSIZE;
110    else if (newsize >= YYMAXDEPTH)
111        return YYENOMEM;
112    else if ((newsize *= 2) > YYMAXDEPTH)
113        newsize = YYMAXDEPTH;
114
115    i = (int) (data->s_mark - data->s_base);
116    newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
117    if (newss == 0)
118        return YYENOMEM;
119
120    data->s_base = newss;
121    data->s_mark = newss + i;
122
123    newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
124    if (newvs == 0)
125        return YYENOMEM;
126
127    data->l_base = newvs;
128    data->l_mark = newvs + i;
129
130    data->stacksize = newsize;
131    data->s_last = data->s_base + newsize - 1;
132    return 0;
133}
134
135#if YYPURE || defined(YY_NO_LEAKS)
136static void yyfreestack(YYSTACKDATA *data)
137{
138    free(data->s_base);
139    free(data->l_base);
140    memset(data, 0, sizeof(*data));
141}
142#else
143#define yyfreestack(data) /* nothing */
144#endif
145
146#define YYABORT  goto yyabort
147#define YYREJECT goto yyabort
148#define YYACCEPT goto yyaccept
149#define YYERROR  goto yyerrlab
150
151int
152YYPARSE_DECL()
153{
154%% body_2
155    int yym, yyn, yystate;
156#if YYDEBUG
157    const char *yys;
158
159    if ((yys = getenv("YYDEBUG")) != 0)
160    {
161        yyn = *yys;
162        if (yyn >= '0' && yyn <= '9')
163            yydebug = yyn - '0';
164    }
165#endif
166
167    yynerrs = 0;
168    yyerrflag = 0;
169    yychar = YYEMPTY;
170    yystate = 0;
171
172#if YYPURE
173    memset(&yystack, 0, sizeof(yystack));
174#endif
175
176    if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
177    yystack.s_mark = yystack.s_base;
178    yystack.l_mark = yystack.l_base;
179    yystate = 0;
180    *yystack.s_mark = 0;
181
182yyloop:
183    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
184    if (yychar < 0)
185    {
186        if ((yychar = YYLEX) < 0) yychar = YYEOF;
187#if YYDEBUG
188        if (yydebug)
189        {
190            yys = yyname[YYTRANSLATE(yychar)];
191            printf("%sdebug: state %d, reading %d (%s)\n",
192                    YYPREFIX, yystate, yychar, yys);
193        }
194#endif
195    }
196    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
197            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
198    {
199#if YYDEBUG
200        if (yydebug)
201            printf("%sdebug: state %d, shifting to state %d\n",
202                    YYPREFIX, yystate, yytable[yyn]);
203#endif
204        if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
205        {
206            goto yyoverflow;
207        }
208        yystate = yytable[yyn];
209        *++yystack.s_mark = yytable[yyn];
210        *++yystack.l_mark = yylval;
211        yychar = YYEMPTY;
212        if (yyerrflag > 0)  --yyerrflag;
213        goto yyloop;
214    }
215    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
216            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
217    {
218        yyn = yytable[yyn];
219        goto yyreduce;
220    }
221    if (yyerrflag) goto yyinrecovery;
222
223    YYERROR_CALL("syntax error");
224
225    goto yyerrlab;
226
227yyerrlab:
228    ++yynerrs;
229
230yyinrecovery:
231    if (yyerrflag < 3)
232    {
233        yyerrflag = 3;
234        for (;;)
235        {
236            if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
237                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
238            {
239#if YYDEBUG
240                if (yydebug)
241                    printf("%sdebug: state %d, error recovery shifting\
242 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
243#endif
244                if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
245                {
246                    goto yyoverflow;
247                }
248                yystate = yytable[yyn];
249                *++yystack.s_mark = yytable[yyn];
250                *++yystack.l_mark = yylval;
251                goto yyloop;
252            }
253            else
254            {
255#if YYDEBUG
256                if (yydebug)
257                    printf("%sdebug: error recovery discarding state %d\n",
258                            YYPREFIX, *yystack.s_mark);
259#endif
260                if (yystack.s_mark <= yystack.s_base) goto yyabort;
261                --yystack.s_mark;
262                --yystack.l_mark;
263            }
264        }
265    }
266    else
267    {
268        if (yychar == YYEOF) goto yyabort;
269#if YYDEBUG
270        if (yydebug)
271        {
272            yys = yyname[YYTRANSLATE(yychar)];
273            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
274                    YYPREFIX, yystate, yychar, yys);
275        }
276#endif
277        yychar = YYEMPTY;
278        goto yyloop;
279    }
280
281yyreduce:
282#if YYDEBUG
283    if (yydebug)
284        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
285                YYPREFIX, yystate, yyn, yyrule[yyn]);
286#endif
287    yym = yylen[yyn];
288    if (yym)
289        yyval = yystack.l_mark[1-yym];
290    else
291        memset(&yyval, 0, sizeof yyval);
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            if ((yychar = YYLEX) < 0) yychar = YYEOF;
313#if YYDEBUG
314            if (yydebug)
315            {
316                yys = yyname[YYTRANSLATE(yychar)];
317                printf("%sdebug: state %d, reading %d (%s)\n",
318                        YYPREFIX, YYFINAL, yychar, yys);
319            }
320#endif
321        }
322        if (yychar == YYEOF) goto yyaccept;
323        goto yyloop;
324    }
325    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
326            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
327        yystate = yytable[yyn];
328    else
329        yystate = yydgoto[yym];
330#if YYDEBUG
331    if (yydebug)
332        printf("%sdebug: after reduction, shifting from state %d \
333to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
334#endif
335    if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
336    {
337        goto yyoverflow;
338    }
339    *++yystack.s_mark = (YYINT) yystate;
340    *++yystack.l_mark = yyval;
341    goto yyloop;
342
343yyoverflow:
344    YYERROR_CALL("yacc stack overflow");
345
346yyabort:
347    yyfreestack(&yystack);
348    return (1);
349
350yyaccept:
351    yyfreestack(&yystack);
352    return (0);
353}
354