Annotation of src/usr.bin/yacc/skeleton.c, Revision 1.39
1.39 ! guenther 1: /* $OpenBSD: skeleton.c,v 1.38 2015/12/30 17:16:47 mmcc Exp $ */
1.4 deraadt 2: /* $NetBSD: skeleton.c,v 1.10 1996/03/25 00:36:18 mrg Exp $ */
3:
4: /*
5: * Copyright (c) 1989 The Regents of the University of California.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to Berkeley by
9: * Robert Paul Corbett.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
1.20 millert 19: * 3. Neither the name of the University nor the names of its contributors
1.4 deraadt 20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: */
35:
1.1 deraadt 36: #include "defs.h"
37:
38: /* The definition of yysccsid in the banner should be replaced with */
39: /* a #pragma ident directive if the target C compiler supports */
40: /* #pragma ident directives. */
41: /* */
42: /* If the skeleton is changed, the banner should be changed so that */
43: /* the altered version can be easily distinguished from the original. */
44: /* */
45: /* The #defines included with the banner are there because they are */
46: /* useful in subsequent code. The macros #defined in the header or */
47: /* the body either are not useful outside of semantic actions or */
48: /* are conditional. */
49:
50: char *banner[] =
51: {
1.33 tedu 52: "#include <stdlib.h>",
53: "#include <string.h>",
54: "#define YYBYACC 1",
55: "#define YYMAJOR 1",
56: "#define YYMINOR 9",
57: "#define YYLEX yylex()",
58: "#define YYEMPTY -1",
59: "#define yyclearin (yychar=(YYEMPTY))",
60: "#define yyerrok (yyerrflag=0)",
61: "#define YYRECOVERING() (yyerrflag!=0)",
62: NULL
1.1 deraadt 63: };
64:
65:
66: char *tables[] =
67: {
1.33 tedu 68: "extern const short yylhs[];",
69: "extern const short yylen[];",
70: "extern const short yydefred[];",
71: "extern const short yydgoto[];",
72: "extern const short yysindex[];",
73: "extern const short yyrindex[];",
74: "extern const short yygindex[];",
75: "extern const short yytable[];",
76: "extern const short yycheck[];",
77: "#if YYDEBUG",
78: "extern const char *const yyname[];",
79: "extern const char *const yyrule[];",
80: "#endif",
81: NULL
1.1 deraadt 82: };
83:
84:
85: char *header[] =
86: {
1.33 tedu 87: "#ifdef YYSTACKSIZE",
88: "#undef YYMAXDEPTH",
89: "#define YYMAXDEPTH YYSTACKSIZE",
90: "#else",
91: "#ifdef YYMAXDEPTH",
92: "#define YYSTACKSIZE YYMAXDEPTH",
93: "#else",
94: "#define YYSTACKSIZE 10000",
95: "#define YYMAXDEPTH 10000",
96: "#endif",
97: "#endif",
98: "#define YYINITSTACKSIZE 200",
99: "/* LINTUSED */",
100: "int yydebug;",
101: "int yynerrs;",
102: "int yyerrflag;",
103: "int yychar;",
104: "short *yyssp;",
105: "YYSTYPE *yyvsp;",
106: "YYSTYPE yyval;",
107: "YYSTYPE yylval;",
108: "short *yyss;",
109: "short *yysslim;",
110: "YYSTYPE *yyvs;",
111: "unsigned int yystacksize;",
1.39 ! guenther 112: "int yyparse(void);",
1.33 tedu 113: NULL
1.1 deraadt 114: };
115:
116:
117: char *body[] =
118: {
1.33 tedu 119: "/* allocate initial stack or double stack size, up to YYMAXDEPTH */",
120: "static int yygrowstack(void)",
121: "{",
122: " unsigned int newsize;",
123: " long sslen;",
124: " short *newss;",
125: " YYSTYPE *newvs;",
126: "",
127: " if ((newsize = yystacksize) == 0)",
128: " newsize = YYINITSTACKSIZE;",
129: " else if (newsize >= YYMAXDEPTH)",
130: " return -1;",
131: " else if ((newsize *= 2) > YYMAXDEPTH)",
132: " newsize = YYMAXDEPTH;",
133: " sslen = yyssp - yyss;",
134: "#ifdef SIZE_MAX",
135: "#define YY_SIZE_MAX SIZE_MAX",
136: "#else",
137: "#define YY_SIZE_MAX 0xffffffffU",
138: "#endif",
139: " if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)",
140: " goto bail;",
1.38 mmcc 141: " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :",
142: " (short *)malloc(newsize * sizeof *newss); /* overflow check above */",
1.33 tedu 143: " if (newss == NULL)",
144: " goto bail;",
145: " yyss = newss;",
146: " yyssp = newss + sslen;",
147: " if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)",
148: " goto bail;",
1.38 mmcc 149: " newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :",
150: " (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */",
1.33 tedu 151: " if (newvs == NULL)",
152: " goto bail;",
153: " yyvs = newvs;",
154: " yyvsp = newvs + sslen;",
155: " yystacksize = newsize;",
156: " yysslim = yyss + newsize - 1;",
157: " return 0;",
158: "bail:",
1.38 mmcc 159: " if (yyss)",
160: " free(yyss);",
161: " if (yyvs)",
162: " free(yyvs);",
1.33 tedu 163: " yyss = yyssp = NULL;",
164: " yyvs = yyvsp = NULL;",
165: " yystacksize = 0;",
166: " return -1;",
167: "}",
168: "",
169: "#define YYABORT goto yyabort",
170: "#define YYREJECT goto yyabort",
171: "#define YYACCEPT goto yyaccept",
172: "#define YYERROR goto yyerrlab",
173: "int",
174: "yyparse(void)",
175: "{",
176: " int yym, yyn, yystate;",
177: "#if YYDEBUG",
178: " const char *yys;",
179: "",
180: " if ((yys = getenv(\"YYDEBUG\")))",
181: " {",
182: " yyn = *yys;",
183: " if (yyn >= '0' && yyn <= '9')",
184: " yydebug = yyn - '0';",
185: " }",
186: "#endif /* YYDEBUG */",
187: "",
188: " yynerrs = 0;",
189: " yyerrflag = 0;",
190: " yychar = (-1);",
191: "",
192: " if (yyss == NULL && yygrowstack()) goto yyoverflow;",
193: " yyssp = yyss;",
194: " yyvsp = yyvs;",
195: " *yyssp = yystate = 0;",
196: "",
197: "yyloop:",
198: " if ((yyn = yydefred[yystate]) != 0) goto yyreduce;",
199: " if (yychar < 0)",
200: " {",
201: " if ((yychar = yylex()) < 0) yychar = 0;",
202: "#if YYDEBUG",
203: " if (yydebug)",
204: " {",
205: " yys = 0;",
206: " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
207: " if (!yys) yys = \"illegal-symbol\";",
208: " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
209: " YYPREFIX, yystate, yychar, yys);",
210: " }",
211: "#endif",
212: " }",
213: " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
214: " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
215: " {",
216: "#if YYDEBUG",
217: " if (yydebug)",
218: " printf(\"%sdebug: state %d, shifting to state %d\\n\",",
219: " YYPREFIX, yystate, yytable[yyn]);",
220: "#endif",
221: " if (yyssp >= yysslim && yygrowstack())",
222: " {",
223: " goto yyoverflow;",
224: " }",
225: " *++yyssp = yystate = yytable[yyn];",
226: " *++yyvsp = yylval;",
227: " yychar = (-1);",
228: " if (yyerrflag > 0) --yyerrflag;",
229: " goto yyloop;",
230: " }",
231: " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
232: " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
233: " {",
234: " yyn = yytable[yyn];",
235: " goto yyreduce;",
236: " }",
237: " if (yyerrflag) goto yyinrecovery;",
1.35 guenther 238: "#if defined(__GNUC__)",
1.33 tedu 239: " goto yynewerror;",
240: "#endif",
241: "yynewerror:",
242: " yyerror(\"syntax error\");",
1.35 guenther 243: "#if defined(__GNUC__)",
1.33 tedu 244: " goto yyerrlab;",
245: "#endif",
246: "yyerrlab:",
247: " ++yynerrs;",
248: "yyinrecovery:",
249: " if (yyerrflag < 3)",
250: " {",
251: " yyerrflag = 3;",
252: " for (;;)",
253: " {",
254: " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
255: " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
256: " {",
257: "#if YYDEBUG",
258: " if (yydebug)",
259: " printf(\"%sdebug: state %d, error recovery shifting\\",
260: " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
261: "#endif",
262: " if (yyssp >= yysslim && yygrowstack())",
263: " {",
264: " goto yyoverflow;",
265: " }",
266: " *++yyssp = yystate = yytable[yyn];",
267: " *++yyvsp = yylval;",
268: " goto yyloop;",
269: " }",
270: " else",
271: " {",
272: "#if YYDEBUG",
273: " if (yydebug)",
274: " printf(\"%sdebug: error recovery discarding state %d\
1.1 deraadt 275: \\n\",",
1.33 tedu 276: " YYPREFIX, *yyssp);",
277: "#endif",
278: " if (yyssp <= yyss) goto yyabort;",
279: " --yyssp;",
280: " --yyvsp;",
281: " }",
282: " }",
283: " }",
284: " else",
285: " {",
286: " if (yychar == 0) goto yyabort;",
287: "#if YYDEBUG",
288: " if (yydebug)",
289: " {",
290: " yys = 0;",
291: " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
292: " if (!yys) yys = \"illegal-symbol\";",
293: " printf(\"%sdebug: state %d, error recovery discards token %d\
1.1 deraadt 294: (%s)\\n\",",
1.33 tedu 295: " YYPREFIX, yystate, yychar, yys);",
296: " }",
297: "#endif",
298: " yychar = (-1);",
299: " goto yyloop;",
300: " }",
301: "yyreduce:",
302: "#if YYDEBUG",
303: " if (yydebug)",
304: " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
305: " YYPREFIX, yystate, yyn, yyrule[yyn]);",
306: "#endif",
307: " yym = yylen[yyn];",
308: " if (yym)",
309: " yyval = yyvsp[1-yym];",
310: " else",
311: " memset(&yyval, 0, sizeof yyval);",
312: " switch (yyn)",
313: " {",
314: NULL
1.1 deraadt 315: };
316:
317:
318: char *trailer[] =
319: {
1.33 tedu 320: " }",
321: " yyssp -= yym;",
322: " yystate = *yyssp;",
323: " yyvsp -= yym;",
324: " yym = yylhs[yyn];",
325: " if (yystate == 0 && yym == 0)",
326: " {",
327: "#if YYDEBUG",
328: " if (yydebug)",
329: " printf(\"%sdebug: after reduction, shifting from state 0 to\\",
330: " state %d\\n\", YYPREFIX, YYFINAL);",
331: "#endif",
332: " yystate = YYFINAL;",
333: " *++yyssp = YYFINAL;",
334: " *++yyvsp = yyval;",
335: " if (yychar < 0)",
336: " {",
337: " if ((yychar = yylex()) < 0) yychar = 0;",
338: "#if YYDEBUG",
339: " if (yydebug)",
340: " {",
341: " yys = 0;",
342: " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
343: " if (!yys) yys = \"illegal-symbol\";",
344: " printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
345: " YYPREFIX, YYFINAL, yychar, yys);",
346: " }",
347: "#endif",
348: " }",
349: " if (yychar == 0) goto yyaccept;",
350: " goto yyloop;",
351: " }",
352: " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
353: " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
354: " yystate = yytable[yyn];",
355: " else",
356: " yystate = yydgoto[yym];",
357: "#if YYDEBUG",
358: " if (yydebug)",
359: " printf(\"%sdebug: after reduction, shifting from state %d \\",
360: "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
361: "#endif",
362: " if (yyssp >= yysslim && yygrowstack())",
363: " {",
364: " goto yyoverflow;",
365: " }",
366: " *++yyssp = yystate;",
367: " *++yyvsp = yyval;",
368: " goto yyloop;",
369: "yyoverflow:",
370: " yyerror(\"yacc stack overflow\");",
371: "yyabort:",
1.38 mmcc 372: " if (yyss)",
373: " free(yyss);",
374: " if (yyvs)",
375: " free(yyvs);",
1.33 tedu 376: " yyss = yyssp = NULL;",
377: " yyvs = yyvsp = NULL;",
378: " yystacksize = 0;",
379: " return (1);",
380: "yyaccept:",
1.38 mmcc 381: " if (yyss)",
382: " free(yyss);",
383: " if (yyvs)",
384: " free(yyvs);",
1.33 tedu 385: " yyss = yyssp = NULL;",
386: " yyvs = yyvsp = NULL;",
387: " yystacksize = 0;",
388: " return (0);",
389: "}",
390: NULL
1.1 deraadt 391: };
392:
393:
1.17 pvalchev 394: void
1.21 pvalchev 395: write_section(char *section[])
1.1 deraadt 396: {
1.33 tedu 397: int i;
398: char *s;
399:
400: for (i = 0; (s = section[i]); ++i) {
401: ++outline;
1.34 tedu 402: fputs(s, code_file);
403: putc('\n', code_file);
1.1 deraadt 404: }
405: }