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