xref: /original-bsd/usr.bin/yacc/skeleton.c (revision 7f8f2e51)
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Robert Paul Corbett.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #ifndef lint
12 static char sccsid[] = "@(#)skeleton.c	5.6 (Berkeley) 01/27/91";
13 #endif /* not lint */
14 
15 #include "defs.h"
16 
17 /*  The banner used here should be replaced with an #ident directive	*/
18 /*  if the target C compiler supports #ident directives.		*/
19 /*									*/
20 /*  If the skeleton is changed, the banner should be changed so that	*/
21 /*  the altered version can easily be distinguished from the original.	*/
22 
23 char *banner[] =
24 {
25     "#ifndef lint",
26     "static char yysccsid[] = \"@(#)yaccpar	1.8 (Berkeley) 01/20/90\";",
27     "#endif",
28     "#define YYBYACC 1",
29     0
30 };
31 
32 
33 char *tables[] =
34 {
35     "extern short yylhs[];",
36     "extern short yylen[];",
37     "extern short yydefred[];",
38     "extern short yydgoto[];",
39     "extern short yysindex[];",
40     "extern short yyrindex[];",
41     "extern short yygindex[];",
42     "extern short yytable[];",
43     "extern short yycheck[];",
44     "#if YYDEBUG",
45     "extern char *yyname[];",
46     "extern char *yyrule[];",
47     "#endif",
48     0
49 };
50 
51 
52 char *header[] =
53 {
54     "#define yyclearin (yychar=(-1))",
55     "#define yyerrok (yyerrflag=0)",
56     "#ifdef YYSTACKSIZE",
57     "#ifndef YYMAXDEPTH",
58     "#define YYMAXDEPTH YYSTACKSIZE",
59     "#endif",
60     "#else",
61     "#ifdef YYMAXDEPTH",
62     "#define YYSTACKSIZE YYMAXDEPTH",
63     "#else",
64     "#define YYSTACKSIZE 500",
65     "#define YYMAXDEPTH 500",
66     "#endif",
67     "#endif",
68     "int yydebug;",
69     "int yynerrs;",
70     "int yyerrflag;",
71     "int yychar;",
72     "short *yyssp;",
73     "YYSTYPE *yyvsp;",
74     "YYSTYPE yyval;",
75     "YYSTYPE yylval;",
76     "short yyss[YYSTACKSIZE];",
77     "YYSTYPE yyvs[YYSTACKSIZE];",
78     "#define yystacksize YYSTACKSIZE",
79     0
80 };
81 
82 
83 char *body[] =
84 {
85     "#define YYABORT goto yyabort",
86     "#define YYACCEPT goto yyaccept",
87     "#define YYERROR goto yyerrlab",
88     "int",
89     "yyparse()",
90     "{",
91     "    register int yym, yyn, yystate;",
92     "#if YYDEBUG",
93     "    register char *yys;",
94     "    extern char *getenv();",
95     "",
96     "    if (yys = getenv(\"YYDEBUG\"))",
97     "    {",
98     "        yyn = *yys;",
99     "        if (yyn >= '0' && yyn <= '9')",
100     "            yydebug = yyn - '0';",
101     "    }",
102     "#endif",
103     "",
104     "    yynerrs = 0;",
105     "    yyerrflag = 0;",
106     "    yychar = (-1);",
107     "",
108     "    yyssp = yyss;",
109     "    yyvsp = yyvs;",
110     "    *yyssp = yystate = 0;",
111     "",
112     "yyloop:",
113     "    if (yyn = yydefred[yystate]) goto yyreduce;",
114     "    if (yychar < 0)",
115     "    {",
116     "        if ((yychar = yylex()) < 0) yychar = 0;",
117     "#if YYDEBUG",
118     "        if (yydebug)",
119     "        {",
120     "            yys = 0;",
121     "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
122     "            if (!yys) yys = \"illegal-symbol\";",
123     "            printf(\"yydebug: state %d, reading %d (%s)\\n\", yystate,",
124     "                    yychar, yys);",
125     "        }",
126     "#endif",
127     "    }",
128     "    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
129     "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
130     "    {",
131     "#if YYDEBUG",
132     "        if (yydebug)",
133     "            printf(\"yydebug: state %d, shifting to state %d\\n\",",
134     "                    yystate, yytable[yyn]);",
135     "#endif",
136     "        if (yyssp >= yyss + yystacksize - 1)",
137     "        {",
138     "            goto yyoverflow;",
139     "        }",
140     "        *++yyssp = yystate = yytable[yyn];",
141     "        *++yyvsp = yylval;",
142     "        yychar = (-1);",
143     "        if (yyerrflag > 0)  --yyerrflag;",
144     "        goto yyloop;",
145     "    }",
146     "    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
147     "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
148     "    {",
149     "        yyn = yytable[yyn];",
150     "        goto yyreduce;",
151     "    }",
152     "    if (yyerrflag) goto yyinrecovery;",
153     "#ifdef lint",
154     "    goto yynewerror;",
155     "#endif",
156     "yynewerror:",
157     "    yyerror(\"syntax error\");",
158     "#ifdef lint",
159     "    goto yyerrlab;",
160     "#endif",
161     "yyerrlab:",
162     "    ++yynerrs;",
163     "yyinrecovery:",
164     "    if (yyerrflag < 3)",
165     "    {",
166     "        yyerrflag = 3;",
167     "        for (;;)",
168     "        {",
169     "            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
170     "                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
171     "            {",
172     "#if YYDEBUG",
173     "                if (yydebug)",
174     "                    printf(\"yydebug: state %d, error recovery shifting\\",
175     " to state %d\\n\", *yyssp, yytable[yyn]);",
176     "#endif",
177     "                if (yyssp >= yyss + yystacksize - 1)",
178     "                {",
179     "                    goto yyoverflow;",
180     "                }",
181     "                *++yyssp = yystate = yytable[yyn];",
182     "                *++yyvsp = yylval;",
183     "                goto yyloop;",
184     "            }",
185     "            else",
186     "            {",
187     "#if YYDEBUG",
188     "                if (yydebug)",
189     "                    printf(\"yydebug: error recovery discarding state %d\
190 \\n\",",
191     "                            *yyssp);",
192     "#endif",
193     "                if (yyssp <= yyss) goto yyabort;",
194     "                --yyssp;",
195     "                --yyvsp;",
196     "            }",
197     "        }",
198     "    }",
199     "    else",
200     "    {",
201     "        if (yychar == 0) goto yyabort;",
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(\"yydebug: state %d, error recovery discards token %d\
209  (%s)\\n\",",
210     "                    yystate, yychar, yys);",
211     "        }",
212     "#endif",
213     "        yychar = (-1);",
214     "        goto yyloop;",
215     "    }",
216     "yyreduce:",
217     "#if YYDEBUG",
218     "    if (yydebug)",
219     "        printf(\"yydebug: state %d, reducing by rule %d (%s)\\n\",",
220     "                yystate, yyn, yyrule[yyn]);",
221     "#endif",
222     "    yym = yylen[yyn];",
223     "    yyval = yyvsp[1-yym];",
224     "    switch (yyn)",
225     "    {",
226     0
227 };
228 
229 
230 char *trailer[] =
231 {
232     "    }",
233     "    yyssp -= yym;",
234     "    yystate = *yyssp;",
235     "    yyvsp -= yym;",
236     "    yym = yylhs[yyn];",
237     "    if (yystate == 0 && yym == 0)",
238     "    {",
239     "#if YYDEBUG",
240     "        if (yydebug)",
241     "            printf(\"yydebug: after reduction, shifting from state 0 to\\",
242     " state %d\\n\", YYFINAL);",
243     "#endif",
244     "        yystate = YYFINAL;",
245     "        *++yyssp = YYFINAL;",
246     "        *++yyvsp = yyval;",
247     "        if (yychar < 0)",
248     "        {",
249     "            if ((yychar = yylex()) < 0) yychar = 0;",
250     "#if YYDEBUG",
251     "            if (yydebug)",
252     "            {",
253     "                yys = 0;",
254     "                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
255     "                if (!yys) yys = \"illegal-symbol\";",
256     "                printf(\"yydebug: state %d, reading %d (%s)\\n\",",
257     "                        YYFINAL, yychar, yys);",
258     "            }",
259     "#endif",
260     "        }",
261     "        if (yychar == 0) goto yyaccept;",
262     "        goto yyloop;",
263     "    }",
264     "    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
265     "            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
266     "        yystate = yytable[yyn];",
267     "    else",
268     "        yystate = yydgoto[yym];",
269     "#if YYDEBUG",
270     "    if (yydebug)",
271     "        printf(\"yydebug: after reduction, shifting from state %d \\",
272     "to state %d\\n\", *yyssp, yystate);",
273     "#endif",
274     "    if (yyssp >= yyss + yystacksize - 1)",
275     "    {",
276     "        goto yyoverflow;",
277     "    }",
278     "    *++yyssp = yystate;",
279     "    *++yyvsp = yyval;",
280     "    goto yyloop;",
281     "yyoverflow:",
282     "    yyerror(\"yacc stack overflow\");",
283     "yyabort:",
284     "    return (1);",
285     "yyaccept:",
286     "    return (0);",
287     "}",
288     0
289 };
290 
291 
292 write_section(section)
293 char *section[];
294 {
295     register int i;
296     register FILE *fp;
297 
298     fp = code_file;
299     for (i = 0; section[i]; ++i)
300     {
301 	++outline;
302 	fprintf(fp, "%s\n", section[i]);
303     }
304 }
305