]> git.saurik.com Git - bison.git/blame - src/output.c
(po-check): Scan .l and .y files instead
[bison.git] / src / output.c
CommitLineData
c3e23647 1/* Output the generated parsing program for bison,
5bb18f9a 2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
255ef638 3 Free Software Foundation, Inc.
c3e23647 4
9ee3c97b 5 This file is part of Bison, the GNU Compiler Compiler.
c3e23647 6
9ee3c97b
AD
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
c3e23647 11
9ee3c97b
AD
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
c3e23647 16
9ee3c97b
AD
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
c3e23647
RS
21
22
c3e23647 23#include "system.h"
14d3eb9b 24#include "quotearg.h"
be2a1a68 25#include "error.h"
573312ac 26#include "subpipe.h"
ceed8467 27#include "getargs.h"
c3e23647
RS
28#include "files.h"
29#include "gram.h"
a0f6b076 30#include "complain.h"
6c89f1c1 31#include "output.h"
a70083a3 32#include "reader.h"
ad949da9 33#include "symtab.h"
c6f1a33c 34#include "tables.h"
11d82f03 35#include "muscle_tab.h"
be2a1a68 36
be2a1a68 37/* From src/scan-skel.l. */
573312ac 38void scan_skel (FILE *);
d019d655 39
12b0043a 40
f87685c3 41static struct obstack format_obstack;
c3e23647 42
c7925b99
MA
43int error_verbose = 0;
44
f0440388 45
133c20e2 46
5372019f
AD
47/*-------------------------------------------------------------------.
48| Create a function NAME which associates to the muscle NAME the |
49| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
50| TYPE), and to the muscle NAME_max, the max value of the |
51| TABLE_DATA. |
52`-------------------------------------------------------------------*/
62a3e4f0 53
62a3e4f0 54
5372019f 55#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
5fbb0954 56 \
5372019f
AD
57static void \
58Name (const char *name, \
5fbb0954
AD
59 Type *table_data, \
60 Type first, \
61 int begin, \
62 int end) \
63{ \
12b0043a 64 Type min = first; \
0c2d3f4c 65 Type max = first; \
5fbb0954
AD
66 int i; \
67 int j = 1; \
68 \
5372019f 69 obstack_fgrow1 (&format_obstack, "%6d", first); \
5fbb0954
AD
70 for (i = begin; i < end; ++i) \
71 { \
5372019f 72 obstack_1grow (&format_obstack, ','); \
5fbb0954
AD
73 if (j >= 10) \
74 { \
5372019f 75 obstack_sgrow (&format_obstack, "\n "); \
5fbb0954
AD
76 j = 1; \
77 } \
78 else \
79 ++j; \
5372019f 80 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
12b0043a
AD
81 if (table_data[i] < min) \
82 min = table_data[i]; \
83 if (max < table_data[i]) \
5fbb0954
AD
84 max = table_data[i]; \
85 } \
5372019f
AD
86 obstack_1grow (&format_obstack, 0); \
87 muscle_insert (name, obstack_finish (&format_obstack)); \
5fbb0954 88 \
12b0043a
AD
89 /* Build `NAME_min' and `NAME_max' in the obstack. */ \
90 obstack_fgrow1 (&format_obstack, "%s_min", name); \
91 obstack_1grow (&format_obstack, 0); \
92 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
93 (long int) min); \
5372019f
AD
94 obstack_fgrow1 (&format_obstack, "%s_max", name); \
95 obstack_1grow (&format_obstack, 0); \
0c2d3f4c
AD
96 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
97 (long int) max); \
62a3e4f0
AD
98}
99
5372019f 100GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
12b0043a 101GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int)
5372019f 102GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
12b0043a
AD
103GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_t)
104GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number_t)
a49aecd5 105GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number_t)
5372019f 106GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
d57650a5 107GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
c3e23647
RS
108
109
3813e141
PE
110/*----------------------------------------------------------------------.
111| Print to OUT a representation of FILENAME escaped both for C and M4. |
112`----------------------------------------------------------------------*/
113
114static void
115escaped_file_name_output (FILE *out, char const *filename)
116{
117 char const *p;
118 fprintf (out, "[[");
119
120 for (p = quotearg_style (c_quoting_style, filename); *p; p++)
121 switch (*p)
122 {
123 case '$': fputs ("$][", out); break;
124 case '@': fputs ("@@", out); break;
125 case '[': fputs ("@{", out); break;
126 case ']': fputs ("@}", out); break;
127 default: fputc (*p, out); break;
128 }
129
130 fprintf (out, "]]");
131}
132
133
39912f52
AD
134/*------------------------------------------------------------------.
135| Prepare the muscles related to the symbols: translate, tname, and |
136| toknum. |
137`------------------------------------------------------------------*/
b0940840 138
4a120d45 139static void
39912f52 140prepare_symbols (void)
c3e23647 141{
39912f52
AD
142 MUSCLE_INSERT_INT ("tokens_number", ntokens);
143 MUSCLE_INSERT_INT ("nterms_number", nvars);
144 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
145 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
146
a49aecd5 147 muscle_insert_symbol_number_table ("translate",
fc5734fe
AD
148 token_translations,
149 token_translations[0],
150 1, max_user_token_number + 1);
c3e23647 151
39912f52 152 /* tname -- token names. */
b0940840
AD
153 {
154 int i;
155 int j = 0;
156 for (i = 0; i < nsyms; i++)
157 {
6b98e4b5
AD
158 /* Be sure not to use twice the same QUOTEARG slot:
159 SYMBOL_TAG_GET uses slot 0. */
b0940840
AD
160 const char *cp =
161 quotearg_n_style (1, c_quoting_style,
97650f4e 162 symbols[i]->tag);
01cfa697 163 /* Width of the next token, including the two quotes, the comma
b0940840
AD
164 and the space. */
165 int strsize = strlen (cp) + 2;
166
167 if (j + strsize > 75)
168 {
169 obstack_sgrow (&format_obstack, "\n ");
170 j = 2;
171 }
172
3813e141 173 MUSCLE_OBSTACK_SGROW (&format_obstack, cp);
b0940840
AD
174 obstack_sgrow (&format_obstack, ", ");
175 j += strsize;
176 }
177 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
178 defined). */
179 obstack_sgrow (&format_obstack, "0");
c3e23647 180
b0940840
AD
181 /* Finish table and store. */
182 obstack_1grow (&format_obstack, 0);
183 muscle_insert ("tname", obstack_finish (&format_obstack));
184 }
185
12b0043a 186 /* Output YYTOKNUM. */
b2ed6e58
AD
187 {
188 int i;
3650b4b8
AD
189 int *values = XCALLOC (int, ntokens);
190 for (i = 0; i < ntokens; ++i)
b0940840 191 values[i] = symbols[i]->user_token_number;
12b0043a 192 muscle_insert_int_table ("toknum", values,
3650b4b8 193 values[0], 1, ntokens);
b0940840 194 free (values);
b2ed6e58 195 }
b0940840 196}
b2ed6e58 197
b0940840
AD
198
199/*-------------------------------------------------------------.
200| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
95612cfa 201| rline, dprec, merger. |
b0940840
AD
202`-------------------------------------------------------------*/
203
204static void
205prepare_rules (void)
206{
9222837b 207 rule_number_t r;
5df5f6d5 208 unsigned int i = 0;
62a3e4f0 209 item_number_t *rhs = XMALLOC (item_number_t, nritems);
4b3d3a8e
AD
210 unsigned int *prhs = XMALLOC (unsigned int, nrules);
211 unsigned int *rline = XMALLOC (unsigned int, nrules);
212 symbol_number_t *r1 = XMALLOC (symbol_number_t, nrules);
213 unsigned int *r2 = XMALLOC (unsigned int, nrules);
214 short *dprec = XMALLOC (short, nrules);
215 short *merger = XMALLOC (short, nrules);
216
217 for (r = 0; r < nrules; ++r)
b0940840 218 {
9222837b 219 item_number_t *rhsp = NULL;
b0940840
AD
220 /* Index of rule R in RHS. */
221 prhs[r] = i;
222 /* RHS of the rule R. */
223 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
224 rhs[i++] = *rhsp;
225 /* LHS of the rule R. */
226 r1[r] = rules[r].lhs->number;
227 /* Length of rule R's RHS. */
228 r2[r] = i - prhs[r];
229 /* Separator in RHS. */
230 rhs[i++] = -1;
231 /* Line where rule was defined. */
8efe435c 232 rline[r] = rules[r].location.first_line;
95612cfa 233 /* Dynamic precedence (GLR). */
676385e2 234 dprec[r] = rules[r].dprec;
95612cfa 235 /* Merger-function index (GLR). */
676385e2 236 merger[r] = rules[r].merger;
b0940840
AD
237 }
238 assert (i == nritems);
239
5372019f 240 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
4b3d3a8e
AD
241 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules);
242 muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules);
243 muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules);
244 muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules);
245 muscle_insert_short_table ("dprec", dprec, 0, 0, nrules);
246 muscle_insert_short_table ("merger", merger, 0, 0, nrules);
796d61fb 247
39912f52
AD
248 MUSCLE_INSERT_INT ("rules_number", nrules);
249
b0940840
AD
250 free (rhs);
251 free (prhs);
5df5f6d5
AD
252 free (rline);
253 free (r1);
b0940840 254 free (r2);
676385e2
PH
255 free (dprec);
256 free (merger);
c3e23647
RS
257}
258
b0940840
AD
259/*--------------------------------------------.
260| Prepare the muscles related to the states. |
261`--------------------------------------------*/
c3e23647 262
4a120d45 263static void
b0940840 264prepare_states (void)
c3e23647 265{
d57650a5 266 state_number_t i;
a49aecd5
AD
267 symbol_number_t *values =
268 (symbol_number_t *) alloca (sizeof (symbol_number_t) * nstates);
9703cc49 269 for (i = 0; i < nstates; ++i)
29e88316 270 values[i] = states[i]->accessing_symbol;
a49aecd5 271 muscle_insert_symbol_number_table ("stos", values,
d57650a5 272 0, 1, nstates);
39912f52
AD
273
274 MUSCLE_INSERT_INT ("last", high);
275 MUSCLE_INSERT_INT ("final_state_number", final_state->number);
276 MUSCLE_INSERT_INT ("states_number", nstates);
c3e23647
RS
277}
278
279
c3e23647 280
bb33f19a
PE
281/*---------------------------------.
282| Output the user actions to OUT. |
283`---------------------------------*/
12b0043a 284
4a120d45 285static void
c6f1a33c 286user_actions_output (FILE *out)
3f96f4dc 287{
9222837b 288 rule_number_t r;
dafdc66f
AD
289
290 fputs ("m4_define([b4_actions], \n[[", out);
4b3d3a8e 291 for (r = 0; r < nrules; ++r)
9222837b 292 if (rules[r].action)
3f96f4dc 293 {
4b3d3a8e 294 fprintf (out, " case %d:\n", r + 1);
3f96f4dc 295
3813e141
PE
296 fprintf (out, "]b4_syncline([[%d]], ",
297 rules[r].action_location.first_line);
298 escaped_file_name_output (out, rules[r].action_location.file);
299 fprintf (out, ")[\n");
e9955c83 300 fprintf (out, " %s\n break;\n\n",
9222837b 301 rules[r].action);
3f96f4dc 302 }
dafdc66f 303 fputs ("]])\n\n", out);
3f96f4dc
AD
304}
305
676385e2
PH
306/*--------------------------------------.
307| Output the merge functions to OUT. |
308`--------------------------------------*/
309
41442480 310static void
676385e2
PH
311merger_output (FILE *out)
312{
313 int n;
314 merger_list* p;
315
316 fputs ("m4_define([b4_mergers], \n[[", out);
e0e5bf84 317 for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
676385e2 318 {
e0e5bf84 319 if (p->type[0] == '\0')
676385e2
PH
320 fprintf (out, " case %d: yyval = %s (*yy0, *yy1); break;\n",
321 n, p->name);
322 else
323 fprintf (out, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
324 n, p->type, p->name);
325 }
326 fputs ("]])\n\n", out);
327}
3f96f4dc 328
ae7453f2
AD
329/*--------------------------------------.
330| Output the tokens definition to OUT. |
331`--------------------------------------*/
091e20bb 332
c6f1a33c 333static void
be2a1a68 334token_definitions_output (FILE *out)
091e20bb
AD
335{
336 int i;
0d8bed56 337 int first = 1;
dafdc66f
AD
338
339 fputs ("m4_define([b4_tokens], \n[", out);
091e20bb
AD
340 for (i = 0; i < ntokens; ++i)
341 {
db8837cb 342 symbol_t *symbol = symbols[i];
091e20bb
AD
343 int number = symbol->user_token_number;
344
b87f8b21
AD
345 /* At this stage, if there are literal aliases, they are part of
346 SYMBOLS, so we should not find symbols which are the aliases
347 here. */
348 assert (number != USER_NUMBER_ALIAS);
349
091e20bb 350 /* Skip error token. */
007a50a4 351 if (symbol == errtoken)
091e20bb 352 continue;
b87f8b21
AD
353
354 /* If this string has an alias, then it is necessarily the alias
355 which is to be output. */
356 if (symbol->alias)
357 symbol = symbol->alias;
358
359 /* Don't output literal chars or strings (when defined only as a
360 string). Note that must be done after the alias resolution:
361 think about `%token 'f' "f"'. */
362 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
363 continue;
091e20bb
AD
364
365 /* Don't #define nonliteral tokens whose names contain periods
366 or '$' (as does the default value of the EOF token). */
367 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
368 continue;
369
83ccf991 370 fprintf (out, "%s[[[%s]], [%d]]",
0d8bed56 371 first ? "" : ",\n", symbol->tag, number);
b87f8b21 372
0d8bed56 373 first = 0;
091e20bb 374 }
dafdc66f 375 fputs ("])\n\n", out);
091e20bb
AD
376}
377
378
ae7453f2
AD
379/*---------------------------------------.
380| Output the symbol destructors to OUT. |
381`---------------------------------------*/
9280d3ef
AD
382
383static void
384symbol_destructors_output (FILE *out)
385{
386 int i;
387 int first = 1;
388
389 fputs ("m4_define([b4_symbol_destructors], \n[", out);
390 for (i = 0; i < nsyms; ++i)
391 if (symbols[i]->destructor)
392 {
393 symbol_t *symbol = symbols[i];
394
24c0aad7
AD
395 /* Filename, lineno,
396 Symbol-name, Symbol-number,
397 destructor, typename. */
3813e141
PE
398 fprintf (out, "%s[",
399 first ? "" : ",\n");
400 escaped_file_name_output (out, symbol->destructor_location.file);
401 fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
900c5db5 402 symbol->destructor_location.first_line,
97650f4e 403 symbol->tag,
24c0aad7
AD
404 symbol->number,
405 symbol->destructor,
406 symbol->type_name);
9280d3ef
AD
407
408 first = 0;
409 }
410 fputs ("])\n\n", out);
411}
412
413
ae7453f2
AD
414/*------------------------------------.
415| Output the symbol printers to OUT. |
416`------------------------------------*/
366eea36
AD
417
418static void
419symbol_printers_output (FILE *out)
420{
421 int i;
422 int first = 1;
423
424 fputs ("m4_define([b4_symbol_printers], \n[", out);
425 for (i = 0; i < nsyms; ++i)
426 if (symbols[i]->destructor)
427 {
428 symbol_t *symbol = symbols[i];
429
430 /* Filename, lineno,
431 Symbol-name, Symbol-number,
ae7453f2 432 printer, typename. */
3813e141
PE
433 fprintf (out, "%s[",
434 first ? "" : ",\n");
435 escaped_file_name_output (out, symbol->printer_location.file);
436 fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
900c5db5 437 symbol->printer_location.first_line,
97650f4e 438 symbol->tag,
366eea36
AD
439 symbol->number,
440 symbol->printer,
441 symbol->type_name);
442
443 first = 0;
444 }
445 fputs ("])\n\n", out);
446}
447
448
4a120d45 449static void
c6f1a33c 450prepare_actions (void)
6c89f1c1 451{
c6f1a33c
AD
452 /* Figure out the actions for the specified state, indexed by
453 lookahead token type. */
bbb5bcc6 454
c6f1a33c
AD
455 muscle_insert_rule_number_table ("defact", yydefact,
456 yydefact[0], 1, nstates);
6c89f1c1 457
c6f1a33c
AD
458 /* Figure out what to do after reducing with each rule, depending on
459 the saved state from before the beginning of parsing the data
460 that matched this rule. */
d57650a5
AD
461 muscle_insert_state_number_table ("defgoto", yydefgoto,
462 yydefgoto[0], 1, nsyms - ntokens);
12b0043a 463
12b0043a 464
12b0043a
AD
465 /* Output PACT. */
466 muscle_insert_base_table ("pact", base,
5372019f 467 base[0], 1, nstates);
12b0043a 468 MUSCLE_INSERT_INT ("pact_ninf", base_ninf);
c3e23647 469
12b0043a
AD
470 /* Output PGOTO. */
471 muscle_insert_base_table ("pgoto", base,
5372019f 472 base[nstates], nstates + 1, nvectors);
c3e23647 473
12b0043a
AD
474 muscle_insert_base_table ("table", table,
475 table[0], 1, high + 1);
476 MUSCLE_INSERT_INT ("table_ninf", table_ninf);
676385e2 477
12b0043a
AD
478 muscle_insert_base_table ("check", check,
479 check[0], 1, high + 1);
c3e23647 480
ea99527d
AD
481 /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus
482 YYPACT) so that in states with unresolved conflicts, the default
483 reduction is not used in the conflicted entries, so that there is
484 a place to put a conflict pointer.
485
486 This means that YYCONFLP and YYCONFL are nonsense for a non-GLR
487 parser, so we could avoid accidents by not writing them out in
488 that case. Nevertheless, it seems even better to be able to use
489 the GLR skeletons even without the non-deterministic tables. */
490 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
39912f52 491 conflict_table[0], 1, high + 1);
ea99527d
AD
492 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
493 conflict_list[0], 1, conflict_list_cnt);
6c89f1c1 494}
c3e23647 495
652def80 496\f
1239777d
AD
497/*---------------------------.
498| Call the skeleton parser. |
499`---------------------------*/
c3e23647 500
4a120d45 501static void
1239777d 502output_skeleton (void)
9b3add5b 503{
573312ac
PE
504 FILE *in;
505 FILE *out;
506 int filter_fd[2];
507 char const *argv[7];
508 pid_t pid;
509
510 /* Compute the names of the package data dir and skeleton file.
511 Test whether m4sugar.m4 is readable, to check for proper
512 installation. A faulty installation can cause deadlock, so a
513 cheap sanity check is worthwhile. */
514 char const m4sugar[] = "m4sugar/m4sugar.m4";
515 char *full_path;
516 char const *p;
517 char const *m4 = (p = getenv ("M4")) ? p : M4;
518 char const *pkgdatadir = (p = getenv ("BISON_PKGDATADIR")) ? p : PKGDATADIR;
519 size_t skeleton_size = strlen (skeleton) + 1;
520 size_t pkgdatadirlen = strlen (pkgdatadir);
521 while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/')
522 pkgdatadirlen--;
523 full_path = xmalloc (pkgdatadirlen + 1
524 + (skeleton_size < sizeof m4sugar
525 ? sizeof m4sugar : skeleton_size));
526 strcpy (full_path, pkgdatadir);
527 full_path[pkgdatadirlen] = '/';
528 strcpy (full_path + pkgdatadirlen + 1, m4sugar);
529 in = fopen (full_path, "r");
30ba05f2 530 if (! in)
573312ac 531 error (EXIT_FAILURE, errno, "%s", full_path);
30ba05f2 532 xfclose (in);
573312ac
PE
533 strcpy (full_path + pkgdatadirlen + 1, skeleton);
534
535 /* Create an m4 subprocess connected to us via two pipes. */
536
537 if (trace_flag & trace_tools)
538 fprintf (stderr, "running: %s -I %s %s - %s\n",
539 m4, pkgdatadir, m4sugar, full_path);
540
541 argv[0] = m4;
542 argv[1] = "-I";
543 argv[2] = pkgdatadir;
544 argv[3] = m4sugar;
545 argv[4] = "-";
546 argv[5] = full_path;
547 argv[6] = NULL;
548
549 init_subpipe ();
550 pid = create_subpipe (argv, filter_fd);
551 free (full_path);
552
553 out = fdopen (filter_fd[0], "w");
554 if (! out)
555 error (EXIT_FAILURE, errno, "fdopen");
556
557 /* Output the definitions of all the muscles. */
381fb12e
AD
558 fputs ("m4_init()\n", out);
559
c6f1a33c 560 user_actions_output (out);
676385e2 561 merger_output (out);
381fb12e 562 token_definitions_output (out);
9280d3ef 563 symbol_destructors_output (out);
366eea36 564 symbol_printers_output (out);
be2a1a68 565
381fb12e 566 muscles_m4_output (out);
be2a1a68 567
381fb12e
AD
568 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
569 fputs ("m4_divert_push(0)dnl\n", out);
570 xfclose (out);
be2a1a68 571
573312ac 572 /* Read and process m4's output. */
1509d42f 573 timevar_push (TV_M4);
573312ac
PE
574 in = fdopen (filter_fd[1], "r");
575 if (! in)
576 error (EXIT_FAILURE, errno, "fdopen");
577 scan_skel (in);
573312ac
PE
578 xfclose (in);
579 reap_subpipe (pid, m4);
1509d42f 580 timevar_pop (TV_M4);
26f609ff
RA
581}
582
583static void
584prepare (void)
585{
7db2ed2d 586 /* Flags. */
437c2d80 587 MUSCLE_INSERT_INT ("debug", debug_flag);
7db2ed2d
AD
588 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
589 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
437c2d80 590 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
11d82f03 591 MUSCLE_INSERT_INT ("pure", pure_parser);
437c2d80 592 MUSCLE_INSERT_INT ("synclines_flag", !no_lines_flag);
11d82f03 593
573a6cd3 594 /* File names. */
7db2ed2d 595 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
b85810ae 596
7db2ed2d 597 /* User Code. */
0dd1580a
RA
598 obstack_1grow (&pre_prologue_obstack, 0);
599 obstack_1grow (&post_prologue_obstack, 0);
600 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
601 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
381fb12e
AD
602
603 /* Find the right skeleton file. */
604 if (!skeleton)
676385e2
PH
605 {
606 if (glr_parser)
607 skeleton = "glr.c";
608 else
609 skeleton = "yacc.c";
610 }
381fb12e
AD
611
612 /* Parse the skeleton file and output the needed parsers. */
3813e141 613 MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
26f609ff 614}
c3e23647 615
93ede233 616
6c89f1c1
AD
617/*----------------------------------------------------------.
618| Output the parsing tables and the parser code to ftable. |
619`----------------------------------------------------------*/
c3e23647 620
6c89f1c1
AD
621void
622output (void)
623{
f87685c3 624 obstack_init (&format_obstack);
dd60faec 625
39912f52 626 prepare_symbols ();
b0940840
AD
627 prepare_rules ();
628 prepare_states ();
536545f3 629 prepare_actions ();
342b8b6e 630
26f609ff 631 prepare ();
652def80 632
9b3add5b
RA
633 /* Process the selected skeleton file. */
634 output_skeleton ();
635
f499b062 636 obstack_free (&format_obstack, NULL);
0dd1580a
RA
637 obstack_free (&pre_prologue_obstack, NULL);
638 obstack_free (&post_prologue_obstack, NULL);
c3e23647 639}