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