2 * Copyright (c) 1989 The Regents of the University of California.
5 * This code is derived from software contributed to Berkeley by
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * @(#)skeleton.c 5.8 (Berkeley) 4/29/95
38 * $FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28.2.1 2001/07/19 05:46:39 peter Exp $
39 * $DragonFly: src/usr.bin/yacc/skeleton.c,v 1.7 2008/07/12 16:52:48 mneumann Exp $
44 /* The definition of yysccsid in the banner should be replaced with */
45 /* a #pragma ident directive if the target C compiler supports */
46 /* #pragma ident directives. */
48 /* If the skeleton is changed, the banner should be changed so that */
49 /* the altered version can be easily distinguished from the original. */
51 /* The #defines included with the banner are there because they are */
52 /* useful in subsequent code. The macros #defined in the header or */
53 /* the body either are not useful outside of semantic actions or */
54 /* are conditional. */
56 const char *banner
[] = {
57 "#include <stdlib.h>",
58 "#include <string.h>",
62 "#define YYLEX yylex()",
64 "#define yyclearin (yychar=(YYEMPTY))",
65 "#define yyerrok (yyerrflag=0)",
66 "#define YYRECOVERING() (yyerrflag!=0)",
67 "#if defined(__cplusplus) || __STDC__",
68 "static int yygrowstack(void);",
70 "static int yygrowstack();",
75 const char *tables
[] = {
76 "extern const short yylhs[];",
77 "extern const short yylen[];",
78 "extern const short yydefred[];",
79 "extern const short yydgoto[];",
80 "extern const short yysindex[];",
81 "extern const short yyrindex[];",
82 "extern const short yygindex[];",
83 "extern const short yytable[];",
84 "extern const short yycheck[];",
86 "extern char *yyname[];",
87 "extern char *yyrule[];",
92 const char *header
[] = {
98 "#define YYMAXDEPTH YYSTACKSIZE",
101 "#define YYSTACKSIZE YYMAXDEPTH",
103 "#define YYSTACKSIZE 10000",
104 "#define YYMAXDEPTH 10000",
107 "#define YYINITSTACKSIZE 200",
123 const char *body
[] = {
124 "/* allocate initial stack or double stack size, up to YYMAXDEPTH */",
125 "static int yygrowstack(void)",
131 " if ((newsize = yystacksize) == 0)",
132 " newsize = YYINITSTACKSIZE;",
133 " else if (newsize >= YYMAXDEPTH)",
135 " else if ((newsize *= 2) > YYMAXDEPTH)",
136 " newsize = YYMAXDEPTH;",
137 " i = yyssp - yyss;",
138 " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :",
139 " (short *)malloc(newsize * sizeof *newss);",
140 " if (newss == NULL)",
143 " yyssp = newss + i;",
144 " newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :",
145 " (YYSTYPE *)malloc(newsize * sizeof *newvs);",
146 " if (newvs == NULL)",
149 " yyvsp = newvs + i;",
150 " yystacksize = newsize;",
151 " yysslim = yyss + newsize - 1;",
155 "#define YYABORT goto yyabort",
156 "#define YYREJECT goto yyabort",
157 "#define YYACCEPT goto yyaccept",
158 "#define YYERROR goto yyerrlab",
160 "#ifndef YYPARSE_PARAM",
161 "#if defined(__cplusplus) || __STDC__",
162 "#define YYPARSE_PARAM_ARG void",
163 "#define YYPARSE_PARAM_DECL",
164 "#else /* ! ANSI-C/C++ */",
165 "#define YYPARSE_PARAM_ARG",
166 "#define YYPARSE_PARAM_DECL",
167 "#endif /* ANSI-C/C++ */",
168 "#else /* YYPARSE_PARAM */",
169 "#ifndef YYPARSE_PARAM_TYPE",
170 "#define YYPARSE_PARAM_TYPE void *",
172 "#if defined(__cplusplus) || __STDC__",
173 "#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM",
174 "#define YYPARSE_PARAM_DECL",
175 "#else /* ! ANSI-C/C++ */",
176 "#define YYPARSE_PARAM_ARG YYPARSE_PARAM",
177 "#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;",
178 "#endif /* ANSI-C/C++ */",
179 "#endif /* ! YYPARSE_PARAM */",
182 "yyparse (YYPARSE_PARAM_ARG)",
183 " YYPARSE_PARAM_DECL",
185 " int yym, yyn, yystate;",
189 " if ((yys = getenv(\"YYDEBUG\")))",
192 " if (yyn >= '0' && yyn <= '9')",
193 " yydebug = yyn - '0';",
201 " if (yyss == NULL && yygrowstack()) goto yyoverflow;",
204 " *yyssp = yystate = 0;",
207 " if ((yyn = yydefred[yystate])) goto yyreduce;",
210 " if ((yychar = yylex()) < 0) yychar = 0;",
215 " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
216 " if (!yys) yys = \"illegal-symbol\";",
217 " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
218 " YYPREFIX, yystate, yychar, yys);",
222 " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
223 " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
227 " printf(\"%sdebug: state %d, shifting to state %d\\n\",",
228 " YYPREFIX, yystate, yytable[yyn]);",
230 " if (yyssp >= yysslim && yygrowstack())",
234 " *++yyssp = yystate = yytable[yyn];",
235 " *++yyvsp = yylval;",
237 " if (yyerrflag > 0) --yyerrflag;",
240 " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
241 " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
243 " yyn = yytable[yyn];",
246 " if (yyerrflag) goto yyinrecovery;",
247 "#if defined(lint) || defined(__GNUC__)",
251 " yyerror(\"syntax error\");",
252 "#if defined(lint) || defined(__GNUC__)",
258 " if (yyerrflag < 3)",
263 " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
264 " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
268 " printf(\"%sdebug: state %d, error recovery shifting\\",
269 " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
271 " if (yyssp >= yysslim && yygrowstack())",
275 " *++yyssp = yystate = yytable[yyn];",
276 " *++yyvsp = yylval;",
283 " printf(\"%sdebug: error recovery discarding state %d\
285 " YYPREFIX, *yyssp);",
287 " if (yyssp <= yyss) goto yyabort;",
295 " if (yychar == 0) goto yyabort;",
300 " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
301 " if (!yys) yys = \"illegal-symbol\";",
302 " printf(\"%sdebug: state %d, error recovery discards token %d\
304 " YYPREFIX, yystate, yychar, yys);",
313 " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
314 " YYPREFIX, yystate, yyn, yyrule[yyn]);",
316 " yym = yylen[yyn];",
318 " yyval = yyvsp[1-yym];",
320 " memset(&yyval, 0, sizeof yyval);",
321 " yyval = yyvsp[1-yym];",
327 const char *trailer
[] = {
330 " yystate = *yyssp;",
332 " yym = yylhs[yyn];",
333 " if (yystate == 0 && yym == 0)",
337 " printf(\"%sdebug: after reduction, shifting from state 0 to\\",
338 " state %d\\n\", YYPREFIX, YYFINAL);",
340 " yystate = YYFINAL;",
341 " *++yyssp = YYFINAL;",
342 " *++yyvsp = yyval;",
345 " if ((yychar = yylex()) < 0) yychar = 0;",
350 " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
351 " if (!yys) yys = \"illegal-symbol\";",
352 " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
353 " YYPREFIX, YYFINAL, yychar, yys);",
357 " if (yychar == 0) goto yyaccept;",
360 " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
361 " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
362 " yystate = yytable[yyn];",
364 " yystate = yydgoto[yym];",
367 " printf(\"%sdebug: after reduction, shifting from state %d \\",
368 "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
370 " if (yyssp >= yysslim && yygrowstack())",
374 " *++yyssp = yystate;",
375 " *++yyvsp = yyval;",
378 " yyerror(\"yacc stack overflow\");",
389 write_section(const char **section
)
397 for (i
= 0; (s
= section
[i
]); ++i
)