xref: /dragonfly/contrib/byacc/output.c (revision 5152d3b1)
1*5152d3b1SAntonio Huete Jimenez /* $Id: output.c,v 1.100 2022/01/09 18:03:56 tom Exp $ */
2b2605375SPeter Avalos 
3b2605375SPeter Avalos #include "defs.h"
4b2605375SPeter Avalos 
5b2605375SPeter Avalos #define StaticOrR	(rflag ? "" : "static ")
6b2605375SPeter Avalos #define CountLine(fp)   (!rflag || ((fp) == code_file))
7b2605375SPeter Avalos 
8c4d42299SSascha Wildner #if defined(YYBTYACC)
9c4d42299SSascha Wildner #define PER_STATE 3
10c4d42299SSascha Wildner #else
11c4d42299SSascha Wildner #define PER_STATE 2
12c4d42299SSascha Wildner #endif
13c4d42299SSascha Wildner 
14b2605375SPeter Avalos static int nvectors;
15b2605375SPeter Avalos static int nentries;
16b2605375SPeter Avalos static Value_t **froms;
17b2605375SPeter Avalos static Value_t **tos;
18c4d42299SSascha Wildner #if defined(YYBTYACC)
19c4d42299SSascha Wildner static Value_t *conflicts = NULL;
20c4d42299SSascha Wildner static Value_t nconflicts = 0;
21c4d42299SSascha Wildner #endif
22b2605375SPeter Avalos static Value_t *tally;
23b2605375SPeter Avalos static Value_t *width;
24b2605375SPeter Avalos static Value_t *state_count;
25b2605375SPeter Avalos static Value_t *order;
26b2605375SPeter Avalos static Value_t *base;
27b2605375SPeter Avalos static Value_t *pos;
28b2605375SPeter Avalos static int maxtable;
29b2605375SPeter Avalos static Value_t *table;
30b2605375SPeter Avalos static Value_t *check;
31b2605375SPeter Avalos static int lowzero;
32c4d42299SSascha Wildner static long high;
33b2605375SPeter Avalos 
34b2605375SPeter Avalos static void
putc_code(FILE * fp,int c)35b2605375SPeter Avalos putc_code(FILE * fp, int c)
36b2605375SPeter Avalos {
37b2605375SPeter Avalos     if ((c == '\n') && (fp == code_file))
38b2605375SPeter Avalos 	++outline;
39b2605375SPeter Avalos     putc(c, fp);
40b2605375SPeter Avalos }
41b2605375SPeter Avalos 
42b2605375SPeter Avalos static void
putl_code(FILE * fp,const char * s)43b2605375SPeter Avalos putl_code(FILE * fp, const char *s)
44b2605375SPeter Avalos {
45b2605375SPeter Avalos     if (fp == code_file)
46b2605375SPeter Avalos 	++outline;
47b2605375SPeter Avalos     fputs(s, fp);
48b2605375SPeter Avalos }
49b2605375SPeter Avalos 
50b2605375SPeter Avalos static void
puts_code(FILE * fp,const char * s)51b2605375SPeter Avalos puts_code(FILE * fp, const char *s)
52b2605375SPeter Avalos {
53b2605375SPeter Avalos     fputs(s, fp);
54b2605375SPeter Avalos }
55b2605375SPeter Avalos 
56b2605375SPeter Avalos static void
puts_param_types(FILE * fp,param * list,int more)57c4d42299SSascha Wildner puts_param_types(FILE * fp, param *list, int more)
58c4d42299SSascha Wildner {
59c4d42299SSascha Wildner     param *p;
60c4d42299SSascha Wildner 
61c4d42299SSascha Wildner     if (list != 0)
62c4d42299SSascha Wildner     {
63c4d42299SSascha Wildner 	for (p = list; p; p = p->next)
64c4d42299SSascha Wildner 	{
65c4d42299SSascha Wildner 	    size_t len_type = strlen(p->type);
66c4d42299SSascha Wildner 	    fprintf(fp, "%s%s%s%s%s", p->type,
67c4d42299SSascha Wildner 		    (((len_type != 0) && (p->type[len_type - 1] == '*'))
68c4d42299SSascha Wildner 		     ? ""
69c4d42299SSascha Wildner 		     : " "),
70c4d42299SSascha Wildner 		    p->name, p->type2,
71c4d42299SSascha Wildner 		    ((more || p->next) ? ", " : ""));
72c4d42299SSascha Wildner 	}
73c4d42299SSascha Wildner     }
74c4d42299SSascha Wildner     else
75c4d42299SSascha Wildner     {
76c4d42299SSascha Wildner 	if (!more)
77c4d42299SSascha Wildner 	    fprintf(fp, "void");
78c4d42299SSascha Wildner     }
79c4d42299SSascha Wildner }
80c4d42299SSascha Wildner 
81c4d42299SSascha Wildner static void
puts_param_names(FILE * fp,param * list,int more)82c4d42299SSascha Wildner puts_param_names(FILE * fp, param *list, int more)
83c4d42299SSascha Wildner {
84c4d42299SSascha Wildner     param *p;
85c4d42299SSascha Wildner 
86c4d42299SSascha Wildner     for (p = list; p; p = p->next)
87c4d42299SSascha Wildner     {
88c4d42299SSascha Wildner 	fprintf(fp, "%s%s", p->name,
89c4d42299SSascha Wildner 		((more || p->next) ? ", " : ""));
90c4d42299SSascha Wildner     }
91c4d42299SSascha Wildner }
92c4d42299SSascha Wildner 
93c4d42299SSascha Wildner static void
write_code_lineno(FILE * fp)94b2605375SPeter Avalos write_code_lineno(FILE * fp)
95b2605375SPeter Avalos {
96b2605375SPeter Avalos     if (!lflag && (fp == code_file))
97b2605375SPeter Avalos     {
98b2605375SPeter Avalos 	++outline;
99*5152d3b1SAntonio Huete Jimenez 	fprintf_lineno(fp, outline + 1, code_file_name);
100b2605375SPeter Avalos     }
101b2605375SPeter Avalos }
102b2605375SPeter Avalos 
103b2605375SPeter Avalos static void
write_input_lineno(void)104b2605375SPeter Avalos write_input_lineno(void)
105b2605375SPeter Avalos {
106b2605375SPeter Avalos     if (!lflag)
107b2605375SPeter Avalos     {
108b2605375SPeter Avalos 	++outline;
109*5152d3b1SAntonio Huete Jimenez 	fprintf_lineno(code_file, lineno, input_file_name);
110b2605375SPeter Avalos     }
111b2605375SPeter Avalos }
112b2605375SPeter Avalos 
113b2605375SPeter Avalos static void
define_prefixed(FILE * fp,const char * name)114b2605375SPeter Avalos define_prefixed(FILE * fp, const char *name)
115b2605375SPeter Avalos {
116b2605375SPeter Avalos     int bump_line = CountLine(fp);
117b2605375SPeter Avalos     if (bump_line)
118b2605375SPeter Avalos 	++outline;
119b2605375SPeter Avalos     fprintf(fp, "\n");
120b2605375SPeter Avalos 
121b2605375SPeter Avalos     if (bump_line)
122b2605375SPeter Avalos 	++outline;
123b2605375SPeter Avalos     fprintf(fp, "#ifndef %s\n", name);
124b2605375SPeter Avalos 
125b2605375SPeter Avalos     if (bump_line)
126b2605375SPeter Avalos 	++outline;
127b2605375SPeter Avalos     fprintf(fp, "#define %-10s %s%s\n", name, symbol_prefix, name + 2);
128b2605375SPeter Avalos 
129b2605375SPeter Avalos     if (bump_line)
130b2605375SPeter Avalos 	++outline;
131b2605375SPeter Avalos     fprintf(fp, "#endif /* %s */\n", name);
132b2605375SPeter Avalos }
133b2605375SPeter Avalos 
134b2605375SPeter Avalos static void
output_prefix(FILE * fp)135b2605375SPeter Avalos output_prefix(FILE * fp)
136b2605375SPeter Avalos {
137b2605375SPeter Avalos     if (symbol_prefix == NULL)
138b2605375SPeter Avalos     {
139b2605375SPeter Avalos 	symbol_prefix = "yy";
140b2605375SPeter Avalos     }
141b2605375SPeter Avalos     else
142b2605375SPeter Avalos     {
143b2605375SPeter Avalos 	define_prefixed(fp, "yyparse");
144b2605375SPeter Avalos 	define_prefixed(fp, "yylex");
145b2605375SPeter Avalos 	define_prefixed(fp, "yyerror");
146b2605375SPeter Avalos 	define_prefixed(fp, "yychar");
147b2605375SPeter Avalos 	define_prefixed(fp, "yyval");
148b2605375SPeter Avalos 	define_prefixed(fp, "yylval");
149b2605375SPeter Avalos 	define_prefixed(fp, "yydebug");
150b2605375SPeter Avalos 	define_prefixed(fp, "yynerrs");
151b2605375SPeter Avalos 	define_prefixed(fp, "yyerrflag");
152b2605375SPeter Avalos 	define_prefixed(fp, "yylhs");
153b2605375SPeter Avalos 	define_prefixed(fp, "yylen");
154b2605375SPeter Avalos 	define_prefixed(fp, "yydefred");
155c4d42299SSascha Wildner #if defined(YYBTYACC)
156c4d42299SSascha Wildner 	define_prefixed(fp, "yystos");
157c4d42299SSascha Wildner #endif
158b2605375SPeter Avalos 	define_prefixed(fp, "yydgoto");
159b2605375SPeter Avalos 	define_prefixed(fp, "yysindex");
160b2605375SPeter Avalos 	define_prefixed(fp, "yyrindex");
161b2605375SPeter Avalos 	define_prefixed(fp, "yygindex");
162b2605375SPeter Avalos 	define_prefixed(fp, "yytable");
163b2605375SPeter Avalos 	define_prefixed(fp, "yycheck");
164b2605375SPeter Avalos 	define_prefixed(fp, "yyname");
165b2605375SPeter Avalos 	define_prefixed(fp, "yyrule");
166c4d42299SSascha Wildner #if defined(YYBTYACC)
167c4d42299SSascha Wildner 	if (locations)
168c4d42299SSascha Wildner 	{
169c4d42299SSascha Wildner 	    define_prefixed(fp, "yyloc");
170c4d42299SSascha Wildner 	    define_prefixed(fp, "yylloc");
171c4d42299SSascha Wildner 	}
172c4d42299SSascha Wildner 	putc_code(fp, '\n');
173c4d42299SSascha Wildner 	putl_code(fp, "#if YYBTYACC\n");
174c4d42299SSascha Wildner 
175c4d42299SSascha Wildner 	define_prefixed(fp, "yycindex");
176c4d42299SSascha Wildner 	define_prefixed(fp, "yyctable");
177c4d42299SSascha Wildner 
178c4d42299SSascha Wildner 	putc_code(fp, '\n');
179c4d42299SSascha Wildner 	putl_code(fp, "#endif /* YYBTYACC */\n");
180c4d42299SSascha Wildner 	putc_code(fp, '\n');
181c4d42299SSascha Wildner #endif
182b2605375SPeter Avalos     }
183b2605375SPeter Avalos     if (CountLine(fp))
184b2605375SPeter Avalos 	++outline;
185b2605375SPeter Avalos     fprintf(fp, "#define YYPREFIX \"%s\"\n", symbol_prefix);
186b2605375SPeter Avalos }
187b2605375SPeter Avalos 
188b2605375SPeter Avalos static void
output_code_lines(FILE * fp,int cl)189faa6539eSSascha Wildner output_code_lines(FILE * fp, int cl)
190faa6539eSSascha Wildner {
191faa6539eSSascha Wildner     if (code_lines[cl].lines != NULL)
192faa6539eSSascha Wildner     {
193faa6539eSSascha Wildner 	if (fp == code_file)
194faa6539eSSascha Wildner 	{
195faa6539eSSascha Wildner 	    outline += (int)code_lines[cl].num;
196faa6539eSSascha Wildner 	    outline += 3;
197faa6539eSSascha Wildner 	    fprintf(fp, "\n");
198faa6539eSSascha Wildner 	}
199faa6539eSSascha Wildner 	fprintf(fp, "/* %%code \"%s\" block start */\n", code_lines[cl].name);
200faa6539eSSascha Wildner 	fputs(code_lines[cl].lines, fp);
201faa6539eSSascha Wildner 	fprintf(fp, "/* %%code \"%s\" block end */\n", code_lines[cl].name);
202faa6539eSSascha Wildner 	if (fp == code_file)
203faa6539eSSascha Wildner 	{
204faa6539eSSascha Wildner 	    write_code_lineno(fp);
205faa6539eSSascha Wildner 	}
206faa6539eSSascha Wildner     }
207faa6539eSSascha Wildner }
208faa6539eSSascha Wildner 
209faa6539eSSascha Wildner static void
output_newline(void)210b2605375SPeter Avalos output_newline(void)
211b2605375SPeter Avalos {
212b2605375SPeter Avalos     if (!rflag)
213b2605375SPeter Avalos 	++outline;
214b2605375SPeter Avalos     putc('\n', output_file);
215b2605375SPeter Avalos }
216b2605375SPeter Avalos 
217b2605375SPeter Avalos static void
output_line(const char * value)218b2605375SPeter Avalos output_line(const char *value)
219b2605375SPeter Avalos {
220b2605375SPeter Avalos     fputs(value, output_file);
221b2605375SPeter Avalos     output_newline();
222b2605375SPeter Avalos }
223b2605375SPeter Avalos 
224b2605375SPeter Avalos static void
output_int(int value)225b2605375SPeter Avalos output_int(int value)
226b2605375SPeter Avalos {
227b2605375SPeter Avalos     fprintf(output_file, "%5d,", value);
228b2605375SPeter Avalos }
229b2605375SPeter Avalos 
230b2605375SPeter Avalos static void
start_int_table(const char * name,int value)231b2605375SPeter Avalos start_int_table(const char *name, int value)
232b2605375SPeter Avalos {
233b2605375SPeter Avalos     int need = 34 - (int)(strlen(symbol_prefix) + strlen(name));
234b2605375SPeter Avalos 
235b2605375SPeter Avalos     if (need < 6)
236b2605375SPeter Avalos 	need = 6;
237b2605375SPeter Avalos     fprintf(output_file,
238c4d42299SSascha Wildner 	    "%sconst YYINT %s%s[] = {%*d,",
239b2605375SPeter Avalos 	    StaticOrR, symbol_prefix, name, need, value);
240b2605375SPeter Avalos }
241b2605375SPeter Avalos 
242b2605375SPeter Avalos static void
start_str_table(const char * name)243b2605375SPeter Avalos start_str_table(const char *name)
244b2605375SPeter Avalos {
245b2605375SPeter Avalos     fprintf(output_file,
246c4d42299SSascha Wildner 	    "%sconst char *const %s%s[] = {",
247c4d42299SSascha Wildner 	    StaticOrR, symbol_prefix, name);
248b2605375SPeter Avalos     output_newline();
249b2605375SPeter Avalos }
250b2605375SPeter Avalos 
251b2605375SPeter Avalos static void
end_table(void)252b2605375SPeter Avalos end_table(void)
253b2605375SPeter Avalos {
254b2605375SPeter Avalos     output_newline();
255b2605375SPeter Avalos     output_line("};");
256b2605375SPeter Avalos }
257b2605375SPeter Avalos 
258b2605375SPeter Avalos static void
output_stype(FILE * fp)259ca0c2f89SAntonio Huete Jimenez output_stype(FILE * fp)
260ca0c2f89SAntonio Huete Jimenez {
261ca0c2f89SAntonio Huete Jimenez     if (!unionized && ntags == 0)
262ca0c2f89SAntonio Huete Jimenez     {
263ca0c2f89SAntonio Huete Jimenez 	putc_code(fp, '\n');
264ca0c2f89SAntonio Huete Jimenez 	putl_code(fp, "#if "
265ca0c2f89SAntonio Huete Jimenez 		  "! defined(YYSTYPE) && "
266ca0c2f89SAntonio Huete Jimenez 		  "! defined(YYSTYPE_IS_DECLARED)\n");
267ca0c2f89SAntonio Huete Jimenez 	putl_code(fp, "/* Default: YYSTYPE is the semantic value type. */\n");
268ca0c2f89SAntonio Huete Jimenez 	putl_code(fp, "typedef int YYSTYPE;\n");
269ca0c2f89SAntonio Huete Jimenez 	putl_code(fp, "# define YYSTYPE_IS_DECLARED 1\n");
270ca0c2f89SAntonio Huete Jimenez 	putl_code(fp, "#endif\n");
271ca0c2f89SAntonio Huete Jimenez     }
272ca0c2f89SAntonio Huete Jimenez }
273ca0c2f89SAntonio Huete Jimenez 
274ca0c2f89SAntonio Huete Jimenez #if defined(YYBTYACC)
275ca0c2f89SAntonio Huete Jimenez static void
output_ltype(FILE * fp)276ca0c2f89SAntonio Huete Jimenez output_ltype(FILE * fp)
277ca0c2f89SAntonio Huete Jimenez {
278ca0c2f89SAntonio Huete Jimenez     putc_code(fp, '\n');
279ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED\n");
280ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "/* Default: YYLTYPE is the text position type. */\n");
281ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "typedef struct YYLTYPE\n");
282ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "{\n");
283ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "    int first_line;\n");
284ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "    int first_column;\n");
285ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "    int last_line;\n");
286ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "    int last_column;\n");
287ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "    unsigned source;\n");
288ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "} YYLTYPE;\n");
289ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "#define YYLTYPE_IS_DECLARED 1\n");
290ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "#endif\n");
291ca0c2f89SAntonio Huete Jimenez     putl_code(fp, "#define YYRHSLOC(rhs, k) ((rhs)[k])\n");
292ca0c2f89SAntonio Huete Jimenez }
293ca0c2f89SAntonio Huete Jimenez #endif
294ca0c2f89SAntonio Huete Jimenez 
295ca0c2f89SAntonio Huete Jimenez static void
output_YYINT_typedef(FILE * fp)296c4d42299SSascha Wildner output_YYINT_typedef(FILE * fp)
297c4d42299SSascha Wildner {
298c4d42299SSascha Wildner     /* generate the type used to index the various parser tables */
299c4d42299SSascha Wildner     if (CountLine(fp))
300c4d42299SSascha Wildner 	++outline;
301c4d42299SSascha Wildner     fprintf(fp, "typedef %s YYINT;\n", CONCAT1("", YYINT));
302c4d42299SSascha Wildner }
303c4d42299SSascha Wildner 
304c4d42299SSascha Wildner static void
output_rule_data(void)305b2605375SPeter Avalos output_rule_data(void)
306b2605375SPeter Avalos {
307b2605375SPeter Avalos     int i;
308b2605375SPeter Avalos     int j;
309b2605375SPeter Avalos 
310c4d42299SSascha Wildner     output_YYINT_typedef(output_file);
311c4d42299SSascha Wildner 
312b2605375SPeter Avalos     start_int_table("lhs", symbol_value[start_symbol]);
313b2605375SPeter Avalos 
314b2605375SPeter Avalos     j = 10;
315b2605375SPeter Avalos     for (i = 3; i < nrules; i++)
316b2605375SPeter Avalos     {
317b2605375SPeter Avalos 	if (j >= 10)
318b2605375SPeter Avalos 	{
319b2605375SPeter Avalos 	    output_newline();
320b2605375SPeter Avalos 	    j = 1;
321b2605375SPeter Avalos 	}
322b2605375SPeter Avalos 	else
323b2605375SPeter Avalos 	    ++j;
324b2605375SPeter Avalos 
325b2605375SPeter Avalos 	output_int(symbol_value[rlhs[i]]);
326b2605375SPeter Avalos     }
327b2605375SPeter Avalos     end_table();
328b2605375SPeter Avalos 
329b2605375SPeter Avalos     start_int_table("len", 2);
330b2605375SPeter Avalos 
331b2605375SPeter Avalos     j = 10;
332b2605375SPeter Avalos     for (i = 3; i < nrules; i++)
333b2605375SPeter Avalos     {
334b2605375SPeter Avalos 	if (j >= 10)
335b2605375SPeter Avalos 	{
336b2605375SPeter Avalos 	    output_newline();
337b2605375SPeter Avalos 	    j = 1;
338b2605375SPeter Avalos 	}
339b2605375SPeter Avalos 	else
340b2605375SPeter Avalos 	    j++;
341b2605375SPeter Avalos 
342b2605375SPeter Avalos 	output_int(rrhs[i + 1] - rrhs[i] - 1);
343b2605375SPeter Avalos     }
344b2605375SPeter Avalos     end_table();
345b2605375SPeter Avalos }
346b2605375SPeter Avalos 
347b2605375SPeter Avalos static void
output_yydefred(void)348b2605375SPeter Avalos output_yydefred(void)
349b2605375SPeter Avalos {
350b2605375SPeter Avalos     int i, j;
351b2605375SPeter Avalos 
352b2605375SPeter Avalos     start_int_table("defred", (defred[0] ? defred[0] - 2 : 0));
353b2605375SPeter Avalos 
354b2605375SPeter Avalos     j = 10;
355b2605375SPeter Avalos     for (i = 1; i < nstates; i++)
356b2605375SPeter Avalos     {
357b2605375SPeter Avalos 	if (j < 10)
358b2605375SPeter Avalos 	    ++j;
359b2605375SPeter Avalos 	else
360b2605375SPeter Avalos 	{
361b2605375SPeter Avalos 	    output_newline();
362b2605375SPeter Avalos 	    j = 1;
363b2605375SPeter Avalos 	}
364b2605375SPeter Avalos 
365b2605375SPeter Avalos 	output_int((defred[i] ? defred[i] - 2 : 0));
366b2605375SPeter Avalos     }
367b2605375SPeter Avalos 
368b2605375SPeter Avalos     end_table();
369b2605375SPeter Avalos }
370b2605375SPeter Avalos 
371c4d42299SSascha Wildner #if defined(YYBTYACC)
372c4d42299SSascha Wildner static void
output_accessing_symbols(void)373c4d42299SSascha Wildner output_accessing_symbols(void)
374c4d42299SSascha Wildner {
375faa6539eSSascha Wildner     if (nstates != 0)
376faa6539eSSascha Wildner     {
377c4d42299SSascha Wildner 	int i, j;
378c4d42299SSascha Wildner 	int *translate;
379c4d42299SSascha Wildner 
380*5152d3b1SAntonio Huete Jimenez 	translate = TCMALLOC(int, nstates);
381c4d42299SSascha Wildner 	NO_SPACE(translate);
382c4d42299SSascha Wildner 
383c4d42299SSascha Wildner 	for (i = 0; i < nstates; ++i)
384c4d42299SSascha Wildner 	{
385c4d42299SSascha Wildner 	    int gsymb = accessing_symbol[i];
386c4d42299SSascha Wildner 
387c4d42299SSascha Wildner 	    translate[i] = symbol_pval[gsymb];
388c4d42299SSascha Wildner 	}
389c4d42299SSascha Wildner 
390ca0c2f89SAntonio Huete Jimenez 	putl_code(output_file,
391ca0c2f89SAntonio Huete Jimenez 		  "#if defined(YYDESTRUCT_CALL) || defined(YYSTYPE_TOSTRING)\n");
392c4d42299SSascha Wildner 	/* yystos[] may be unused, depending on compile-time defines */
393c4d42299SSascha Wildner 	start_int_table("stos", translate[0]);
394c4d42299SSascha Wildner 
395c4d42299SSascha Wildner 	j = 10;
396c4d42299SSascha Wildner 	for (i = 1; i < nstates; ++i)
397c4d42299SSascha Wildner 	{
398c4d42299SSascha Wildner 	    if (j < 10)
399c4d42299SSascha Wildner 		++j;
400c4d42299SSascha Wildner 	    else
401c4d42299SSascha Wildner 	    {
402c4d42299SSascha Wildner 		output_newline();
403c4d42299SSascha Wildner 		j = 1;
404c4d42299SSascha Wildner 	    }
405c4d42299SSascha Wildner 
406c4d42299SSascha Wildner 	    output_int(translate[i]);
407c4d42299SSascha Wildner 	}
408c4d42299SSascha Wildner 
409c4d42299SSascha Wildner 	end_table();
410c4d42299SSascha Wildner 	FREE(translate);
411ca0c2f89SAntonio Huete Jimenez 	putl_code(output_file,
412ca0c2f89SAntonio Huete Jimenez 		  "#endif /* YYDESTRUCT_CALL || YYSTYPE_TOSTRING */\n");
413c4d42299SSascha Wildner     }
414c4d42299SSascha Wildner }
415c4d42299SSascha Wildner 
416c4d42299SSascha Wildner static Value_t
find_conflict_base(int cbase)417c4d42299SSascha Wildner find_conflict_base(int cbase)
418c4d42299SSascha Wildner {
419c4d42299SSascha Wildner     int i, j;
420c4d42299SSascha Wildner 
421c4d42299SSascha Wildner     for (i = 0; i < cbase; i++)
422c4d42299SSascha Wildner     {
423c4d42299SSascha Wildner 	for (j = 0; j + cbase < nconflicts; j++)
424c4d42299SSascha Wildner 	{
425c4d42299SSascha Wildner 	    if (conflicts[i + j] != conflicts[cbase + j])
426c4d42299SSascha Wildner 		break;
427c4d42299SSascha Wildner 	}
428c4d42299SSascha Wildner 	if (j + cbase >= nconflicts)
429c4d42299SSascha Wildner 	    break;
430c4d42299SSascha Wildner     }
431c4d42299SSascha Wildner     return (Value_t)i;
432c4d42299SSascha Wildner }
433c4d42299SSascha Wildner #endif
434c4d42299SSascha Wildner 
435b2605375SPeter Avalos static void
token_actions(void)436b2605375SPeter Avalos token_actions(void)
437b2605375SPeter Avalos {
438b2605375SPeter Avalos     int i, j;
439b2605375SPeter Avalos     Value_t shiftcount, reducecount;
440c4d42299SSascha Wildner #if defined(YYBTYACC)
441c4d42299SSascha Wildner     Value_t conflictcount = 0;
442c4d42299SSascha Wildner     Value_t csym = -1;
443c4d42299SSascha Wildner     Value_t cbase = 0;
444c4d42299SSascha Wildner #endif
445*5152d3b1SAntonio Huete Jimenez     Value_t max, min;
446b2605375SPeter Avalos     Value_t *actionrow, *r, *s;
447b2605375SPeter Avalos     action *p;
448b2605375SPeter Avalos 
449c4d42299SSascha Wildner     actionrow = NEW2(PER_STATE * ntokens, Value_t);
450b2605375SPeter Avalos     for (i = 0; i < nstates; ++i)
451b2605375SPeter Avalos     {
452b2605375SPeter Avalos 	if (parser[i])
453b2605375SPeter Avalos 	{
454c4d42299SSascha Wildner 	    for (j = 0; j < PER_STATE * ntokens; ++j)
455b2605375SPeter Avalos 		actionrow[j] = 0;
456b2605375SPeter Avalos 
457b2605375SPeter Avalos 	    shiftcount = 0;
458b2605375SPeter Avalos 	    reducecount = 0;
459c4d42299SSascha Wildner #if defined(YYBTYACC)
460c4d42299SSascha Wildner 	    if (backtrack)
461c4d42299SSascha Wildner 	    {
462c4d42299SSascha Wildner 		conflictcount = 0;
463c4d42299SSascha Wildner 		csym = -1;
464c4d42299SSascha Wildner 		cbase = nconflicts;
465c4d42299SSascha Wildner 	    }
466c4d42299SSascha Wildner #endif
467b2605375SPeter Avalos 	    for (p = parser[i]; p; p = p->next)
468b2605375SPeter Avalos 	    {
469c4d42299SSascha Wildner #if defined(YYBTYACC)
470c4d42299SSascha Wildner 		if (backtrack)
471c4d42299SSascha Wildner 		{
472c4d42299SSascha Wildner 		    if (csym != -1 && csym != p->symbol)
473c4d42299SSascha Wildner 		    {
474c4d42299SSascha Wildner 			conflictcount++;
475c4d42299SSascha Wildner 			conflicts[nconflicts++] = -1;
476c4d42299SSascha Wildner 			j = find_conflict_base(cbase);
477c4d42299SSascha Wildner 			actionrow[csym + 2 * ntokens] = (Value_t)(j + 1);
478c4d42299SSascha Wildner 			if (j == cbase)
479c4d42299SSascha Wildner 			{
480c4d42299SSascha Wildner 			    cbase = nconflicts;
481c4d42299SSascha Wildner 			}
482c4d42299SSascha Wildner 			else
483c4d42299SSascha Wildner 			{
484c4d42299SSascha Wildner 			    if (conflicts[cbase] == -1)
485c4d42299SSascha Wildner 				cbase++;
486c4d42299SSascha Wildner 			    nconflicts = cbase;
487c4d42299SSascha Wildner 			}
488c4d42299SSascha Wildner 			csym = -1;
489c4d42299SSascha Wildner 		    }
490c4d42299SSascha Wildner 		}
491c4d42299SSascha Wildner #endif
492b2605375SPeter Avalos 		if (p->suppressed == 0)
493b2605375SPeter Avalos 		{
494b2605375SPeter Avalos 		    if (p->action_code == SHIFT)
495b2605375SPeter Avalos 		    {
496b2605375SPeter Avalos 			++shiftcount;
497b2605375SPeter Avalos 			actionrow[p->symbol] = p->number;
498b2605375SPeter Avalos 		    }
499b2605375SPeter Avalos 		    else if (p->action_code == REDUCE && p->number != defred[i])
500b2605375SPeter Avalos 		    {
501b2605375SPeter Avalos 			++reducecount;
502b2605375SPeter Avalos 			actionrow[p->symbol + ntokens] = p->number;
503b2605375SPeter Avalos 		    }
504b2605375SPeter Avalos 		}
505c4d42299SSascha Wildner #if defined(YYBTYACC)
506c4d42299SSascha Wildner 		else if (backtrack && p->suppressed == 1)
507c4d42299SSascha Wildner 		{
508c4d42299SSascha Wildner 		    csym = p->symbol;
509c4d42299SSascha Wildner 		    if (p->action_code == SHIFT)
510c4d42299SSascha Wildner 		    {
511c4d42299SSascha Wildner 			conflicts[nconflicts++] = p->number;
512b2605375SPeter Avalos 		    }
513c4d42299SSascha Wildner 		    else if (p->action_code == REDUCE && p->number != defred[i])
514c4d42299SSascha Wildner 		    {
515c4d42299SSascha Wildner 			if (cbase == nconflicts)
516c4d42299SSascha Wildner 			{
517c4d42299SSascha Wildner 			    if (cbase)
518c4d42299SSascha Wildner 				cbase--;
519c4d42299SSascha Wildner 			    else
520c4d42299SSascha Wildner 				conflicts[nconflicts++] = -1;
521c4d42299SSascha Wildner 			}
522c4d42299SSascha Wildner 			conflicts[nconflicts++] = (Value_t)(p->number - 2);
523c4d42299SSascha Wildner 		    }
524c4d42299SSascha Wildner 		}
525c4d42299SSascha Wildner #endif
526c4d42299SSascha Wildner 	    }
527c4d42299SSascha Wildner #if defined(YYBTYACC)
528c4d42299SSascha Wildner 	    if (backtrack && csym != -1)
529c4d42299SSascha Wildner 	    {
530c4d42299SSascha Wildner 		conflictcount++;
531c4d42299SSascha Wildner 		conflicts[nconflicts++] = -1;
532c4d42299SSascha Wildner 		j = find_conflict_base(cbase);
533c4d42299SSascha Wildner 		actionrow[csym + 2 * ntokens] = (Value_t)(j + 1);
534c4d42299SSascha Wildner 		if (j == cbase)
535c4d42299SSascha Wildner 		{
536c4d42299SSascha Wildner 		    cbase = nconflicts;
537c4d42299SSascha Wildner 		}
538c4d42299SSascha Wildner 		else
539c4d42299SSascha Wildner 		{
540c4d42299SSascha Wildner 		    if (conflicts[cbase] == -1)
541c4d42299SSascha Wildner 			cbase++;
542c4d42299SSascha Wildner 		    nconflicts = cbase;
543c4d42299SSascha Wildner 		}
544c4d42299SSascha Wildner 	    }
545c4d42299SSascha Wildner #endif
546b2605375SPeter Avalos 
547b2605375SPeter Avalos 	    tally[i] = shiftcount;
548b2605375SPeter Avalos 	    tally[nstates + i] = reducecount;
549c4d42299SSascha Wildner #if defined(YYBTYACC)
550c4d42299SSascha Wildner 	    if (backtrack)
551c4d42299SSascha Wildner 		tally[2 * nstates + i] = conflictcount;
552c4d42299SSascha Wildner #endif
553b2605375SPeter Avalos 	    width[i] = 0;
554b2605375SPeter Avalos 	    width[nstates + i] = 0;
555c4d42299SSascha Wildner #if defined(YYBTYACC)
556c4d42299SSascha Wildner 	    if (backtrack)
557c4d42299SSascha Wildner 		width[2 * nstates + i] = 0;
558c4d42299SSascha Wildner #endif
559b2605375SPeter Avalos 	    if (shiftcount > 0)
560b2605375SPeter Avalos 	    {
561b2605375SPeter Avalos 		froms[i] = r = NEW2(shiftcount, Value_t);
562b2605375SPeter Avalos 		tos[i] = s = NEW2(shiftcount, Value_t);
563c4d42299SSascha Wildner 		min = MAXYYINT;
564b2605375SPeter Avalos 		max = 0;
565b2605375SPeter Avalos 		for (j = 0; j < ntokens; ++j)
566b2605375SPeter Avalos 		{
567b2605375SPeter Avalos 		    if (actionrow[j])
568b2605375SPeter Avalos 		    {
569b2605375SPeter Avalos 			if (min > symbol_value[j])
570b2605375SPeter Avalos 			    min = symbol_value[j];
571b2605375SPeter Avalos 			if (max < symbol_value[j])
572b2605375SPeter Avalos 			    max = symbol_value[j];
573b2605375SPeter Avalos 			*r++ = symbol_value[j];
574b2605375SPeter Avalos 			*s++ = actionrow[j];
575b2605375SPeter Avalos 		    }
576b2605375SPeter Avalos 		}
577b2605375SPeter Avalos 		width[i] = (Value_t)(max - min + 1);
578b2605375SPeter Avalos 	    }
579b2605375SPeter Avalos 	    if (reducecount > 0)
580b2605375SPeter Avalos 	    {
581b2605375SPeter Avalos 		froms[nstates + i] = r = NEW2(reducecount, Value_t);
582b2605375SPeter Avalos 		tos[nstates + i] = s = NEW2(reducecount, Value_t);
583c4d42299SSascha Wildner 		min = MAXYYINT;
584b2605375SPeter Avalos 		max = 0;
585b2605375SPeter Avalos 		for (j = 0; j < ntokens; ++j)
586b2605375SPeter Avalos 		{
587b2605375SPeter Avalos 		    if (actionrow[ntokens + j])
588b2605375SPeter Avalos 		    {
589b2605375SPeter Avalos 			if (min > symbol_value[j])
590b2605375SPeter Avalos 			    min = symbol_value[j];
591b2605375SPeter Avalos 			if (max < symbol_value[j])
592b2605375SPeter Avalos 			    max = symbol_value[j];
593b2605375SPeter Avalos 			*r++ = symbol_value[j];
594b2605375SPeter Avalos 			*s++ = (Value_t)(actionrow[ntokens + j] - 2);
595b2605375SPeter Avalos 		    }
596b2605375SPeter Avalos 		}
597b2605375SPeter Avalos 		width[nstates + i] = (Value_t)(max - min + 1);
598b2605375SPeter Avalos 	    }
599c4d42299SSascha Wildner #if defined(YYBTYACC)
600c4d42299SSascha Wildner 	    if (backtrack && conflictcount > 0)
601c4d42299SSascha Wildner 	    {
602c4d42299SSascha Wildner 		froms[2 * nstates + i] = r = NEW2(conflictcount, Value_t);
603c4d42299SSascha Wildner 		tos[2 * nstates + i] = s = NEW2(conflictcount, Value_t);
604c4d42299SSascha Wildner 		min = MAXYYINT;
605c4d42299SSascha Wildner 		max = 0;
606c4d42299SSascha Wildner 		for (j = 0; j < ntokens; ++j)
607c4d42299SSascha Wildner 		{
608c4d42299SSascha Wildner 		    if (actionrow[2 * ntokens + j])
609c4d42299SSascha Wildner 		    {
610c4d42299SSascha Wildner 			if (min > symbol_value[j])
611c4d42299SSascha Wildner 			    min = symbol_value[j];
612c4d42299SSascha Wildner 			if (max < symbol_value[j])
613c4d42299SSascha Wildner 			    max = symbol_value[j];
614c4d42299SSascha Wildner 			*r++ = symbol_value[j];
615c4d42299SSascha Wildner 			*s++ = (Value_t)(actionrow[2 * ntokens + j] - 1);
616c4d42299SSascha Wildner 		    }
617c4d42299SSascha Wildner 		}
618c4d42299SSascha Wildner 		width[2 * nstates + i] = (Value_t)(max - min + 1);
619c4d42299SSascha Wildner 	    }
620c4d42299SSascha Wildner #endif
621b2605375SPeter Avalos 	}
622b2605375SPeter Avalos     }
623b2605375SPeter Avalos     FREE(actionrow);
624b2605375SPeter Avalos }
625b2605375SPeter Avalos 
626b2605375SPeter Avalos static int
default_goto(int symbol)627b2605375SPeter Avalos default_goto(int symbol)
628b2605375SPeter Avalos {
629b2605375SPeter Avalos     int i;
630b2605375SPeter Avalos     int m;
631b2605375SPeter Avalos     int n;
632b2605375SPeter Avalos     int default_state;
633b2605375SPeter Avalos     int max;
634b2605375SPeter Avalos 
635b2605375SPeter Avalos     m = goto_map[symbol];
636b2605375SPeter Avalos     n = goto_map[symbol + 1];
637b2605375SPeter Avalos 
638b2605375SPeter Avalos     if (m == n)
639b2605375SPeter Avalos 	return (0);
640b2605375SPeter Avalos 
641b2605375SPeter Avalos     for (i = 0; i < nstates; i++)
642b2605375SPeter Avalos 	state_count[i] = 0;
643b2605375SPeter Avalos 
644b2605375SPeter Avalos     for (i = m; i < n; i++)
645b2605375SPeter Avalos 	state_count[to_state[i]]++;
646b2605375SPeter Avalos 
647b2605375SPeter Avalos     max = 0;
648b2605375SPeter Avalos     default_state = 0;
649b2605375SPeter Avalos     for (i = 0; i < nstates; i++)
650b2605375SPeter Avalos     {
651b2605375SPeter Avalos 	if (state_count[i] > max)
652b2605375SPeter Avalos 	{
653b2605375SPeter Avalos 	    max = state_count[i];
654b2605375SPeter Avalos 	    default_state = i;
655b2605375SPeter Avalos 	}
656b2605375SPeter Avalos     }
657b2605375SPeter Avalos 
658b2605375SPeter Avalos     return (default_state);
659b2605375SPeter Avalos }
660b2605375SPeter Avalos 
661b2605375SPeter Avalos static void
save_column(int symbol,int default_state)662b2605375SPeter Avalos save_column(int symbol, int default_state)
663b2605375SPeter Avalos {
664b2605375SPeter Avalos     int i;
665b2605375SPeter Avalos     int m;
666b2605375SPeter Avalos     int n;
667b2605375SPeter Avalos     Value_t *sp;
668b2605375SPeter Avalos     Value_t *sp1;
669b2605375SPeter Avalos     Value_t *sp2;
670b2605375SPeter Avalos     Value_t count;
671b2605375SPeter Avalos     int symno;
672b2605375SPeter Avalos 
673b2605375SPeter Avalos     m = goto_map[symbol];
674b2605375SPeter Avalos     n = goto_map[symbol + 1];
675b2605375SPeter Avalos 
676b2605375SPeter Avalos     count = 0;
677b2605375SPeter Avalos     for (i = m; i < n; i++)
678b2605375SPeter Avalos     {
679b2605375SPeter Avalos 	if (to_state[i] != default_state)
680b2605375SPeter Avalos 	    ++count;
681b2605375SPeter Avalos     }
682b2605375SPeter Avalos     if (count == 0)
683b2605375SPeter Avalos 	return;
684b2605375SPeter Avalos 
685c4d42299SSascha Wildner     symno = symbol_value[symbol] + PER_STATE * nstates;
686b2605375SPeter Avalos 
687b2605375SPeter Avalos     froms[symno] = sp1 = sp = NEW2(count, Value_t);
688b2605375SPeter Avalos     tos[symno] = sp2 = NEW2(count, Value_t);
689b2605375SPeter Avalos 
690b2605375SPeter Avalos     for (i = m; i < n; i++)
691b2605375SPeter Avalos     {
692b2605375SPeter Avalos 	if (to_state[i] != default_state)
693b2605375SPeter Avalos 	{
694b2605375SPeter Avalos 	    *sp1++ = from_state[i];
695b2605375SPeter Avalos 	    *sp2++ = to_state[i];
696b2605375SPeter Avalos 	}
697b2605375SPeter Avalos     }
698b2605375SPeter Avalos 
699b2605375SPeter Avalos     tally[symno] = count;
700b2605375SPeter Avalos     width[symno] = (Value_t)(sp1[-1] - sp[0] + 1);
701b2605375SPeter Avalos }
702b2605375SPeter Avalos 
703b2605375SPeter Avalos static void
goto_actions(void)704b2605375SPeter Avalos goto_actions(void)
705b2605375SPeter Avalos {
706b2605375SPeter Avalos     int i, j, k;
707b2605375SPeter Avalos 
708b2605375SPeter Avalos     state_count = NEW2(nstates, Value_t);
709b2605375SPeter Avalos 
710b2605375SPeter Avalos     k = default_goto(start_symbol + 1);
711b2605375SPeter Avalos     start_int_table("dgoto", k);
712b2605375SPeter Avalos     save_column(start_symbol + 1, k);
713b2605375SPeter Avalos 
714b2605375SPeter Avalos     j = 10;
715b2605375SPeter Avalos     for (i = start_symbol + 2; i < nsyms; i++)
716b2605375SPeter Avalos     {
717b2605375SPeter Avalos 	if (j >= 10)
718b2605375SPeter Avalos 	{
719b2605375SPeter Avalos 	    output_newline();
720b2605375SPeter Avalos 	    j = 1;
721b2605375SPeter Avalos 	}
722b2605375SPeter Avalos 	else
723b2605375SPeter Avalos 	    ++j;
724b2605375SPeter Avalos 
725b2605375SPeter Avalos 	k = default_goto(i);
726b2605375SPeter Avalos 	output_int(k);
727b2605375SPeter Avalos 	save_column(i, k);
728b2605375SPeter Avalos     }
729b2605375SPeter Avalos 
730b2605375SPeter Avalos     end_table();
731b2605375SPeter Avalos     FREE(state_count);
732b2605375SPeter Avalos }
733b2605375SPeter Avalos 
734b2605375SPeter Avalos static void
sort_actions(void)735b2605375SPeter Avalos sort_actions(void)
736b2605375SPeter Avalos {
737b2605375SPeter Avalos     Value_t i;
738b2605375SPeter Avalos     int j;
739b2605375SPeter Avalos     int k;
740b2605375SPeter Avalos     int t;
741b2605375SPeter Avalos     int w;
742b2605375SPeter Avalos 
743b2605375SPeter Avalos     order = NEW2(nvectors, Value_t);
744b2605375SPeter Avalos     nentries = 0;
745b2605375SPeter Avalos 
746b2605375SPeter Avalos     for (i = 0; i < nvectors; i++)
747b2605375SPeter Avalos     {
748b2605375SPeter Avalos 	if (tally[i] > 0)
749b2605375SPeter Avalos 	{
750b2605375SPeter Avalos 	    t = tally[i];
751b2605375SPeter Avalos 	    w = width[i];
752b2605375SPeter Avalos 	    j = nentries - 1;
753b2605375SPeter Avalos 
754b2605375SPeter Avalos 	    while (j >= 0 && (width[order[j]] < w))
755b2605375SPeter Avalos 		j--;
756b2605375SPeter Avalos 
757b2605375SPeter Avalos 	    while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
758b2605375SPeter Avalos 		j--;
759b2605375SPeter Avalos 
760b2605375SPeter Avalos 	    for (k = nentries - 1; k > j; k--)
761b2605375SPeter Avalos 		order[k + 1] = order[k];
762b2605375SPeter Avalos 
763b2605375SPeter Avalos 	    order[j + 1] = i;
764b2605375SPeter Avalos 	    nentries++;
765b2605375SPeter Avalos 	}
766b2605375SPeter Avalos     }
767b2605375SPeter Avalos }
768b2605375SPeter Avalos 
769b2605375SPeter Avalos /*  The function matching_vector determines if the vector specified by	*/
770b2605375SPeter Avalos /*  the input parameter matches a previously considered	vector.  The	*/
771b2605375SPeter Avalos /*  test at the start of the function checks if the vector represents	*/
772b2605375SPeter Avalos /*  a row of shifts over terminal symbols or a row of reductions, or a	*/
773b2605375SPeter Avalos /*  column of shifts over a nonterminal symbol.  Berkeley Yacc does not	*/
774b2605375SPeter Avalos /*  check if a column of shifts over a nonterminal symbols matches a	*/
775b2605375SPeter Avalos /*  previously considered vector.  Because of the nature of LR parsing	*/
776b2605375SPeter Avalos /*  tables, no two columns can match.  Therefore, the only possible	*/
777b2605375SPeter Avalos /*  match would be between a row and a column.  Such matches are	*/
778b2605375SPeter Avalos /*  unlikely.  Therefore, to save time, no attempt is made to see if a	*/
779b2605375SPeter Avalos /*  column matches a previously considered vector.			*/
780b2605375SPeter Avalos /*									*/
781b2605375SPeter Avalos /*  Matching_vector is poorly designed.  The test could easily be made	*/
782b2605375SPeter Avalos /*  faster.  Also, it depends on the vectors being in a specific	*/
783b2605375SPeter Avalos /*  order.								*/
784c4d42299SSascha Wildner #if defined(YYBTYACC)
785c4d42299SSascha Wildner /*									*/
786c4d42299SSascha Wildner /*  Not really any point in checking for matching conflicts -- it is    */
787c4d42299SSascha Wildner /*  extremely unlikely to occur, and conflicts are (hopefully) rare.    */
788c4d42299SSascha Wildner #endif
789b2605375SPeter Avalos 
790b2605375SPeter Avalos static int
matching_vector(int vector)791b2605375SPeter Avalos matching_vector(int vector)
792b2605375SPeter Avalos {
793b2605375SPeter Avalos     int i;
794b2605375SPeter Avalos     int k;
795b2605375SPeter Avalos     int t;
796b2605375SPeter Avalos     int w;
797b2605375SPeter Avalos     int prev;
798b2605375SPeter Avalos 
799b2605375SPeter Avalos     i = order[vector];
800b2605375SPeter Avalos     if (i >= 2 * nstates)
801b2605375SPeter Avalos 	return (-1);
802b2605375SPeter Avalos 
803b2605375SPeter Avalos     t = tally[i];
804b2605375SPeter Avalos     w = width[i];
805b2605375SPeter Avalos 
806b2605375SPeter Avalos     for (prev = vector - 1; prev >= 0; prev--)
807b2605375SPeter Avalos     {
808faa6539eSSascha Wildner 	int j = order[prev];
809b2605375SPeter Avalos 
810faa6539eSSascha Wildner 	if (width[j] != w || tally[j] != t)
811faa6539eSSascha Wildner 	{
812faa6539eSSascha Wildner 	    return (-1);
813faa6539eSSascha Wildner 	}
814faa6539eSSascha Wildner 	else
815faa6539eSSascha Wildner 	{
816faa6539eSSascha Wildner 	    int match = 1;
817faa6539eSSascha Wildner 
818b2605375SPeter Avalos 	    for (k = 0; match && k < t; k++)
819b2605375SPeter Avalos 	    {
820b2605375SPeter Avalos 		if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
821b2605375SPeter Avalos 		    match = 0;
822b2605375SPeter Avalos 	    }
823b2605375SPeter Avalos 
824b2605375SPeter Avalos 	    if (match)
825b2605375SPeter Avalos 		return (j);
826b2605375SPeter Avalos 	}
827faa6539eSSascha Wildner     }
828b2605375SPeter Avalos 
829b2605375SPeter Avalos     return (-1);
830b2605375SPeter Avalos }
831b2605375SPeter Avalos 
832b2605375SPeter Avalos static int
pack_vector(int vector)833b2605375SPeter Avalos pack_vector(int vector)
834b2605375SPeter Avalos {
835b2605375SPeter Avalos     int i, j, k, l;
836b2605375SPeter Avalos     int t;
837*5152d3b1SAntonio Huete Jimenez     Value_t loc;
838b2605375SPeter Avalos     int ok;
839b2605375SPeter Avalos     Value_t *from;
840b2605375SPeter Avalos     Value_t *to;
841b2605375SPeter Avalos     int newmax;
842b2605375SPeter Avalos 
843b2605375SPeter Avalos     i = order[vector];
844b2605375SPeter Avalos     t = tally[i];
845b2605375SPeter Avalos     assert(t);
846b2605375SPeter Avalos 
847b2605375SPeter Avalos     from = froms[i];
848b2605375SPeter Avalos     to = tos[i];
849b2605375SPeter Avalos 
850b2605375SPeter Avalos     j = lowzero - from[0];
851b2605375SPeter Avalos     for (k = 1; k < t; ++k)
852b2605375SPeter Avalos 	if (lowzero - from[k] > j)
853b2605375SPeter Avalos 	    j = lowzero - from[k];
854b2605375SPeter Avalos     for (;; ++j)
855b2605375SPeter Avalos     {
856b2605375SPeter Avalos 	if (j == 0)
857b2605375SPeter Avalos 	    continue;
858b2605375SPeter Avalos 	ok = 1;
859b2605375SPeter Avalos 	for (k = 0; ok && k < t; k++)
860b2605375SPeter Avalos 	{
861*5152d3b1SAntonio Huete Jimenez 	    loc = (Value_t)(j + from[k]);
862b2605375SPeter Avalos 	    if (loc >= maxtable - 1)
863b2605375SPeter Avalos 	    {
864b2605375SPeter Avalos 		if (loc >= MAXTABLE - 1)
865b2605375SPeter Avalos 		    fatal("maximum table size exceeded");
866b2605375SPeter Avalos 
867b2605375SPeter Avalos 		newmax = maxtable;
868b2605375SPeter Avalos 		do
869b2605375SPeter Avalos 		{
870b2605375SPeter Avalos 		    newmax += 200;
871b2605375SPeter Avalos 		}
872b2605375SPeter Avalos 		while (newmax <= loc);
873b2605375SPeter Avalos 
874b2605375SPeter Avalos 		table = TREALLOC(Value_t, table, newmax);
875b2605375SPeter Avalos 		NO_SPACE(table);
876b2605375SPeter Avalos 
877b2605375SPeter Avalos 		check = TREALLOC(Value_t, check, newmax);
878b2605375SPeter Avalos 		NO_SPACE(check);
879b2605375SPeter Avalos 
880b2605375SPeter Avalos 		for (l = maxtable; l < newmax; ++l)
881b2605375SPeter Avalos 		{
882b2605375SPeter Avalos 		    table[l] = 0;
883b2605375SPeter Avalos 		    check[l] = -1;
884b2605375SPeter Avalos 		}
885b2605375SPeter Avalos 		maxtable = newmax;
886b2605375SPeter Avalos 	    }
887b2605375SPeter Avalos 
888b2605375SPeter Avalos 	    if (check[loc] != -1)
889b2605375SPeter Avalos 		ok = 0;
890b2605375SPeter Avalos 	}
891b2605375SPeter Avalos 	for (k = 0; ok && k < vector; k++)
892b2605375SPeter Avalos 	{
893b2605375SPeter Avalos 	    if (pos[k] == j)
894b2605375SPeter Avalos 		ok = 0;
895b2605375SPeter Avalos 	}
896b2605375SPeter Avalos 	if (ok)
897b2605375SPeter Avalos 	{
898b2605375SPeter Avalos 	    for (k = 0; k < t; k++)
899b2605375SPeter Avalos 	    {
900*5152d3b1SAntonio Huete Jimenez 		loc = (Value_t)(j + from[k]);
901b2605375SPeter Avalos 		table[loc] = to[k];
902b2605375SPeter Avalos 		check[loc] = from[k];
903b2605375SPeter Avalos 		if (loc > high)
904b2605375SPeter Avalos 		    high = loc;
905b2605375SPeter Avalos 	    }
906b2605375SPeter Avalos 
907b2605375SPeter Avalos 	    while (check[lowzero] != -1)
908b2605375SPeter Avalos 		++lowzero;
909b2605375SPeter Avalos 
910b2605375SPeter Avalos 	    return (j);
911b2605375SPeter Avalos 	}
912b2605375SPeter Avalos     }
913b2605375SPeter Avalos }
914b2605375SPeter Avalos 
915b2605375SPeter Avalos static void
pack_table(void)916b2605375SPeter Avalos pack_table(void)
917b2605375SPeter Avalos {
918b2605375SPeter Avalos     int i;
919b2605375SPeter Avalos     Value_t place;
920b2605375SPeter Avalos 
921b2605375SPeter Avalos     base = NEW2(nvectors, Value_t);
922b2605375SPeter Avalos     pos = NEW2(nentries, Value_t);
923b2605375SPeter Avalos 
924b2605375SPeter Avalos     maxtable = 1000;
925b2605375SPeter Avalos     table = NEW2(maxtable, Value_t);
926b2605375SPeter Avalos     check = NEW2(maxtable, Value_t);
927b2605375SPeter Avalos 
928b2605375SPeter Avalos     lowzero = 0;
929b2605375SPeter Avalos     high = 0;
930b2605375SPeter Avalos 
931b2605375SPeter Avalos     for (i = 0; i < maxtable; i++)
932b2605375SPeter Avalos 	check[i] = -1;
933b2605375SPeter Avalos 
934b2605375SPeter Avalos     for (i = 0; i < nentries; i++)
935b2605375SPeter Avalos     {
936faa6539eSSascha Wildner 	int state = matching_vector(i);
937b2605375SPeter Avalos 
938b2605375SPeter Avalos 	if (state < 0)
939b2605375SPeter Avalos 	    place = (Value_t)pack_vector(i);
940b2605375SPeter Avalos 	else
941b2605375SPeter Avalos 	    place = base[state];
942b2605375SPeter Avalos 
943b2605375SPeter Avalos 	pos[i] = place;
944b2605375SPeter Avalos 	base[order[i]] = place;
945b2605375SPeter Avalos     }
946b2605375SPeter Avalos 
947b2605375SPeter Avalos     for (i = 0; i < nvectors; i++)
948b2605375SPeter Avalos     {
949b2605375SPeter Avalos 	if (froms[i])
950b2605375SPeter Avalos 	    FREE(froms[i]);
951b2605375SPeter Avalos 	if (tos[i])
952b2605375SPeter Avalos 	    FREE(tos[i]);
953b2605375SPeter Avalos     }
954b2605375SPeter Avalos 
955c4d42299SSascha Wildner     DO_FREE(froms);
956c4d42299SSascha Wildner     DO_FREE(tos);
957c4d42299SSascha Wildner     DO_FREE(tally);
958c4d42299SSascha Wildner     DO_FREE(width);
959c4d42299SSascha Wildner     DO_FREE(pos);
960b2605375SPeter Avalos }
961b2605375SPeter Avalos 
962b2605375SPeter Avalos static void
output_base(void)963b2605375SPeter Avalos output_base(void)
964b2605375SPeter Avalos {
965b2605375SPeter Avalos     int i, j;
966b2605375SPeter Avalos 
967b2605375SPeter Avalos     start_int_table("sindex", base[0]);
968b2605375SPeter Avalos 
969b2605375SPeter Avalos     j = 10;
970b2605375SPeter Avalos     for (i = 1; i < nstates; i++)
971b2605375SPeter Avalos     {
972b2605375SPeter Avalos 	if (j >= 10)
973b2605375SPeter Avalos 	{
974b2605375SPeter Avalos 	    output_newline();
975b2605375SPeter Avalos 	    j = 1;
976b2605375SPeter Avalos 	}
977b2605375SPeter Avalos 	else
978b2605375SPeter Avalos 	    ++j;
979b2605375SPeter Avalos 
980b2605375SPeter Avalos 	output_int(base[i]);
981b2605375SPeter Avalos     }
982b2605375SPeter Avalos 
983b2605375SPeter Avalos     end_table();
984b2605375SPeter Avalos 
985b2605375SPeter Avalos     start_int_table("rindex", base[nstates]);
986b2605375SPeter Avalos 
987b2605375SPeter Avalos     j = 10;
988b2605375SPeter Avalos     for (i = nstates + 1; i < 2 * nstates; i++)
989b2605375SPeter Avalos     {
990b2605375SPeter Avalos 	if (j >= 10)
991b2605375SPeter Avalos 	{
992b2605375SPeter Avalos 	    output_newline();
993b2605375SPeter Avalos 	    j = 1;
994b2605375SPeter Avalos 	}
995b2605375SPeter Avalos 	else
996b2605375SPeter Avalos 	    ++j;
997b2605375SPeter Avalos 
998b2605375SPeter Avalos 	output_int(base[i]);
999b2605375SPeter Avalos     }
1000b2605375SPeter Avalos 
1001b2605375SPeter Avalos     end_table();
1002b2605375SPeter Avalos 
1003c4d42299SSascha Wildner #if defined(YYBTYACC)
1004c4d42299SSascha Wildner     output_line("#if YYBTYACC");
1005c4d42299SSascha Wildner     start_int_table("cindex", base[2 * nstates]);
1006b2605375SPeter Avalos 
1007b2605375SPeter Avalos     j = 10;
1008c4d42299SSascha Wildner     for (i = 2 * nstates + 1; i < 3 * nstates; i++)
1009c4d42299SSascha Wildner     {
1010c4d42299SSascha Wildner 	if (j >= 10)
1011c4d42299SSascha Wildner 	{
1012c4d42299SSascha Wildner 	    output_newline();
1013c4d42299SSascha Wildner 	    j = 1;
1014c4d42299SSascha Wildner 	}
1015c4d42299SSascha Wildner 	else
1016c4d42299SSascha Wildner 	    ++j;
1017c4d42299SSascha Wildner 
1018c4d42299SSascha Wildner 	output_int(base[i]);
1019c4d42299SSascha Wildner     }
1020c4d42299SSascha Wildner 
1021c4d42299SSascha Wildner     end_table();
1022c4d42299SSascha Wildner     output_line("#endif");
1023c4d42299SSascha Wildner #endif
1024c4d42299SSascha Wildner 
1025c4d42299SSascha Wildner     start_int_table("gindex", base[PER_STATE * nstates]);
1026c4d42299SSascha Wildner 
1027c4d42299SSascha Wildner     j = 10;
1028c4d42299SSascha Wildner     for (i = PER_STATE * nstates + 1; i < nvectors - 1; i++)
1029b2605375SPeter Avalos     {
1030b2605375SPeter Avalos 	if (j >= 10)
1031b2605375SPeter Avalos 	{
1032b2605375SPeter Avalos 	    output_newline();
1033b2605375SPeter Avalos 	    j = 1;
1034b2605375SPeter Avalos 	}
1035b2605375SPeter Avalos 	else
1036b2605375SPeter Avalos 	    ++j;
1037b2605375SPeter Avalos 
1038b2605375SPeter Avalos 	output_int(base[i]);
1039b2605375SPeter Avalos     }
1040b2605375SPeter Avalos 
1041b2605375SPeter Avalos     end_table();
1042b2605375SPeter Avalos     FREE(base);
1043b2605375SPeter Avalos }
1044b2605375SPeter Avalos 
1045b2605375SPeter Avalos static void
output_table(void)1046b2605375SPeter Avalos output_table(void)
1047b2605375SPeter Avalos {
1048b2605375SPeter Avalos     int i;
1049b2605375SPeter Avalos     int j;
1050b2605375SPeter Avalos 
1051c4d42299SSascha Wildner     if (high >= MAXYYINT)
1052c4d42299SSascha Wildner     {
1053c4d42299SSascha Wildner 	fprintf(stderr, "YYTABLESIZE: %ld\n", high);
1054*5152d3b1SAntonio Huete Jimenez 	fprintf(stderr, "Table is longer than %ld elements.\n", (long)MAXYYINT);
1055c4d42299SSascha Wildner 	done(1);
1056c4d42299SSascha Wildner     }
1057c4d42299SSascha Wildner 
1058b2605375SPeter Avalos     ++outline;
1059c4d42299SSascha Wildner     fprintf(code_file, "#define YYTABLESIZE %ld\n", high);
1060b2605375SPeter Avalos     start_int_table("table", table[0]);
1061b2605375SPeter Avalos 
1062b2605375SPeter Avalos     j = 10;
1063b2605375SPeter Avalos     for (i = 1; i <= high; i++)
1064b2605375SPeter Avalos     {
1065b2605375SPeter Avalos 	if (j >= 10)
1066b2605375SPeter Avalos 	{
1067b2605375SPeter Avalos 	    output_newline();
1068b2605375SPeter Avalos 	    j = 1;
1069b2605375SPeter Avalos 	}
1070b2605375SPeter Avalos 	else
1071b2605375SPeter Avalos 	    ++j;
1072b2605375SPeter Avalos 
1073b2605375SPeter Avalos 	output_int(table[i]);
1074b2605375SPeter Avalos     }
1075b2605375SPeter Avalos 
1076b2605375SPeter Avalos     end_table();
1077b2605375SPeter Avalos     FREE(table);
1078b2605375SPeter Avalos }
1079b2605375SPeter Avalos 
1080b2605375SPeter Avalos static void
output_check(void)1081b2605375SPeter Avalos output_check(void)
1082b2605375SPeter Avalos {
1083b2605375SPeter Avalos     int i;
1084b2605375SPeter Avalos     int j;
1085b2605375SPeter Avalos 
1086b2605375SPeter Avalos     start_int_table("check", check[0]);
1087b2605375SPeter Avalos 
1088b2605375SPeter Avalos     j = 10;
1089b2605375SPeter Avalos     for (i = 1; i <= high; i++)
1090b2605375SPeter Avalos     {
1091b2605375SPeter Avalos 	if (j >= 10)
1092b2605375SPeter Avalos 	{
1093b2605375SPeter Avalos 	    output_newline();
1094b2605375SPeter Avalos 	    j = 1;
1095b2605375SPeter Avalos 	}
1096b2605375SPeter Avalos 	else
1097b2605375SPeter Avalos 	    ++j;
1098b2605375SPeter Avalos 
1099b2605375SPeter Avalos 	output_int(check[i]);
1100b2605375SPeter Avalos     }
1101b2605375SPeter Avalos 
1102b2605375SPeter Avalos     end_table();
1103b2605375SPeter Avalos     FREE(check);
1104b2605375SPeter Avalos }
1105b2605375SPeter Avalos 
1106c4d42299SSascha Wildner #if defined(YYBTYACC)
1107c4d42299SSascha Wildner static void
output_ctable(void)1108c4d42299SSascha Wildner output_ctable(void)
1109c4d42299SSascha Wildner {
1110c4d42299SSascha Wildner     int i;
1111c4d42299SSascha Wildner     int j;
1112c4d42299SSascha Wildner     int limit = (conflicts != 0) ? nconflicts : 0;
1113c4d42299SSascha Wildner 
1114c4d42299SSascha Wildner     if (limit < high)
1115c4d42299SSascha Wildner 	limit = (int)high;
1116c4d42299SSascha Wildner 
1117c4d42299SSascha Wildner     output_line("#if YYBTYACC");
1118c4d42299SSascha Wildner     start_int_table("ctable", conflicts ? conflicts[0] : -1);
1119c4d42299SSascha Wildner 
1120c4d42299SSascha Wildner     j = 10;
1121c4d42299SSascha Wildner     for (i = 1; i < limit; i++)
1122c4d42299SSascha Wildner     {
1123c4d42299SSascha Wildner 	if (j >= 10)
1124c4d42299SSascha Wildner 	{
1125c4d42299SSascha Wildner 	    output_newline();
1126c4d42299SSascha Wildner 	    j = 1;
1127c4d42299SSascha Wildner 	}
1128c4d42299SSascha Wildner 	else
1129c4d42299SSascha Wildner 	    ++j;
1130c4d42299SSascha Wildner 
1131c4d42299SSascha Wildner 	output_int((conflicts != 0 && i < nconflicts) ? conflicts[i] : -1);
1132c4d42299SSascha Wildner     }
1133c4d42299SSascha Wildner 
1134c4d42299SSascha Wildner     if (conflicts)
1135c4d42299SSascha Wildner 	FREE(conflicts);
1136c4d42299SSascha Wildner 
1137c4d42299SSascha Wildner     end_table();
1138c4d42299SSascha Wildner     output_line("#endif");
1139c4d42299SSascha Wildner }
1140c4d42299SSascha Wildner #endif
1141c4d42299SSascha Wildner 
1142b2605375SPeter Avalos static void
output_actions(void)1143b2605375SPeter Avalos output_actions(void)
1144b2605375SPeter Avalos {
1145c4d42299SSascha Wildner     nvectors = PER_STATE * nstates + nvars;
1146b2605375SPeter Avalos 
1147b2605375SPeter Avalos     froms = NEW2(nvectors, Value_t *);
1148b2605375SPeter Avalos     tos = NEW2(nvectors, Value_t *);
1149b2605375SPeter Avalos     tally = NEW2(nvectors, Value_t);
1150b2605375SPeter Avalos     width = NEW2(nvectors, Value_t);
1151b2605375SPeter Avalos 
1152c4d42299SSascha Wildner #if defined(YYBTYACC)
1153c4d42299SSascha Wildner     if (backtrack && (SRtotal + RRtotal) != 0)
1154c4d42299SSascha Wildner 	conflicts = NEW2(4 * (SRtotal + RRtotal), Value_t);
1155c4d42299SSascha Wildner #endif
1156c4d42299SSascha Wildner 
1157b2605375SPeter Avalos     token_actions();
1158b2605375SPeter Avalos     FREE(lookaheads);
1159b2605375SPeter Avalos     FREE(LA);
1160b2605375SPeter Avalos     FREE(LAruleno);
1161b2605375SPeter Avalos     FREE(accessing_symbol);
1162b2605375SPeter Avalos 
1163b2605375SPeter Avalos     goto_actions();
1164c4d42299SSascha Wildner     FREE(goto_base);
1165b2605375SPeter Avalos     FREE(from_state);
1166b2605375SPeter Avalos     FREE(to_state);
1167b2605375SPeter Avalos 
1168b2605375SPeter Avalos     sort_actions();
1169b2605375SPeter Avalos     pack_table();
1170b2605375SPeter Avalos     output_base();
1171b2605375SPeter Avalos     output_table();
1172b2605375SPeter Avalos     output_check();
1173c4d42299SSascha Wildner #if defined(YYBTYACC)
1174c4d42299SSascha Wildner     output_ctable();
1175c4d42299SSascha Wildner #endif
1176b2605375SPeter Avalos }
1177b2605375SPeter Avalos 
1178b2605375SPeter Avalos static int
is_C_identifier(char * name)1179b2605375SPeter Avalos is_C_identifier(char *name)
1180b2605375SPeter Avalos {
1181b2605375SPeter Avalos     char *s;
1182b2605375SPeter Avalos     int c;
1183b2605375SPeter Avalos 
1184b2605375SPeter Avalos     s = name;
1185b2605375SPeter Avalos     c = *s;
1186b2605375SPeter Avalos     if (c == '"')
1187b2605375SPeter Avalos     {
1188b2605375SPeter Avalos 	c = *++s;
1189ca0c2f89SAntonio Huete Jimenez 	if (!IS_NAME1(c))
1190b2605375SPeter Avalos 	    return (0);
1191b2605375SPeter Avalos 	while ((c = *++s) != '"')
1192b2605375SPeter Avalos 	{
1193ca0c2f89SAntonio Huete Jimenez 	    if (!IS_NAME2(c))
1194b2605375SPeter Avalos 		return (0);
1195b2605375SPeter Avalos 	}
1196b2605375SPeter Avalos 	return (1);
1197b2605375SPeter Avalos     }
1198b2605375SPeter Avalos 
1199ca0c2f89SAntonio Huete Jimenez     if (!IS_NAME1(c))
1200b2605375SPeter Avalos 	return (0);
1201b2605375SPeter Avalos     while ((c = *++s) != 0)
1202b2605375SPeter Avalos     {
1203ca0c2f89SAntonio Huete Jimenez 	if (!IS_NAME2(c))
1204b2605375SPeter Avalos 	    return (0);
1205b2605375SPeter Avalos     }
1206b2605375SPeter Avalos     return (1);
1207b2605375SPeter Avalos }
1208b2605375SPeter Avalos 
1209c4d42299SSascha Wildner #if USE_HEADER_GUARDS
1210c4d42299SSascha Wildner static void
start_defines_file(void)1211c4d42299SSascha Wildner start_defines_file(void)
1212c4d42299SSascha Wildner {
1213c4d42299SSascha Wildner     fprintf(defines_file, "#ifndef _%s_defines_h_\n", symbol_prefix);
1214c4d42299SSascha Wildner     fprintf(defines_file, "#define _%s_defines_h_\n\n", symbol_prefix);
1215c4d42299SSascha Wildner }
1216c4d42299SSascha Wildner 
1217c4d42299SSascha Wildner static void
end_defines_file(void)1218c4d42299SSascha Wildner end_defines_file(void)
1219c4d42299SSascha Wildner {
1220c4d42299SSascha Wildner     fprintf(defines_file, "\n#endif /* _%s_defines_h_ */\n", symbol_prefix);
1221c4d42299SSascha Wildner }
1222c4d42299SSascha Wildner #else
1223c4d42299SSascha Wildner #define start_defines_file()	/* nothing */
1224c4d42299SSascha Wildner #define end_defines_file()	/* nothing */
1225c4d42299SSascha Wildner #endif
1226c4d42299SSascha Wildner 
1227b2605375SPeter Avalos static void
output_defines(FILE * fp)1228b2605375SPeter Avalos output_defines(FILE * fp)
1229b2605375SPeter Avalos {
1230b2605375SPeter Avalos     int c, i;
1231faa6539eSSascha Wildner 
1232faa6539eSSascha Wildner     if (fp == defines_file)
1233faa6539eSSascha Wildner     {
1234faa6539eSSascha Wildner 	output_code_lines(fp, CODE_REQUIRES);
1235faa6539eSSascha Wildner     }
1236b2605375SPeter Avalos 
1237b2605375SPeter Avalos     for (i = 2; i < ntokens; ++i)
1238b2605375SPeter Avalos     {
1239faa6539eSSascha Wildner 	char *s = symbol_name[i];
1240faa6539eSSascha Wildner 
1241b2605375SPeter Avalos 	if (is_C_identifier(s) && (!sflag || *s != '"'))
1242b2605375SPeter Avalos 	{
1243b2605375SPeter Avalos 	    fprintf(fp, "#define ");
1244b2605375SPeter Avalos 	    c = *s;
1245b2605375SPeter Avalos 	    if (c == '"')
1246b2605375SPeter Avalos 	    {
1247b2605375SPeter Avalos 		while ((c = *++s) != '"')
1248b2605375SPeter Avalos 		{
1249b2605375SPeter Avalos 		    putc(c, fp);
1250b2605375SPeter Avalos 		}
1251b2605375SPeter Avalos 	    }
1252b2605375SPeter Avalos 	    else
1253b2605375SPeter Avalos 	    {
1254b2605375SPeter Avalos 		do
1255b2605375SPeter Avalos 		{
1256b2605375SPeter Avalos 		    putc(c, fp);
1257b2605375SPeter Avalos 		}
1258b2605375SPeter Avalos 		while ((c = *++s) != 0);
1259b2605375SPeter Avalos 	    }
1260b2605375SPeter Avalos 	    if (fp == code_file)
1261b2605375SPeter Avalos 		++outline;
1262*5152d3b1SAntonio Huete Jimenez 	    fprintf(fp, " %ld\n", (long)symbol_value[i]);
1263b2605375SPeter Avalos 	}
1264b2605375SPeter Avalos     }
1265b2605375SPeter Avalos 
1266b2605375SPeter Avalos     if (fp == code_file)
1267b2605375SPeter Avalos 	++outline;
1268b2605375SPeter Avalos     if (fp != defines_file || iflag)
1269*5152d3b1SAntonio Huete Jimenez 	fprintf(fp, "#define YYERRCODE %ld\n", (long)symbol_value[1]);
1270b2605375SPeter Avalos 
1271faa6539eSSascha Wildner     if (fp == defines_file)
1272faa6539eSSascha Wildner     {
1273faa6539eSSascha Wildner 	output_code_lines(fp, CODE_PROVIDES);
1274faa6539eSSascha Wildner     }
1275faa6539eSSascha Wildner 
1276ca0c2f89SAntonio Huete Jimenez     if (token_table && rflag && fp != externs_file)
1277ca0c2f89SAntonio Huete Jimenez     {
1278ca0c2f89SAntonio Huete Jimenez 	if (fp == code_file)
1279ca0c2f89SAntonio Huete Jimenez 	    ++outline;
1280ca0c2f89SAntonio Huete Jimenez 	fputs("#undef yytname\n", fp);
1281ca0c2f89SAntonio Huete Jimenez 	if (fp == code_file)
1282ca0c2f89SAntonio Huete Jimenez 	    ++outline;
1283ca0c2f89SAntonio Huete Jimenez 	fputs("#define yytname yyname\n", fp);
1284ca0c2f89SAntonio Huete Jimenez     }
1285ca0c2f89SAntonio Huete Jimenez 
1286b2605375SPeter Avalos     if (fp == defines_file || (iflag && !dflag))
1287b2605375SPeter Avalos     {
1288b2605375SPeter Avalos 	if (unionized)
1289b2605375SPeter Avalos 	{
1290c4d42299SSascha Wildner 	    if (union_file != 0)
1291c4d42299SSascha Wildner 	    {
1292b2605375SPeter Avalos 		rewind(union_file);
1293b2605375SPeter Avalos 		while ((c = getc(union_file)) != EOF)
1294c4d42299SSascha Wildner 		    putc_code(fp, c);
1295c4d42299SSascha Wildner 	    }
1296faa6539eSSascha Wildner 	    if (!pure_parser)
1297b2605375SPeter Avalos 		fprintf(fp, "extern YYSTYPE %slval;\n", symbol_prefix);
1298b2605375SPeter Avalos 	}
1299ca0c2f89SAntonio Huete Jimenez #if defined(YYBTYACC)
1300ca0c2f89SAntonio Huete Jimenez 	if (locations)
1301faa6539eSSascha Wildner 	{
1302ca0c2f89SAntonio Huete Jimenez 	    output_ltype(fp);
1303faa6539eSSascha Wildner 	    fprintf(fp, "extern YYLTYPE %slloc;\n", symbol_prefix);
1304faa6539eSSascha Wildner 	}
1305ca0c2f89SAntonio Huete Jimenez #endif
1306b2605375SPeter Avalos     }
1307b2605375SPeter Avalos }
1308b2605375SPeter Avalos 
1309b2605375SPeter Avalos static void
output_stored_text(FILE * fp)1310b2605375SPeter Avalos output_stored_text(FILE * fp)
1311b2605375SPeter Avalos {
1312b2605375SPeter Avalos     int c;
1313b2605375SPeter Avalos     FILE *in;
1314b2605375SPeter Avalos 
1315b2605375SPeter Avalos     if (text_file == NULL)
1316b2605375SPeter Avalos 	open_error("text_file");
1317faa6539eSSascha Wildner     rewind(text_file);
1318b2605375SPeter Avalos     in = text_file;
1319b2605375SPeter Avalos     if ((c = getc(in)) == EOF)
1320b2605375SPeter Avalos 	return;
1321b2605375SPeter Avalos     putc_code(fp, c);
1322b2605375SPeter Avalos     while ((c = getc(in)) != EOF)
1323b2605375SPeter Avalos     {
1324b2605375SPeter Avalos 	putc_code(fp, c);
1325b2605375SPeter Avalos     }
1326b2605375SPeter Avalos     write_code_lineno(fp);
1327b2605375SPeter Avalos }
1328b2605375SPeter Avalos 
1329faa6539eSSascha Wildner static int
output_yydebug(FILE * fp)1330faa6539eSSascha Wildner output_yydebug(FILE * fp)
1331faa6539eSSascha Wildner {
1332faa6539eSSascha Wildner     fprintf(fp, "#ifndef YYDEBUG\n");
1333faa6539eSSascha Wildner     fprintf(fp, "#define YYDEBUG %d\n", tflag);
1334faa6539eSSascha Wildner     fprintf(fp, "#endif\n");
1335faa6539eSSascha Wildner     return 3;
1336faa6539eSSascha Wildner }
1337faa6539eSSascha Wildner 
1338b2605375SPeter Avalos static void
output_debug(void)1339b2605375SPeter Avalos output_debug(void)
1340b2605375SPeter Avalos {
1341c4d42299SSascha Wildner     int i, j, k, max, maxtok;
1342b2605375SPeter Avalos     const char **symnam;
1343b2605375SPeter Avalos     const char *s;
1344b2605375SPeter Avalos 
1345b2605375SPeter Avalos     ++outline;
1346*5152d3b1SAntonio Huete Jimenez     fprintf(code_file, "#define YYFINAL %ld\n", (long)final_state);
1347b2605375SPeter Avalos 
1348faa6539eSSascha Wildner     outline += output_yydebug(code_file);
1349b2605375SPeter Avalos 
1350b2605375SPeter Avalos     if (rflag)
1351b2605375SPeter Avalos     {
1352faa6539eSSascha Wildner 	output_yydebug(output_file);
1353b2605375SPeter Avalos     }
1354b2605375SPeter Avalos 
1355c4d42299SSascha Wildner     maxtok = 0;
1356c4d42299SSascha Wildner     for (i = 0; i < ntokens; ++i)
1357c4d42299SSascha Wildner 	if (symbol_value[i] > maxtok)
1358c4d42299SSascha Wildner 	    maxtok = symbol_value[i];
1359c4d42299SSascha Wildner 
1360c4d42299SSascha Wildner     /* symbol_value[$accept] = -1         */
1361c4d42299SSascha Wildner     /* symbol_value[<goal>]  = 0          */
1362c4d42299SSascha Wildner     /* remaining non-terminals start at 1 */
1363c4d42299SSascha Wildner     max = maxtok;
1364c4d42299SSascha Wildner     for (i = ntokens; i < nsyms; ++i)
1365c4d42299SSascha Wildner 	if (((maxtok + 1) + (symbol_value[i] + 1)) > max)
1366c4d42299SSascha Wildner 	    max = (maxtok + 1) + (symbol_value[i] + 1);
1367b2605375SPeter Avalos 
1368b2605375SPeter Avalos     ++outline;
1369c4d42299SSascha Wildner     fprintf(code_file, "#define YYMAXTOKEN %d\n", maxtok);
1370b2605375SPeter Avalos 
1371c4d42299SSascha Wildner     ++outline;
1372c4d42299SSascha Wildner     fprintf(code_file, "#define YYUNDFTOKEN %d\n", max + 1);
1373c4d42299SSascha Wildner 
1374c4d42299SSascha Wildner     ++outline;
1375c4d42299SSascha Wildner     fprintf(code_file, "#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? "
1376c4d42299SSascha Wildner 	    "YYUNDFTOKEN : (a))\n");
1377c4d42299SSascha Wildner 
1378*5152d3b1SAntonio Huete Jimenez     symnam = TCMALLOC(const char *, max + 2);
1379b2605375SPeter Avalos     NO_SPACE(symnam);
1380b2605375SPeter Avalos 
1381b2605375SPeter Avalos     /* Note that it is not necessary to initialize the element          */
1382b2605375SPeter Avalos     /* symnam[max].                                                     */
1383c4d42299SSascha Wildner #if defined(YYBTYACC)
1384b2605375SPeter Avalos     for (i = 0; i < max; ++i)
1385b2605375SPeter Avalos 	symnam[i] = 0;
1386c4d42299SSascha Wildner     for (i = nsyms - 1; i >= 0; --i)
1387c4d42299SSascha Wildner 	symnam[symbol_pval[i]] = symbol_name[i];
1388c4d42299SSascha Wildner     symnam[max + 1] = "illegal-symbol";
1389c4d42299SSascha Wildner #else
1390c4d42299SSascha Wildner     for (i = 0; i <= max; ++i)
1391c4d42299SSascha Wildner 	symnam[i] = 0;
1392b2605375SPeter Avalos     for (i = ntokens - 1; i >= 2; --i)
1393b2605375SPeter Avalos 	symnam[symbol_value[i]] = symbol_name[i];
1394b2605375SPeter Avalos     symnam[0] = "end-of-file";
1395c4d42299SSascha Wildner     symnam[max + 1] = "illegal-symbol";
1396c4d42299SSascha Wildner #endif
1397b2605375SPeter Avalos 
1398c4d42299SSascha Wildner     /*
1399c4d42299SSascha Wildner      * bison's yytname[] array is roughly the same as byacc's yyname[] array.
1400c4d42299SSascha Wildner      * The difference is that byacc does not predefine "$undefined".
1401c4d42299SSascha Wildner      *
1402c4d42299SSascha Wildner      * If the grammar declares "%token-table", define symbol "yytname" so
1403c4d42299SSascha Wildner      * an application such as ntpd can build.
1404c4d42299SSascha Wildner      */
1405c4d42299SSascha Wildner     if (token_table)
1406c4d42299SSascha Wildner     {
1407ca0c2f89SAntonio Huete Jimenez 	if (!rflag)
1408ca0c2f89SAntonio Huete Jimenez 	{
1409c4d42299SSascha Wildner 	    output_line("#undef yytname");
1410c4d42299SSascha Wildner 	    output_line("#define yytname yyname");
1411c4d42299SSascha Wildner 	}
1412ca0c2f89SAntonio Huete Jimenez     }
1413c4d42299SSascha Wildner     else
1414c4d42299SSascha Wildner     {
1415b2605375SPeter Avalos 	output_line("#if YYDEBUG");
1416c4d42299SSascha Wildner     }
1417b2605375SPeter Avalos 
1418b2605375SPeter Avalos     start_str_table("name");
1419b2605375SPeter Avalos     j = 80;
1420c4d42299SSascha Wildner     for (i = 0; i <= max + 1; ++i)
1421b2605375SPeter Avalos     {
1422b2605375SPeter Avalos 	if ((s = symnam[i]) != 0)
1423b2605375SPeter Avalos 	{
1424b2605375SPeter Avalos 	    if (s[0] == '"')
1425b2605375SPeter Avalos 	    {
1426b2605375SPeter Avalos 		k = 7;
1427b2605375SPeter Avalos 		while (*++s != '"')
1428b2605375SPeter Avalos 		{
1429b2605375SPeter Avalos 		    ++k;
1430b2605375SPeter Avalos 		    if (*s == '\\')
1431b2605375SPeter Avalos 		    {
1432b2605375SPeter Avalos 			k += 2;
1433b2605375SPeter Avalos 			if (*++s == '\\')
1434b2605375SPeter Avalos 			    ++k;
1435b2605375SPeter Avalos 		    }
1436b2605375SPeter Avalos 		}
1437b2605375SPeter Avalos 		j += k;
1438b2605375SPeter Avalos 		if (j > 80)
1439b2605375SPeter Avalos 		{
1440b2605375SPeter Avalos 		    output_newline();
1441b2605375SPeter Avalos 		    j = k;
1442b2605375SPeter Avalos 		}
1443b2605375SPeter Avalos 		fprintf(output_file, "\"\\\"");
1444b2605375SPeter Avalos 		s = symnam[i];
1445b2605375SPeter Avalos 		while (*++s != '"')
1446b2605375SPeter Avalos 		{
1447b2605375SPeter Avalos 		    if (*s == '\\')
1448b2605375SPeter Avalos 		    {
1449b2605375SPeter Avalos 			fprintf(output_file, "\\\\");
1450b2605375SPeter Avalos 			if (*++s == '\\')
1451b2605375SPeter Avalos 			    fprintf(output_file, "\\\\");
1452b2605375SPeter Avalos 			else
1453b2605375SPeter Avalos 			    putc(*s, output_file);
1454b2605375SPeter Avalos 		    }
1455b2605375SPeter Avalos 		    else
1456b2605375SPeter Avalos 			putc(*s, output_file);
1457b2605375SPeter Avalos 		}
1458b2605375SPeter Avalos 		fprintf(output_file, "\\\"\",");
1459b2605375SPeter Avalos 	    }
1460b2605375SPeter Avalos 	    else if (s[0] == '\'')
1461b2605375SPeter Avalos 	    {
1462b2605375SPeter Avalos 		if (s[1] == '"')
1463b2605375SPeter Avalos 		{
1464b2605375SPeter Avalos 		    j += 7;
1465b2605375SPeter Avalos 		    if (j > 80)
1466b2605375SPeter Avalos 		    {
1467b2605375SPeter Avalos 			output_newline();
1468b2605375SPeter Avalos 			j = 7;
1469b2605375SPeter Avalos 		    }
1470b2605375SPeter Avalos 		    fprintf(output_file, "\"'\\\"'\",");
1471b2605375SPeter Avalos 		}
1472b2605375SPeter Avalos 		else
1473b2605375SPeter Avalos 		{
1474b2605375SPeter Avalos 		    k = 5;
1475b2605375SPeter Avalos 		    while (*++s != '\'')
1476b2605375SPeter Avalos 		    {
1477b2605375SPeter Avalos 			++k;
1478b2605375SPeter Avalos 			if (*s == '\\')
1479b2605375SPeter Avalos 			{
1480b2605375SPeter Avalos 			    k += 2;
1481b2605375SPeter Avalos 			    if (*++s == '\\')
1482b2605375SPeter Avalos 				++k;
1483b2605375SPeter Avalos 			}
1484b2605375SPeter Avalos 		    }
1485b2605375SPeter Avalos 		    j += k;
1486b2605375SPeter Avalos 		    if (j > 80)
1487b2605375SPeter Avalos 		    {
1488b2605375SPeter Avalos 			output_newline();
1489b2605375SPeter Avalos 			j = k;
1490b2605375SPeter Avalos 		    }
1491b2605375SPeter Avalos 		    fprintf(output_file, "\"'");
1492b2605375SPeter Avalos 		    s = symnam[i];
1493b2605375SPeter Avalos 		    while (*++s != '\'')
1494b2605375SPeter Avalos 		    {
1495b2605375SPeter Avalos 			if (*s == '\\')
1496b2605375SPeter Avalos 			{
1497b2605375SPeter Avalos 			    fprintf(output_file, "\\\\");
1498b2605375SPeter Avalos 			    if (*++s == '\\')
1499b2605375SPeter Avalos 				fprintf(output_file, "\\\\");
1500b2605375SPeter Avalos 			    else
1501b2605375SPeter Avalos 				putc(*s, output_file);
1502b2605375SPeter Avalos 			}
1503b2605375SPeter Avalos 			else
1504b2605375SPeter Avalos 			    putc(*s, output_file);
1505b2605375SPeter Avalos 		    }
1506b2605375SPeter Avalos 		    fprintf(output_file, "'\",");
1507b2605375SPeter Avalos 		}
1508b2605375SPeter Avalos 	    }
1509b2605375SPeter Avalos 	    else
1510b2605375SPeter Avalos 	    {
1511b2605375SPeter Avalos 		k = (int)strlen(s) + 3;
1512b2605375SPeter Avalos 		j += k;
1513b2605375SPeter Avalos 		if (j > 80)
1514b2605375SPeter Avalos 		{
1515b2605375SPeter Avalos 		    output_newline();
1516b2605375SPeter Avalos 		    j = k;
1517b2605375SPeter Avalos 		}
1518b2605375SPeter Avalos 		putc('"', output_file);
1519b2605375SPeter Avalos 		do
1520b2605375SPeter Avalos 		{
1521b2605375SPeter Avalos 		    putc(*s, output_file);
1522b2605375SPeter Avalos 		}
1523b2605375SPeter Avalos 		while (*++s);
1524b2605375SPeter Avalos 		fprintf(output_file, "\",");
1525b2605375SPeter Avalos 	    }
1526b2605375SPeter Avalos 	}
1527b2605375SPeter Avalos 	else
1528b2605375SPeter Avalos 	{
1529b2605375SPeter Avalos 	    j += 2;
1530b2605375SPeter Avalos 	    if (j > 80)
1531b2605375SPeter Avalos 	    {
1532b2605375SPeter Avalos 		output_newline();
1533b2605375SPeter Avalos 		j = 2;
1534b2605375SPeter Avalos 	    }
1535b2605375SPeter Avalos 	    fprintf(output_file, "0,");
1536b2605375SPeter Avalos 	}
1537b2605375SPeter Avalos     }
1538b2605375SPeter Avalos     end_table();
1539b2605375SPeter Avalos     FREE(symnam);
1540b2605375SPeter Avalos 
1541c4d42299SSascha Wildner     if (token_table)
1542c4d42299SSascha Wildner 	output_line("#if YYDEBUG");
1543b2605375SPeter Avalos     start_str_table("rule");
1544b2605375SPeter Avalos     for (i = 2; i < nrules; ++i)
1545b2605375SPeter Avalos     {
1546b2605375SPeter Avalos 	fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]);
1547b2605375SPeter Avalos 	for (j = rrhs[i]; ritem[j] > 0; ++j)
1548b2605375SPeter Avalos 	{
1549b2605375SPeter Avalos 	    s = symbol_name[ritem[j]];
1550b2605375SPeter Avalos 	    if (s[0] == '"')
1551b2605375SPeter Avalos 	    {
1552b2605375SPeter Avalos 		fprintf(output_file, " \\\"");
1553b2605375SPeter Avalos 		while (*++s != '"')
1554b2605375SPeter Avalos 		{
1555b2605375SPeter Avalos 		    if (*s == '\\')
1556b2605375SPeter Avalos 		    {
1557b2605375SPeter Avalos 			if (s[1] == '\\')
1558b2605375SPeter Avalos 			    fprintf(output_file, "\\\\\\\\");
1559b2605375SPeter Avalos 			else
1560b2605375SPeter Avalos 			    fprintf(output_file, "\\\\%c", s[1]);
1561b2605375SPeter Avalos 			++s;
1562b2605375SPeter Avalos 		    }
1563b2605375SPeter Avalos 		    else
1564b2605375SPeter Avalos 			putc(*s, output_file);
1565b2605375SPeter Avalos 		}
1566b2605375SPeter Avalos 		fprintf(output_file, "\\\"");
1567b2605375SPeter Avalos 	    }
1568b2605375SPeter Avalos 	    else if (s[0] == '\'')
1569b2605375SPeter Avalos 	    {
1570b2605375SPeter Avalos 		if (s[1] == '"')
1571b2605375SPeter Avalos 		    fprintf(output_file, " '\\\"'");
1572b2605375SPeter Avalos 		else if (s[1] == '\\')
1573b2605375SPeter Avalos 		{
1574b2605375SPeter Avalos 		    if (s[2] == '\\')
1575b2605375SPeter Avalos 			fprintf(output_file, " '\\\\\\\\");
1576b2605375SPeter Avalos 		    else
1577b2605375SPeter Avalos 			fprintf(output_file, " '\\\\%c", s[2]);
1578b2605375SPeter Avalos 		    s += 2;
1579b2605375SPeter Avalos 		    while (*++s != '\'')
1580b2605375SPeter Avalos 			putc(*s, output_file);
1581b2605375SPeter Avalos 		    putc('\'', output_file);
1582b2605375SPeter Avalos 		}
1583b2605375SPeter Avalos 		else
1584b2605375SPeter Avalos 		    fprintf(output_file, " '%c'", s[1]);
1585b2605375SPeter Avalos 	    }
1586b2605375SPeter Avalos 	    else
1587b2605375SPeter Avalos 		fprintf(output_file, " %s", s);
1588b2605375SPeter Avalos 	}
1589b2605375SPeter Avalos 	fprintf(output_file, "\",");
1590b2605375SPeter Avalos 	output_newline();
1591b2605375SPeter Avalos     }
1592b2605375SPeter Avalos 
1593b2605375SPeter Avalos     end_table();
1594b2605375SPeter Avalos     output_line("#endif");
1595b2605375SPeter Avalos }
1596b2605375SPeter Avalos 
1597c4d42299SSascha Wildner #if defined(YYBTYACC)
1598c4d42299SSascha Wildner static void
output_backtracking_parser(FILE * fp)1599c4d42299SSascha Wildner output_backtracking_parser(FILE * fp)
1600c4d42299SSascha Wildner {
1601c4d42299SSascha Wildner     putl_code(fp, "#undef YYBTYACC\n");
1602c4d42299SSascha Wildner #if defined(YYBTYACC)
1603c4d42299SSascha Wildner     if (backtrack)
1604c4d42299SSascha Wildner     {
1605c4d42299SSascha Wildner 	putl_code(fp, "#define YYBTYACC 1\n");
1606c4d42299SSascha Wildner 	putl_code(fp,
1607c4d42299SSascha Wildner 		  "#define YYDEBUGSTR (yytrial ? YYPREFIX \"debug(trial)\" : YYPREFIX \"debug\")\n");
1608c4d42299SSascha Wildner     }
1609c4d42299SSascha Wildner     else
1610c4d42299SSascha Wildner #endif
1611c4d42299SSascha Wildner     {
1612c4d42299SSascha Wildner 	putl_code(fp, "#define YYBTYACC 0\n");
1613c4d42299SSascha Wildner 	putl_code(fp, "#define YYDEBUGSTR YYPREFIX \"debug\"\n");
1614c4d42299SSascha Wildner     }
1615c4d42299SSascha Wildner }
1616c4d42299SSascha Wildner #endif
1617c4d42299SSascha Wildner 
1618b2605375SPeter Avalos static void
output_pure_parser(FILE * fp)1619b2605375SPeter Avalos output_pure_parser(FILE * fp)
1620b2605375SPeter Avalos {
1621b2605375SPeter Avalos     putc_code(fp, '\n');
1622b2605375SPeter Avalos 
1623b2605375SPeter Avalos     if (fp == code_file)
1624c4d42299SSascha Wildner 	++outline;
1625b2605375SPeter Avalos     fprintf(fp, "#define YYPURE %d\n", pure_parser);
1626b2605375SPeter Avalos     putc_code(fp, '\n');
1627b2605375SPeter Avalos }
1628b2605375SPeter Avalos 
1629ca0c2f89SAntonio Huete Jimenez #if defined(YY_NO_LEAKS)
1630b2605375SPeter Avalos static void
output_no_leaks(FILE * fp)1631ca0c2f89SAntonio Huete Jimenez output_no_leaks(FILE * fp)
1632b2605375SPeter Avalos {
1633b2605375SPeter Avalos     putc_code(fp, '\n');
1634b2605375SPeter Avalos 
1635ca0c2f89SAntonio Huete Jimenez     if (fp == code_file)
1636ca0c2f89SAntonio Huete Jimenez 	++outline;
1637ca0c2f89SAntonio Huete Jimenez     fputs("#define YY_NO_LEAKS 1\n", fp);
1638c4d42299SSascha Wildner     putc_code(fp, '\n');
1639c4d42299SSascha Wildner }
1640c4d42299SSascha Wildner #endif
1641c4d42299SSascha Wildner 
1642b2605375SPeter Avalos static void
output_trailing_text(void)1643b2605375SPeter Avalos output_trailing_text(void)
1644b2605375SPeter Avalos {
1645b2605375SPeter Avalos     int c, last;
1646b2605375SPeter Avalos     FILE *in;
1647b2605375SPeter Avalos 
1648b2605375SPeter Avalos     if (line == 0)
1649b2605375SPeter Avalos 	return;
1650b2605375SPeter Avalos 
1651b2605375SPeter Avalos     in = input_file;
1652b2605375SPeter Avalos     c = *cptr;
1653b2605375SPeter Avalos     if (c == '\n')
1654b2605375SPeter Avalos     {
1655b2605375SPeter Avalos 	++lineno;
1656b2605375SPeter Avalos 	if ((c = getc(in)) == EOF)
1657b2605375SPeter Avalos 	    return;
1658b2605375SPeter Avalos 	write_input_lineno();
1659b2605375SPeter Avalos 	putc_code(code_file, c);
1660b2605375SPeter Avalos 	last = c;
1661b2605375SPeter Avalos     }
1662b2605375SPeter Avalos     else
1663b2605375SPeter Avalos     {
1664b2605375SPeter Avalos 	write_input_lineno();
1665b2605375SPeter Avalos 	do
1666b2605375SPeter Avalos 	{
1667b2605375SPeter Avalos 	    putc_code(code_file, c);
1668b2605375SPeter Avalos 	}
1669b2605375SPeter Avalos 	while ((c = *++cptr) != '\n');
1670b2605375SPeter Avalos 	putc_code(code_file, c);
1671b2605375SPeter Avalos 	last = '\n';
1672b2605375SPeter Avalos     }
1673b2605375SPeter Avalos 
1674b2605375SPeter Avalos     while ((c = getc(in)) != EOF)
1675b2605375SPeter Avalos     {
1676b2605375SPeter Avalos 	putc_code(code_file, c);
1677b2605375SPeter Avalos 	last = c;
1678b2605375SPeter Avalos     }
1679b2605375SPeter Avalos 
1680b2605375SPeter Avalos     if (last != '\n')
1681b2605375SPeter Avalos     {
1682b2605375SPeter Avalos 	putc_code(code_file, '\n');
1683b2605375SPeter Avalos     }
1684b2605375SPeter Avalos     write_code_lineno(code_file);
1685b2605375SPeter Avalos }
1686b2605375SPeter Avalos 
1687b2605375SPeter Avalos static void
output_semantic_actions(void)1688b2605375SPeter Avalos output_semantic_actions(void)
1689b2605375SPeter Avalos {
1690b2605375SPeter Avalos     int c, last;
1691*5152d3b1SAntonio Huete Jimenez     int state;
1692*5152d3b1SAntonio Huete Jimenez     char line_state[20];
1693b2605375SPeter Avalos 
1694b2605375SPeter Avalos     rewind(action_file);
1695b2605375SPeter Avalos     if ((c = getc(action_file)) == EOF)
1696b2605375SPeter Avalos 	return;
1697b2605375SPeter Avalos 
1698*5152d3b1SAntonio Huete Jimenez     if (!lflag)
1699*5152d3b1SAntonio Huete Jimenez     {
1700*5152d3b1SAntonio Huete Jimenez 	state = -1;
1701*5152d3b1SAntonio Huete Jimenez 	sprintf(line_state, line_format, 1, "");
1702*5152d3b1SAntonio Huete Jimenez     }
1703*5152d3b1SAntonio Huete Jimenez 
1704b2605375SPeter Avalos     last = c;
1705b2605375SPeter Avalos     putc_code(code_file, c);
1706b2605375SPeter Avalos     while ((c = getc(action_file)) != EOF)
1707b2605375SPeter Avalos     {
1708*5152d3b1SAntonio Huete Jimenez 	/*
1709*5152d3b1SAntonio Huete Jimenez 	 * When writing the action file, we did not know the line-numbers in
1710*5152d3b1SAntonio Huete Jimenez 	 * the code-file, but wrote empty #line directives.  Detect those and
1711*5152d3b1SAntonio Huete Jimenez 	 * replace with proper #line directives.
1712*5152d3b1SAntonio Huete Jimenez 	 */
1713*5152d3b1SAntonio Huete Jimenez 	if (!lflag && (last == '\n' || state >= 0))
1714*5152d3b1SAntonio Huete Jimenez 	{
1715*5152d3b1SAntonio Huete Jimenez 	    if (c == line_state[state + 1])
1716*5152d3b1SAntonio Huete Jimenez 	    {
1717*5152d3b1SAntonio Huete Jimenez 		++state;
1718*5152d3b1SAntonio Huete Jimenez 		if (line_state[state + 1] == '\0')
1719*5152d3b1SAntonio Huete Jimenez 		{
1720*5152d3b1SAntonio Huete Jimenez 		    write_code_lineno(code_file);
1721*5152d3b1SAntonio Huete Jimenez 		    state = -1;
1722*5152d3b1SAntonio Huete Jimenez 		}
1723*5152d3b1SAntonio Huete Jimenez 		last = c;
1724*5152d3b1SAntonio Huete Jimenez 		continue;
1725*5152d3b1SAntonio Huete Jimenez 	    }
1726*5152d3b1SAntonio Huete Jimenez 	    else
1727*5152d3b1SAntonio Huete Jimenez 	    {
1728*5152d3b1SAntonio Huete Jimenez 		int n;
1729*5152d3b1SAntonio Huete Jimenez 		for (n = 0; n <= state; ++n)
1730*5152d3b1SAntonio Huete Jimenez 		    putc_code(code_file, line_state[n]);
1731*5152d3b1SAntonio Huete Jimenez 		state = -1;
1732*5152d3b1SAntonio Huete Jimenez 	    }
1733*5152d3b1SAntonio Huete Jimenez 	}
1734b2605375SPeter Avalos 	putc_code(code_file, c);
1735b2605375SPeter Avalos 	last = c;
1736b2605375SPeter Avalos     }
1737b2605375SPeter Avalos 
1738b2605375SPeter Avalos     if (last != '\n')
1739b2605375SPeter Avalos     {
1740b2605375SPeter Avalos 	putc_code(code_file, '\n');
1741b2605375SPeter Avalos     }
1742b2605375SPeter Avalos 
1743b2605375SPeter Avalos     write_code_lineno(code_file);
1744b2605375SPeter Avalos }
1745b2605375SPeter Avalos 
1746b2605375SPeter Avalos static void
output_parse_decl(FILE * fp)1747b2605375SPeter Avalos output_parse_decl(FILE * fp)
1748b2605375SPeter Avalos {
1749c4d42299SSascha Wildner     putc_code(fp, '\n');
1750b2605375SPeter Avalos     putl_code(fp, "/* compatibility with bison */\n");
1751b2605375SPeter Avalos     putl_code(fp, "#ifdef YYPARSE_PARAM\n");
1752b2605375SPeter Avalos     putl_code(fp, "/* compatibility with FreeBSD */\n");
1753b2605375SPeter Avalos     putl_code(fp, "# ifdef YYPARSE_PARAM_TYPE\n");
1754b2605375SPeter Avalos     putl_code(fp,
1755b2605375SPeter Avalos 	      "#  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)\n");
1756b2605375SPeter Avalos     putl_code(fp, "# else\n");
1757b2605375SPeter Avalos     putl_code(fp, "#  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)\n");
1758b2605375SPeter Avalos     putl_code(fp, "# endif\n");
1759b2605375SPeter Avalos     putl_code(fp, "#else\n");
1760b2605375SPeter Avalos 
1761b2605375SPeter Avalos     puts_code(fp, "# define YYPARSE_DECL() yyparse(");
1762c4d42299SSascha Wildner     puts_param_types(fp, parse_param, 0);
1763b2605375SPeter Avalos     putl_code(fp, ")\n");
1764b2605375SPeter Avalos 
1765b2605375SPeter Avalos     putl_code(fp, "#endif\n");
1766b2605375SPeter Avalos }
1767b2605375SPeter Avalos 
1768b2605375SPeter Avalos static void
output_lex_decl(FILE * fp)1769b2605375SPeter Avalos output_lex_decl(FILE * fp)
1770b2605375SPeter Avalos {
1771c4d42299SSascha Wildner     putc_code(fp, '\n');
1772b2605375SPeter Avalos     putl_code(fp, "/* Parameters sent to lex. */\n");
1773b2605375SPeter Avalos     putl_code(fp, "#ifdef YYLEX_PARAM\n");
1774b2605375SPeter Avalos     if (pure_parser)
1775b2605375SPeter Avalos     {
1776b2605375SPeter Avalos 	putl_code(fp, "# ifdef YYLEX_PARAM_TYPE\n");
1777c4d42299SSascha Wildner #if defined(YYBTYACC)
1778c4d42299SSascha Wildner 	if (locations)
1779c4d42299SSascha Wildner 	{
1780c4d42299SSascha Wildner 	    putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1781c4d42299SSascha Wildner 		      " YYLTYPE *yylloc,"
1782c4d42299SSascha Wildner 		      " YYLEX_PARAM_TYPE YYLEX_PARAM)\n");
1783c4d42299SSascha Wildner 	}
1784c4d42299SSascha Wildner 	else
1785c4d42299SSascha Wildner #endif
1786c4d42299SSascha Wildner 	{
1787b2605375SPeter Avalos 	    putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1788b2605375SPeter Avalos 		      " YYLEX_PARAM_TYPE YYLEX_PARAM)\n");
1789c4d42299SSascha Wildner 	}
1790b2605375SPeter Avalos 	putl_code(fp, "# else\n");
1791c4d42299SSascha Wildner #if defined(YYBTYACC)
1792c4d42299SSascha Wildner 	if (locations)
1793c4d42299SSascha Wildner 	{
1794c4d42299SSascha Wildner 	    putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1795c4d42299SSascha Wildner 		      " YYLTYPE *yylloc,"
1796c4d42299SSascha Wildner 		      " void * YYLEX_PARAM)\n");
1797c4d42299SSascha Wildner 	}
1798c4d42299SSascha Wildner 	else
1799c4d42299SSascha Wildner #endif
1800c4d42299SSascha Wildner 	{
1801b2605375SPeter Avalos 	    putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1802b2605375SPeter Avalos 		      " void * YYLEX_PARAM)\n");
1803c4d42299SSascha Wildner 	}
1804b2605375SPeter Avalos 	putl_code(fp, "# endif\n");
1805c4d42299SSascha Wildner #if defined(YYBTYACC)
1806c4d42299SSascha Wildner 	if (locations)
1807c4d42299SSascha Wildner 	    putl_code(fp,
1808c4d42299SSascha Wildner 		      "# define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)\n");
1809c4d42299SSascha Wildner 	else
1810c4d42299SSascha Wildner #endif
1811b2605375SPeter Avalos 	    putl_code(fp, "# define YYLEX yylex(&yylval, YYLEX_PARAM)\n");
1812b2605375SPeter Avalos     }
1813b2605375SPeter Avalos     else
1814b2605375SPeter Avalos     {
1815b2605375SPeter Avalos 	putl_code(fp, "# define YYLEX_DECL() yylex(void *YYLEX_PARAM)\n");
1816b2605375SPeter Avalos 	putl_code(fp, "# define YYLEX yylex(YYLEX_PARAM)\n");
1817b2605375SPeter Avalos     }
1818b2605375SPeter Avalos     putl_code(fp, "#else\n");
1819b2605375SPeter Avalos     if (pure_parser && lex_param)
1820b2605375SPeter Avalos     {
1821c4d42299SSascha Wildner #if defined(YYBTYACC)
1822c4d42299SSascha Wildner 	if (locations)
1823c4d42299SSascha Wildner 	    puts_code(fp,
1824c4d42299SSascha Wildner 		      "# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLTYPE *yylloc, ");
1825c4d42299SSascha Wildner 	else
1826c4d42299SSascha Wildner #endif
1827b2605375SPeter Avalos 	    puts_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval, ");
1828c4d42299SSascha Wildner 	puts_param_types(fp, lex_param, 0);
1829b2605375SPeter Avalos 	putl_code(fp, ")\n");
1830b2605375SPeter Avalos 
1831c4d42299SSascha Wildner #if defined(YYBTYACC)
1832c4d42299SSascha Wildner 	if (locations)
1833c4d42299SSascha Wildner 	    puts_code(fp, "# define YYLEX yylex(&yylval, &yylloc, ");
1834c4d42299SSascha Wildner 	else
1835c4d42299SSascha Wildner #endif
1836b2605375SPeter Avalos 	    puts_code(fp, "# define YYLEX yylex(&yylval, ");
1837c4d42299SSascha Wildner 	puts_param_names(fp, lex_param, 0);
1838b2605375SPeter Avalos 	putl_code(fp, ")\n");
1839b2605375SPeter Avalos     }
1840b2605375SPeter Avalos     else if (pure_parser)
1841b2605375SPeter Avalos     {
1842c4d42299SSascha Wildner #if defined(YYBTYACC)
1843c4d42299SSascha Wildner 	if (locations)
1844c4d42299SSascha Wildner 	{
1845c4d42299SSascha Wildner 	    putl_code(fp,
1846c4d42299SSascha Wildner 		      "# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLTYPE *yylloc)\n");
1847c4d42299SSascha Wildner 	    putl_code(fp, "# define YYLEX yylex(&yylval, &yylloc)\n");
1848c4d42299SSascha Wildner 	}
1849c4d42299SSascha Wildner 	else
1850c4d42299SSascha Wildner #endif
1851c4d42299SSascha Wildner 	{
1852b2605375SPeter Avalos 	    putl_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval)\n");
1853b2605375SPeter Avalos 	    putl_code(fp, "# define YYLEX yylex(&yylval)\n");
1854b2605375SPeter Avalos 	}
1855c4d42299SSascha Wildner     }
1856b2605375SPeter Avalos     else if (lex_param)
1857b2605375SPeter Avalos     {
1858b2605375SPeter Avalos 	puts_code(fp, "# define YYLEX_DECL() yylex(");
1859c4d42299SSascha Wildner 	puts_param_types(fp, lex_param, 0);
1860b2605375SPeter Avalos 	putl_code(fp, ")\n");
1861b2605375SPeter Avalos 
1862b2605375SPeter Avalos 	puts_code(fp, "# define YYLEX yylex(");
1863c4d42299SSascha Wildner 	puts_param_names(fp, lex_param, 0);
1864b2605375SPeter Avalos 	putl_code(fp, ")\n");
1865b2605375SPeter Avalos     }
1866b2605375SPeter Avalos     else
1867b2605375SPeter Avalos     {
1868b2605375SPeter Avalos 	putl_code(fp, "# define YYLEX_DECL() yylex(void)\n");
1869b2605375SPeter Avalos 	putl_code(fp, "# define YYLEX yylex()\n");
1870b2605375SPeter Avalos     }
1871b2605375SPeter Avalos     putl_code(fp, "#endif\n");
1872faa6539eSSascha Wildner 
1873faa6539eSSascha Wildner     /*
1874faa6539eSSascha Wildner      * Provide a prototype for yylex for the simplest case.  This is done for
1875faa6539eSSascha Wildner      * better compatibility with older yacc's, but can be a problem if someone
1876faa6539eSSascha Wildner      * uses "static int yylex(void);"
1877faa6539eSSascha Wildner      */
1878faa6539eSSascha Wildner     if (!pure_parser
1879faa6539eSSascha Wildner #if defined(YYBTYACC)
1880faa6539eSSascha Wildner 	&& !backtrack
1881faa6539eSSascha Wildner #endif
1882faa6539eSSascha Wildner 	&& !strcmp(symbol_prefix, "yy"))
1883faa6539eSSascha Wildner     {
1884faa6539eSSascha Wildner 	putl_code(fp, "\n");
1885faa6539eSSascha Wildner 	putl_code(fp, "#if !(defined(yylex) || defined(YYSTATE))\n");
1886faa6539eSSascha Wildner 	putl_code(fp, "int YYLEX_DECL();\n");
1887faa6539eSSascha Wildner 	putl_code(fp, "#endif\n");
1888faa6539eSSascha Wildner     }
1889b2605375SPeter Avalos }
1890b2605375SPeter Avalos 
1891b2605375SPeter Avalos static void
output_error_decl(FILE * fp)1892b2605375SPeter Avalos output_error_decl(FILE * fp)
1893b2605375SPeter Avalos {
1894c4d42299SSascha Wildner     putc_code(fp, '\n');
1895b2605375SPeter Avalos     putl_code(fp, "/* Parameters sent to yyerror. */\n");
1896b2605375SPeter Avalos     putl_code(fp, "#ifndef YYERROR_DECL\n");
1897c4d42299SSascha Wildner     puts_code(fp, "#define YYERROR_DECL() yyerror(");
1898c4d42299SSascha Wildner #if defined(YYBTYACC)
1899c4d42299SSascha Wildner     if (locations)
1900ca0c2f89SAntonio Huete Jimenez 	puts_code(fp, "YYLTYPE *loc, ");
1901c4d42299SSascha Wildner #endif
1902c4d42299SSascha Wildner     puts_param_types(fp, parse_param, 1);
1903b2605375SPeter Avalos     putl_code(fp, "const char *s)\n");
1904b2605375SPeter Avalos     putl_code(fp, "#endif\n");
1905b2605375SPeter Avalos 
1906b2605375SPeter Avalos     putl_code(fp, "#ifndef YYERROR_CALL\n");
1907c4d42299SSascha Wildner 
1908b2605375SPeter Avalos     puts_code(fp, "#define YYERROR_CALL(msg) yyerror(");
1909c4d42299SSascha Wildner #if defined(YYBTYACC)
1910c4d42299SSascha Wildner     if (locations)
1911ca0c2f89SAntonio Huete Jimenez 	puts_code(fp, "&yylloc, ");
1912c4d42299SSascha Wildner #endif
1913c4d42299SSascha Wildner     puts_param_names(fp, parse_param, 1);
1914b2605375SPeter Avalos     putl_code(fp, "msg)\n");
1915c4d42299SSascha Wildner 
1916b2605375SPeter Avalos     putl_code(fp, "#endif\n");
1917b2605375SPeter Avalos }
1918c4d42299SSascha Wildner 
1919c4d42299SSascha Wildner #if defined(YYBTYACC)
1920c4d42299SSascha Wildner static void
output_yydestruct_decl(FILE * fp)1921c4d42299SSascha Wildner output_yydestruct_decl(FILE * fp)
1922b2605375SPeter Avalos {
1923c4d42299SSascha Wildner     putc_code(fp, '\n');
1924c4d42299SSascha Wildner     putl_code(fp, "#ifndef YYDESTRUCT_DECL\n");
1925c4d42299SSascha Wildner 
1926c4d42299SSascha Wildner     puts_code(fp,
1927c4d42299SSascha Wildner 	      "#define YYDESTRUCT_DECL() "
1928c4d42299SSascha Wildner 	      "yydestruct(const char *msg, int psymb, YYSTYPE *val");
1929c4d42299SSascha Wildner #if defined(YYBTYACC)
1930c4d42299SSascha Wildner     if (locations)
1931c4d42299SSascha Wildner 	puts_code(fp, ", YYLTYPE *loc");
1932c4d42299SSascha Wildner #endif
1933c4d42299SSascha Wildner     if (parse_param)
1934c4d42299SSascha Wildner     {
1935c4d42299SSascha Wildner 	puts_code(fp, ", ");
1936c4d42299SSascha Wildner 	puts_param_types(fp, parse_param, 0);
1937c4d42299SSascha Wildner     }
1938c4d42299SSascha Wildner     putl_code(fp, ")\n");
1939c4d42299SSascha Wildner 
1940b2605375SPeter Avalos     putl_code(fp, "#endif\n");
1941c4d42299SSascha Wildner 
1942c4d42299SSascha Wildner     putl_code(fp, "#ifndef YYDESTRUCT_CALL\n");
1943c4d42299SSascha Wildner 
1944c4d42299SSascha Wildner     puts_code(fp, "#define YYDESTRUCT_CALL(msg, psymb, val");
1945c4d42299SSascha Wildner #if defined(YYBTYACC)
1946c4d42299SSascha Wildner     if (locations)
1947c4d42299SSascha Wildner 	puts_code(fp, ", loc");
1948c4d42299SSascha Wildner #endif
1949c4d42299SSascha Wildner     puts_code(fp, ") yydestruct(msg, psymb, val");
1950c4d42299SSascha Wildner #if defined(YYBTYACC)
1951c4d42299SSascha Wildner     if (locations)
1952c4d42299SSascha Wildner 	puts_code(fp, ", loc");
1953c4d42299SSascha Wildner #endif
1954c4d42299SSascha Wildner     if (parse_param)
1955c4d42299SSascha Wildner     {
1956c4d42299SSascha Wildner 	puts_code(fp, ", ");
1957c4d42299SSascha Wildner 	puts_param_names(fp, parse_param, 0);
1958c4d42299SSascha Wildner     }
1959c4d42299SSascha Wildner     putl_code(fp, ")\n");
1960c4d42299SSascha Wildner 
1961b2605375SPeter Avalos     putl_code(fp, "#endif\n");
1962b2605375SPeter Avalos }
1963c4d42299SSascha Wildner 
1964c4d42299SSascha Wildner static void
output_initial_action(void)1965ca0c2f89SAntonio Huete Jimenez output_initial_action(void)
1966ca0c2f89SAntonio Huete Jimenez {
1967ca0c2f89SAntonio Huete Jimenez     if (initial_action)
1968ca0c2f89SAntonio Huete Jimenez 	fprintf(code_file, "%s\n", initial_action);
1969ca0c2f89SAntonio Huete Jimenez }
1970ca0c2f89SAntonio Huete Jimenez 
1971ca0c2f89SAntonio Huete Jimenez static void
output_yydestruct_impl(void)1972c4d42299SSascha Wildner output_yydestruct_impl(void)
1973c4d42299SSascha Wildner {
1974c4d42299SSascha Wildner     int i;
1975c4d42299SSascha Wildner     char *s, *destructor_code;
1976c4d42299SSascha Wildner 
1977c4d42299SSascha Wildner     putc_code(code_file, '\n');
1978c4d42299SSascha Wildner     putl_code(code_file, "/* Release memory associated with symbol. */\n");
1979c4d42299SSascha Wildner     putl_code(code_file, "#if ! defined YYDESTRUCT_IS_DECLARED\n");
1980c4d42299SSascha Wildner     putl_code(code_file, "static void\n");
1981c4d42299SSascha Wildner     putl_code(code_file, "YYDESTRUCT_DECL()\n");
1982c4d42299SSascha Wildner     putl_code(code_file, "{\n");
1983c4d42299SSascha Wildner     putl_code(code_file, "    switch (psymb)\n");
1984c4d42299SSascha Wildner     putl_code(code_file, "    {\n");
1985c4d42299SSascha Wildner     for (i = 2; i < nsyms; ++i)
1986c4d42299SSascha Wildner     {
1987c4d42299SSascha Wildner 	if ((destructor_code = symbol_destructor[i]) != NULL)
1988c4d42299SSascha Wildner 	{
1989c4d42299SSascha Wildner 	    ++outline;
1990c4d42299SSascha Wildner 	    fprintf(code_file, "\tcase %d:\n", symbol_pval[i]);
1991c4d42299SSascha Wildner 	    /* comprehend the number of lines in the destructor code */
1992c4d42299SSascha Wildner 	    for (s = destructor_code; (s = strchr(s, '\n')) != NULL; s++)
1993c4d42299SSascha Wildner 		++outline;
1994c4d42299SSascha Wildner 	    puts_code(code_file, destructor_code);
1995c4d42299SSascha Wildner 	    putc_code(code_file, '\n');
1996c4d42299SSascha Wildner 	    write_code_lineno(code_file);
1997*5152d3b1SAntonio Huete Jimenez 	    putl_code(code_file, "\tbreak;\n");
1998c4d42299SSascha Wildner 	    FREE(destructor_code);
1999b2605375SPeter Avalos 	}
2000c4d42299SSascha Wildner     }
2001c4d42299SSascha Wildner     putl_code(code_file, "    }\n");
2002c4d42299SSascha Wildner     putl_code(code_file, "}\n");
2003c4d42299SSascha Wildner     putl_code(code_file, "#define YYDESTRUCT_IS_DECLARED 1\n");
2004c4d42299SSascha Wildner     putl_code(code_file, "#endif\n");
2005c4d42299SSascha Wildner 
2006c4d42299SSascha Wildner     DO_FREE(symbol_destructor);
2007c4d42299SSascha Wildner }
2008c4d42299SSascha Wildner #endif
2009b2605375SPeter Avalos 
2010b2605375SPeter Avalos static void
free_itemsets(void)2011b2605375SPeter Avalos free_itemsets(void)
2012b2605375SPeter Avalos {
2013b2605375SPeter Avalos     core *cp, *next;
2014b2605375SPeter Avalos 
2015b2605375SPeter Avalos     FREE(state_table);
2016b2605375SPeter Avalos     for (cp = first_state; cp; cp = next)
2017b2605375SPeter Avalos     {
2018b2605375SPeter Avalos 	next = cp->next;
2019b2605375SPeter Avalos 	FREE(cp);
2020b2605375SPeter Avalos     }
2021b2605375SPeter Avalos }
2022b2605375SPeter Avalos 
2023b2605375SPeter Avalos static void
free_shifts(void)2024b2605375SPeter Avalos free_shifts(void)
2025b2605375SPeter Avalos {
2026b2605375SPeter Avalos     shifts *sp, *next;
2027b2605375SPeter Avalos 
2028b2605375SPeter Avalos     FREE(shift_table);
2029b2605375SPeter Avalos     for (sp = first_shift; sp; sp = next)
2030b2605375SPeter Avalos     {
2031b2605375SPeter Avalos 	next = sp->next;
2032b2605375SPeter Avalos 	FREE(sp);
2033b2605375SPeter Avalos     }
2034b2605375SPeter Avalos }
2035b2605375SPeter Avalos 
2036b2605375SPeter Avalos static void
free_reductions(void)2037b2605375SPeter Avalos free_reductions(void)
2038b2605375SPeter Avalos {
2039b2605375SPeter Avalos     reductions *rp, *next;
2040b2605375SPeter Avalos 
2041b2605375SPeter Avalos     FREE(reduction_table);
2042b2605375SPeter Avalos     for (rp = first_reduction; rp; rp = next)
2043b2605375SPeter Avalos     {
2044b2605375SPeter Avalos 	next = rp->next;
2045b2605375SPeter Avalos 	FREE(rp);
2046b2605375SPeter Avalos     }
2047b2605375SPeter Avalos }
2048b2605375SPeter Avalos 
2049b2605375SPeter Avalos static void
output_externs(FILE * fp,const char * const section[])2050b2605375SPeter Avalos output_externs(FILE * fp, const char *const section[])
2051b2605375SPeter Avalos {
2052b2605375SPeter Avalos     int i;
2053b2605375SPeter Avalos     const char *s;
2054b2605375SPeter Avalos 
2055b2605375SPeter Avalos     for (i = 0; (s = section[i]) != 0; ++i)
2056b2605375SPeter Avalos     {
2057c4d42299SSascha Wildner 	/* prefix non-blank lines that don't start with
2058c4d42299SSascha Wildner 	   C pre-processor directives with 'extern ' */
2059c4d42299SSascha Wildner 	if (*s && (*s != '#'))
2060b2605375SPeter Avalos 	    fputs("extern\t", fp);
2061b2605375SPeter Avalos 	if (fp == code_file)
2062b2605375SPeter Avalos 	    ++outline;
2063c4d42299SSascha Wildner 	fprintf(fp, "%s\n", s);
2064b2605375SPeter Avalos     }
2065b2605375SPeter Avalos }
2066b2605375SPeter Avalos 
2067b2605375SPeter Avalos void
output(void)2068b2605375SPeter Avalos output(void)
2069b2605375SPeter Avalos {
2070b2605375SPeter Avalos     FILE *fp;
2071b2605375SPeter Avalos 
2072b2605375SPeter Avalos     free_itemsets();
2073b2605375SPeter Avalos     free_shifts();
2074b2605375SPeter Avalos     free_reductions();
2075b2605375SPeter Avalos 
2076faa6539eSSascha Wildner     output_code_lines(code_file, CODE_TOP);
2077c4d42299SSascha Wildner #if defined(YYBTYACC)
2078c4d42299SSascha Wildner     output_backtracking_parser(output_file);
2079c4d42299SSascha Wildner     if (rflag)
2080c4d42299SSascha Wildner 	output_backtracking_parser(code_file);
2081c4d42299SSascha Wildner #endif
2082c4d42299SSascha Wildner 
2083b2605375SPeter Avalos     if (iflag)
2084b2605375SPeter Avalos     {
2085c4d42299SSascha Wildner 	write_code_lineno(code_file);
2086b2605375SPeter Avalos 	++outline;
2087b2605375SPeter Avalos 	fprintf(code_file, "#include \"%s\"\n", externs_file_name);
2088b2605375SPeter Avalos 	fp = externs_file;
2089b2605375SPeter Avalos     }
2090b2605375SPeter Avalos     else
2091b2605375SPeter Avalos 	fp = code_file;
2092b2605375SPeter Avalos 
2093c4d42299SSascha Wildner     output_prefix(fp);
2094b2605375SPeter Avalos     output_pure_parser(fp);
2095ca0c2f89SAntonio Huete Jimenez #if defined(YY_NO_LEAKS)
2096ca0c2f89SAntonio Huete Jimenez     output_no_leaks(fp);
2097ca0c2f89SAntonio Huete Jimenez #endif
2098b2605375SPeter Avalos     output_stored_text(fp);
2099b2605375SPeter Avalos     output_stype(fp);
2100c4d42299SSascha Wildner #if defined(YYBTYACC)
2101c4d42299SSascha Wildner     if (locations)
2102c4d42299SSascha Wildner 	output_ltype(fp);
2103c4d42299SSascha Wildner #endif
2104b2605375SPeter Avalos     output_parse_decl(fp);
2105b2605375SPeter Avalos     output_lex_decl(fp);
2106b2605375SPeter Avalos     output_error_decl(fp);
2107c4d42299SSascha Wildner #if defined(YYBTYACC)
2108c4d42299SSascha Wildner     if (destructor)
2109c4d42299SSascha Wildner 	output_yydestruct_decl(fp);
2110c4d42299SSascha Wildner #endif
2111c4d42299SSascha Wildner     if (iflag || !rflag)
2112c4d42299SSascha Wildner     {
2113b2605375SPeter Avalos 	write_section(fp, xdecls);
2114c4d42299SSascha Wildner     }
2115b2605375SPeter Avalos 
2116b2605375SPeter Avalos     if (iflag)
2117b2605375SPeter Avalos     {
2118faa6539eSSascha Wildner 	fprintf(externs_file, "\n");
2119faa6539eSSascha Wildner 	output_yydebug(externs_file);
2120b2605375SPeter Avalos 	output_externs(externs_file, global_vars);
2121b2605375SPeter Avalos 	if (!pure_parser)
2122b2605375SPeter Avalos 	    output_externs(externs_file, impure_vars);
2123c4d42299SSascha Wildner 	if (dflag)
2124c4d42299SSascha Wildner 	{
2125b2605375SPeter Avalos 	    ++outline;
2126b2605375SPeter Avalos 	    fprintf(code_file, "#include \"%s\"\n", defines_file_name);
2127c4d42299SSascha Wildner 	}
2128c4d42299SSascha Wildner 	else
2129b2605375SPeter Avalos 	    output_defines(externs_file);
2130b2605375SPeter Avalos     }
2131b2605375SPeter Avalos     else
2132b2605375SPeter Avalos     {
2133b2605375SPeter Avalos 	putc_code(code_file, '\n');
2134b2605375SPeter Avalos 	output_defines(code_file);
2135b2605375SPeter Avalos     }
2136b2605375SPeter Avalos 
2137b2605375SPeter Avalos     if (dflag)
2138c4d42299SSascha Wildner     {
2139c4d42299SSascha Wildner 	start_defines_file();
2140b2605375SPeter Avalos 	output_defines(defines_file);
2141c4d42299SSascha Wildner 	end_defines_file();
2142c4d42299SSascha Wildner     }
2143b2605375SPeter Avalos 
2144b2605375SPeter Avalos     output_rule_data();
2145b2605375SPeter Avalos     output_yydefred();
2146c4d42299SSascha Wildner #if defined(YYBTYACC)
2147c4d42299SSascha Wildner     output_accessing_symbols();
2148c4d42299SSascha Wildner #endif
2149b2605375SPeter Avalos     output_actions();
2150b2605375SPeter Avalos     free_parser();
2151b2605375SPeter Avalos     output_debug();
2152faa6539eSSascha Wildner 
2153b2605375SPeter Avalos     if (rflag)
2154b2605375SPeter Avalos     {
2155b2605375SPeter Avalos 	write_section(code_file, xdecls);
2156c4d42299SSascha Wildner 	output_YYINT_typedef(code_file);
2157b2605375SPeter Avalos 	write_section(code_file, tables);
2158b2605375SPeter Avalos     }
2159faa6539eSSascha Wildner 
2160b2605375SPeter Avalos     write_section(code_file, global_vars);
2161b2605375SPeter Avalos     if (!pure_parser)
2162b2605375SPeter Avalos     {
2163b2605375SPeter Avalos 	write_section(code_file, impure_vars);
2164b2605375SPeter Avalos     }
2165faa6539eSSascha Wildner     output_code_lines(code_file, CODE_REQUIRES);
2166faa6539eSSascha Wildner 
2167b2605375SPeter Avalos     write_section(code_file, hdr_defs);
2168b2605375SPeter Avalos     if (!pure_parser)
2169b2605375SPeter Avalos     {
2170b2605375SPeter Avalos 	write_section(code_file, hdr_vars);
2171b2605375SPeter Avalos     }
2172faa6539eSSascha Wildner 
2173faa6539eSSascha Wildner     output_code_lines(code_file, CODE_PROVIDES);
2174faa6539eSSascha Wildner     output_code_lines(code_file, CODE_HEADER);
2175faa6539eSSascha Wildner 
2176b2605375SPeter Avalos     output_trailing_text();
2177c4d42299SSascha Wildner #if defined(YYBTYACC)
2178c4d42299SSascha Wildner     if (destructor)
2179c4d42299SSascha Wildner 	output_yydestruct_impl();
2180c4d42299SSascha Wildner #endif
2181b2605375SPeter Avalos     write_section(code_file, body_1);
2182b2605375SPeter Avalos     if (pure_parser)
2183b2605375SPeter Avalos     {
2184b2605375SPeter Avalos 	write_section(code_file, body_vars);
2185b2605375SPeter Avalos     }
2186b2605375SPeter Avalos     write_section(code_file, body_2);
2187ca0c2f89SAntonio Huete Jimenez     if (pure_parser)
2188ca0c2f89SAntonio Huete Jimenez     {
2189ca0c2f89SAntonio Huete Jimenez 	write_section(code_file, init_vars);
2190ca0c2f89SAntonio Huete Jimenez     }
2191ca0c2f89SAntonio Huete Jimenez #if defined(YYBTYACC)
2192ca0c2f89SAntonio Huete Jimenez     if (initial_action)
2193ca0c2f89SAntonio Huete Jimenez 	output_initial_action();
2194ca0c2f89SAntonio Huete Jimenez #endif
2195ca0c2f89SAntonio Huete Jimenez     write_section(code_file, body_3);
2196b2605375SPeter Avalos     output_semantic_actions();
2197b2605375SPeter Avalos     write_section(code_file, trailer);
2198b2605375SPeter Avalos }
2199b2605375SPeter Avalos 
2200b2605375SPeter Avalos #ifdef NO_LEAKS
2201b2605375SPeter Avalos void
output_leaks(void)2202b2605375SPeter Avalos output_leaks(void)
2203b2605375SPeter Avalos {
2204b2605375SPeter Avalos     DO_FREE(tally);
2205b2605375SPeter Avalos     DO_FREE(width);
2206b2605375SPeter Avalos     DO_FREE(order);
2207b2605375SPeter Avalos }
2208b2605375SPeter Avalos #endif
2209