]> git.saurik.com Git - bison.git/blame - src/output.c
* src/output.c (action_row): Let default_rule be always a rule
[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
255ef638
AD
23/* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
25 are set.
c3e23647 26
255ef638
AD
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 token numbers.
c3e23647 29
255ef638 30 ++ YYTNAME = vector of string-names indexed by bison token number.
c3e23647 31
255ef638
AD
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
33 entries in YYTNAME.
c3e23647 34
255ef638
AD
35 YYRLINE = vector of line-numbers of all rules. For yydebug
36 printouts.
c3e23647 37
255ef638
AD
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
c3e23647 40
255ef638 41 YYPRHS[R] = index in YYRHS of first item for rule R.
c3e23647 42
255ef638 43 YYR1[R] = symbol number of symbol that rule R derives.
c3e23647 44
255ef638 45 YYR2[R] = number of symbols composing right hand side of rule R.
c3e23647 46
255ef638
AD
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
48 S.
e372befa 49
255ef638
AD
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
52 error.
c3e23647 53
255ef638
AD
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
56 something else to do.
c3e23647 57
255ef638
AD
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
60 out what to do.
c3e23647 61
255ef638
AD
62 If the value in YYTABLE is positive, we shift the token and go to
63 that state.
c3e23647 64
6c89f1c1 65 If the value is negative, it is minus a rule number to reduce by.
c3e23647 66
255ef638
AD
67 If the value is zero, the default action from YYDEFACT[S] is used.
68
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
74
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
77
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
80 examine.
81
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
87
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
c3e23647 90
c3e23647 91#include "system.h"
914feea9 92#include "bitsetv.h"
14d3eb9b 93#include "quotearg.h"
be2a1a68 94#include "error.h"
ceed8467 95#include "getargs.h"
c3e23647
RS
96#include "files.h"
97#include "gram.h"
b2ca4022 98#include "LR0.h"
a0f6b076 99#include "complain.h"
6c89f1c1 100#include "output.h"
720d742f 101#include "lalr.h"
a70083a3 102#include "reader.h"
ad949da9 103#include "symtab.h"
0619caf0 104#include "conflicts.h"
11d82f03 105#include "muscle_tab.h"
be2a1a68
AD
106
107/* From lib/readpipe.h. */
108FILE *readpipe PARAMS ((const char *, ...));
109
110/* From src/scan-skel.l. */
111int skel_lex PARAMS ((void));
112extern FILE *skel_in;
d019d655 113
c3e23647
RS
114static int nvectors;
115static int nentries;
342b8b6e
AD
116static short **froms = NULL;
117static short **tos = NULL;
676385e2 118static unsigned int **conflict_tos = NULL;
342b8b6e
AD
119static short *tally = NULL;
120static short *width = NULL;
121static short *actrow = NULL;
676385e2 122static short *conflrow = NULL;
342b8b6e
AD
123static short *state_count = NULL;
124static short *order = NULL;
125static short *base = NULL;
126static short *pos = NULL;
133c20e2 127
676385e2
PH
128static unsigned int *conflict_table = NULL;
129static unsigned int *conflict_list = NULL;
130static int conflict_list_cnt;
131static int conflict_list_free;
132
133c20e2
AD
133/* TABLE_SIZE is the allocated size of both TABLE and CHECK.
134 We start with the original hard-coded value: SHRT_MAX
135 (yes, not USHRT_MAX). */
136static size_t table_size = SHRT_MAX;
342b8b6e
AD
137static short *table = NULL;
138static short *check = NULL;
c3e23647
RS
139static int lowzero;
140static int high;
141
f87685c3 142static struct obstack format_obstack;
c3e23647 143
c7925b99
MA
144int error_verbose = 0;
145
f0440388 146
133c20e2
AD
147/*----------------------------------------------------------------.
148| If TABLE (and CHECK) appear to be small to be addressed at |
149| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
150| the desired size is at least DESIRED + 1. |
151`----------------------------------------------------------------*/
152
153static void
154table_grow (size_t desired)
155{
156 size_t old_size = table_size;
157
158 while (table_size <= desired)
159 table_size *= 2;
160
161 if (trace_flag)
162 fprintf (stderr, "growing table and check from: %d to %d\n",
163 old_size, table_size);
164
165 table = XREALLOC (table, short, table_size);
166 check = XREALLOC (check, short, table_size);
676385e2
PH
167 if (glr_parser)
168 conflict_table = XREALLOC (conflict_table, unsigned int, table_size);
133c20e2
AD
169
170 for (/* Nothing. */; old_size < table_size; ++old_size)
171 {
172 table[old_size] = 0;
173 check[old_size] = -1;
174 }
175}
176
177
5372019f
AD
178/*-------------------------------------------------------------------.
179| Create a function NAME which associates to the muscle NAME the |
180| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
181| TYPE), and to the muscle NAME_max, the max value of the |
182| TABLE_DATA. |
183`-------------------------------------------------------------------*/
62a3e4f0 184
62a3e4f0 185
5372019f 186#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
5fbb0954 187 \
5372019f
AD
188static void \
189Name (const char *name, \
5fbb0954
AD
190 Type *table_data, \
191 Type first, \
192 int begin, \
193 int end) \
194{ \
0c2d3f4c 195 Type max = first; \
5fbb0954
AD
196 int i; \
197 int j = 1; \
198 \
5372019f 199 obstack_fgrow1 (&format_obstack, "%6d", first); \
5fbb0954
AD
200 for (i = begin; i < end; ++i) \
201 { \
5372019f 202 obstack_1grow (&format_obstack, ','); \
5fbb0954
AD
203 if (j >= 10) \
204 { \
5372019f 205 obstack_sgrow (&format_obstack, "\n "); \
5fbb0954
AD
206 j = 1; \
207 } \
208 else \
209 ++j; \
5372019f 210 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
5fbb0954
AD
211 if (table_data[i] > max) \
212 max = table_data[i]; \
213 } \
5372019f
AD
214 obstack_1grow (&format_obstack, 0); \
215 muscle_insert (name, obstack_finish (&format_obstack)); \
5fbb0954 216 \
5372019f
AD
217 /* Build `NAME_max' in the obstack. */ \
218 obstack_fgrow1 (&format_obstack, "%s_max", name); \
219 obstack_1grow (&format_obstack, 0); \
0c2d3f4c
AD
220 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
221 (long int) max); \
62a3e4f0
AD
222}
223
5372019f
AD
224GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
225GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
a49aecd5 226GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number_t)
5372019f 227GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
d57650a5 228GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
c3e23647
RS
229
230
b0940840
AD
231/*-----------------------------------------------------------------.
232| Prepare the muscles related to the tokens: translate, tname, and |
233| toknum. |
234`-----------------------------------------------------------------*/
235
4a120d45 236static void
b0940840 237prepare_tokens (void)
c3e23647 238{
a49aecd5 239 muscle_insert_symbol_number_table ("translate",
5372019f
AD
240 token_translations,
241 0, 1, max_user_token_number + 1);
c3e23647 242
b0940840
AD
243 {
244 int i;
245 int j = 0;
246 for (i = 0; i < nsyms; i++)
247 {
6b98e4b5
AD
248 /* Be sure not to use twice the same QUOTEARG slot:
249 SYMBOL_TAG_GET uses slot 0. */
b0940840
AD
250 const char *cp =
251 quotearg_n_style (1, c_quoting_style,
6b98e4b5 252 symbol_tag_get (symbols[i]));
b0940840
AD
253 /* Width of the next token, including the two quotes, the coma
254 and the space. */
255 int strsize = strlen (cp) + 2;
256
257 if (j + strsize > 75)
258 {
259 obstack_sgrow (&format_obstack, "\n ");
260 j = 2;
261 }
262
263 obstack_sgrow (&format_obstack, cp);
264 obstack_sgrow (&format_obstack, ", ");
265 j += strsize;
266 }
267 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
268 defined). */
269 obstack_sgrow (&format_obstack, "0");
c3e23647 270
b0940840
AD
271 /* Finish table and store. */
272 obstack_1grow (&format_obstack, 0);
273 muscle_insert ("tname", obstack_finish (&format_obstack));
274 }
275
276 /* Output YYTOKNUM. */
b2ed6e58
AD
277 {
278 int i;
b0940840
AD
279 short *values = XCALLOC (short, ntokens + 1);
280 for (i = 0; i < ntokens + 1; ++i)
281 values[i] = symbols[i]->user_token_number;
5372019f
AD
282 muscle_insert_short_table ("toknum", values,
283 0, 1, ntokens + 1);
b0940840 284 free (values);
b2ed6e58 285 }
b0940840 286}
b2ed6e58 287
b0940840
AD
288
289/*-------------------------------------------------------------.
290| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
676385e2 291| rline, dprec, merger |
b0940840
AD
292`-------------------------------------------------------------*/
293
294static void
295prepare_rules (void)
296{
9222837b 297 rule_number_t r;
5df5f6d5 298 unsigned int i = 0;
62a3e4f0 299 item_number_t *rhs = XMALLOC (item_number_t, nritems);
5df5f6d5
AD
300 unsigned int *prhs = XMALLOC (unsigned int, nrules + 1);
301 unsigned int *rline = XMALLOC (unsigned int, nrules + 1);
a49aecd5 302 symbol_number_t *r1 = XMALLOC (symbol_number_t, nrules + 1);
5df5f6d5 303 unsigned int *r2 = XMALLOC (unsigned int, nrules + 1);
676385e2
PH
304 short *dprec = XMALLOC (short, nrules + 1);
305 short *merger = XMALLOC (short, nrules + 1);
b0940840
AD
306
307 for (r = 1; r < nrules + 1; ++r)
308 {
9222837b 309 item_number_t *rhsp = NULL;
b0940840
AD
310 /* Index of rule R in RHS. */
311 prhs[r] = i;
312 /* RHS of the rule R. */
313 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
314 rhs[i++] = *rhsp;
315 /* LHS of the rule R. */
316 r1[r] = rules[r].lhs->number;
317 /* Length of rule R's RHS. */
318 r2[r] = i - prhs[r];
319 /* Separator in RHS. */
320 rhs[i++] = -1;
321 /* Line where rule was defined. */
8efe435c 322 rline[r] = rules[r].location.first_line;
676385e2
PH
323 /* Dynamic precedence (GLR) */
324 dprec[r] = rules[r].dprec;
325 /* Merger-function index (GLR) */
326 merger[r] = rules[r].merger;
b0940840
AD
327 }
328 assert (i == nritems);
329
5372019f
AD
330 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
331 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 1, nrules + 1);
332 muscle_insert_unsigned_int_table ("rline", rline, 0, 1, nrules + 1);
a49aecd5 333 muscle_insert_symbol_number_table ("r1", r1, 0, 1, nrules + 1);
5372019f 334 muscle_insert_unsigned_int_table ("r2", r2, 0, 1, nrules + 1);
676385e2
PH
335 muscle_insert_short_table ("dprec", dprec, 0, 1, nrules + 1);
336 muscle_insert_short_table ("merger", merger, 0, 1, nrules + 1);
796d61fb 337
b0940840
AD
338 free (rhs);
339 free (prhs);
5df5f6d5
AD
340 free (rline);
341 free (r1);
b0940840 342 free (r2);
676385e2
PH
343 free (dprec);
344 free (merger);
c3e23647
RS
345}
346
b0940840
AD
347/*--------------------------------------------.
348| Prepare the muscles related to the states. |
349`--------------------------------------------*/
c3e23647 350
4a120d45 351static void
b0940840 352prepare_states (void)
c3e23647 353{
d57650a5 354 state_number_t i;
a49aecd5
AD
355 symbol_number_t *values =
356 (symbol_number_t *) alloca (sizeof (symbol_number_t) * nstates);
9703cc49 357 for (i = 0; i < nstates; ++i)
29e88316 358 values[i] = states[i]->accessing_symbol;
a49aecd5 359 muscle_insert_symbol_number_table ("stos", values,
d57650a5 360 0, 1, nstates);
c3e23647
RS
361}
362
363
676385e2
PH
364/*-------------------------------------------------------------------.
365| For GLR parsers, for each conflicted token in STATE, as indicated |
366| by non-zero entries in conflrow, create a list of possible |
367| reductions that are alternatives to the shift or reduction |
368| currently recorded for that token in STATE. Store the alternative |
369| reductions followed by a 0 in conflict_list, updating |
370| conflict_list_cnt, and storing an index to the start of the list |
371| back into conflrow. |
372`-------------------------------------------------------------------*/
373
374static void
375conflict_row (state_t *state)
376{
377 int i, j;
378
379 if (! glr_parser)
380 return;
381
e0e5bf84
AD
382 for (j = 0; j < ntokens; j += 1)
383 if (conflrow[j])
676385e2
PH
384 {
385 conflrow[j] = conflict_list_cnt;
386
387 /* find all reductions for token j, and record all that do
388 * not match actrow[j] */
389 for (i = 0; i < state->nlookaheads; i += 1)
390 if (bitset_test (state->lookaheads[i], j)
391 && actrow[j] != -state->lookaheads_rule[i]->number)
e0e5bf84 392 {
676385e2 393 assert (conflict_list_free > 0);
e0e5bf84 394 conflict_list[conflict_list_cnt]
676385e2
PH
395 = state->lookaheads_rule[i]->number;
396 conflict_list_cnt += 1;
397 conflict_list_free -= 1;
398 }
e0e5bf84 399
676385e2
PH
400 /* Leave a 0 at the end */
401 assert (conflict_list_free > 0);
402 conflict_list_cnt += 1;
403 conflict_list_free -= 1;
404 }
405}
406
407
6c89f1c1
AD
408/*------------------------------------------------------------------.
409| Decide what to do for each type of token if seen as the lookahead |
410| token in specified state. The value returned is used as the |
411| default action (yydefact) for the state. In addition, actrow is |
412| filled with what to do for each kind of token, index by symbol |
413| number, with zero meaning do the default action. The value |
62a3e4f0 414| SHRT_MIN, a very negative number, means this situation is an |
6c89f1c1
AD
415| error. The parser recognizes this value specially. |
416| |
417| This is where conflicts are resolved. The loop over lookahead |
418| rules considered lower-numbered rules last, and the last rule |
419| considered that likes a token gets to handle it. |
676385e2
PH
420| |
421| For GLR parsers, also sets conflrow[SYM] to an index into |
422| conflict_list iff there is an unresolved conflict (s/r or r/r) |
423| with symbol SYM. The default reduction is not used for a symbol |
424| that has any such conflicts. |
6c89f1c1 425`------------------------------------------------------------------*/
c3e23647 426
4a120d45 427static int
f9507c28 428action_row (state_t *state)
c3e23647 429{
6c89f1c1 430 int i;
9222837b 431 rule_number_t default_rule = 0;
8a731ca8 432 reductions_t *redp = state->reductions;
32e1e0a4 433 shifts_t *shiftp = state->shifts;
8a731ca8 434 errs_t *errp = state->errs;
837491d8
AD
435 /* set nonzero to inhibit having any default reduction */
436 int nodefault = 0;
676385e2 437 int conflicted = 0;
c3e23647
RS
438
439 for (i = 0; i < ntokens; i++)
676385e2 440 actrow[i] = conflrow[i] = 0;
c3e23647 441
80dac38c 442 if (redp->nreds >= 1)
c3e23647 443 {
837491d8
AD
444 int j;
445 /* loop over all the rules available here which require
446 lookahead */
f9507c28 447 for (i = state->nlookaheads - 1; i >= 0; --i)
837491d8
AD
448 /* and find each token which the rule finds acceptable
449 to come next */
574fb2d5
AD
450 BITSET_EXECUTE (state->lookaheads[i], 0, j,
451 {
837491d8
AD
452 /* and record this rule as the rule to use if that
453 token follows. */
574fb2d5
AD
454 if (actrow[j] != 0)
455 conflicted = conflrow[j] = 1;
456 actrow[j] = -state->lookaheads_rule[i]->number;
457 });
c3e23647
RS
458 }
459
36281465
AD
460 /* Now see which tokens are allowed for shifts in this state. For
461 them, record the shift as the thing to do. So shift is preferred
462 to reduce. */
574fb2d5
AD
463 for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
464 if (!SHIFT_IS_DISABLED (shiftp, i))
465 {
466 symbol_number_t symbol = SHIFT_SYMBOL (shiftp, i);
467 state_number_t shift_state = shiftp->shifts[i];
c3e23647 468
574fb2d5
AD
469 if (actrow[symbol] != 0)
470 conflicted = conflrow[symbol] = 1;
471 actrow[symbol] = state_number_as_int (shift_state);
c3e23647 472
574fb2d5
AD
473 /* Do not use any default reduction if there is a shift for
474 error */
475 if (symbol == errtoken->number)
476 nodefault = 1;
477 }
c3e23647 478
36281465 479 /* See which tokens are an explicit error in this state (due to
62a3e4f0 480 %nonassoc). For them, record SHRT_MIN as the action. */
2cec70b9
AD
481 for (i = 0; i < errp->nerrs; i++)
482 {
483 int symbol = errp->errs[i];
62a3e4f0 484 actrow[symbol] = SHRT_MIN;
2cec70b9 485 }
c3e23647 486
36281465
AD
487 /* Now find the most common reduction and make it the default action
488 for this state. */
c3e23647 489
80dac38c 490 if (redp->nreds >= 1 && !nodefault)
c3e23647 491 {
f9507c28 492 if (state->consistent)
c3e23647
RS
493 default_rule = redp->rules[0];
494 else
495 {
7a5350ba 496 int max = 0;
f9507c28 497 for (i = 0; i < state->nlookaheads; i++)
c3e23647 498 {
7a5350ba 499 int count = 0;
53d4308d 500 rule_number_t rule = state->lookaheads_rule[i]->number;
9222837b 501 symbol_number_t j;
9ee3c97b 502
c3e23647 503 for (j = 0; j < ntokens; j++)
53d4308d 504 if (actrow[j] == -rule)
837491d8 505 count++;
9ee3c97b 506
c3e23647
RS
507 if (count > max)
508 {
509 max = count;
510 default_rule = rule;
511 }
512 }
9ee3c97b 513
676385e2
PH
514 /* GLR parsers need space for conflict lists, so we can't
515 default conflicted entries. For non-conflicted entries
e0e5bf84 516 or as long as we are not building a GLR parser,
676385e2
PH
517 actions that match the default are replaced with zero,
518 which means "use the default". */
9ee3c97b 519
c3e23647
RS
520 if (max > 0)
521 {
837491d8 522 int j;
c3e23647 523 for (j = 0; j < ntokens; j++)
53d4308d
AD
524 if (actrow[j] == -default_rule
525 && ! (glr_parser && conflrow[j]))
837491d8 526 actrow[j] = 0;
c3e23647
RS
527 }
528 }
529 }
530
531 /* If have no default rule, the default is an error.
532 So replace any action which says "error" with "use default". */
533
534 if (default_rule == 0)
837491d8 535 for (i = 0; i < ntokens; i++)
62a3e4f0 536 if (actrow[i] == SHRT_MIN)
837491d8 537 actrow[i] = 0;
c3e23647 538
676385e2
PH
539 if (conflicted)
540 conflict_row (state);
541
36281465 542 return default_rule;
c3e23647
RS
543}
544
545
4a120d45 546static void
d57650a5 547save_row (state_number_t state)
c3e23647 548{
d57650a5 549 symbol_number_t i;
6c89f1c1 550 int count;
e0e5bf84
AD
551 short *sp = NULL;
552 short *sp1 = NULL;
553 short *sp2 = NULL;
554 unsigned int *sp3 = NULL;
c3e23647
RS
555
556 count = 0;
557 for (i = 0; i < ntokens; i++)
796d61fb
AD
558 if (actrow[i] != 0)
559 count++;
c3e23647
RS
560
561 if (count == 0)
562 return;
563
d7913476
AD
564 froms[state] = sp1 = sp = XCALLOC (short, count);
565 tos[state] = sp2 = XCALLOC (short, count);
676385e2 566 if (glr_parser)
e0e5bf84
AD
567 conflict_tos[state] = sp3 = XCALLOC (unsigned int, count);
568 else
676385e2 569 conflict_tos[state] = NULL;
c3e23647
RS
570
571 for (i = 0; i < ntokens; i++)
796d61fb
AD
572 if (actrow[i] != 0)
573 {
574 *sp1++ = i;
575 *sp2++ = actrow[i];
676385e2
PH
576 if (glr_parser)
577 *sp3++ = conflrow[i];
796d61fb 578 }
c3e23647
RS
579
580 tally[state] = count;
581 width[state] = sp1[-1] - sp[0] + 1;
582}
583
584
6c89f1c1
AD
585/*------------------------------------------------------------------.
586| Figure out the actions for the specified state, indexed by |
587| lookahead token type. |
588| |
f2acea59
AD
589| The YYDEFACT table is output now. The detailed info is saved for |
590| putting into YYTABLE later. |
6c89f1c1 591`------------------------------------------------------------------*/
c3e23647 592
4a120d45 593static void
6c89f1c1 594token_actions (void)
c3e23647 595{
d57650a5 596 state_number_t i;
676385e2
PH
597 int nconflict = conflicts_total_count ();
598
d7913476 599 short *yydefact = XCALLOC (short, nstates);
c3e23647 600
d7913476 601 actrow = XCALLOC (short, ntokens);
676385e2
PH
602
603 conflrow = XCALLOC (short, ntokens);
604 if (glr_parser)
605 {
606 conflict_list = XCALLOC (unsigned int, 1 + 2 * nconflict);
607 conflict_list_free = 2 * nconflict;
608 conflict_list_cnt = 1;
e0e5bf84
AD
609 }
610 else
676385e2
PH
611 conflict_list_free = conflict_list_cnt = 0;
612
f2acea59 613 for (i = 0; i < nstates; ++i)
c3e23647 614 {
29e88316 615 yydefact[i] = action_row (states[i]);
6c89f1c1 616 save_row (i);
c3e23647 617 }
bbb5bcc6 618
5372019f
AD
619 muscle_insert_short_table ("defact", yydefact,
620 yydefact[0], 1, nstates);
26f609ff 621 XFREE (actrow);
676385e2 622 XFREE (conflrow);
d7913476 623 XFREE (yydefact);
c3e23647
RS
624}
625
626
3f96f4dc
AD
627/*-----------------------------.
628| Output the actions to OOUT. |
629`-----------------------------*/
630
9b3add5b 631void
be2a1a68 632actions_output (FILE *out)
3f96f4dc 633{
9222837b 634 rule_number_t r;
dafdc66f
AD
635
636 fputs ("m4_define([b4_actions], \n[[", out);
9222837b
AD
637 for (r = 1; r < nrules + 1; ++r)
638 if (rules[r].action)
3f96f4dc 639 {
9222837b 640 fprintf (out, " case %d:\n", r);
3f96f4dc
AD
641
642 if (!no_lines_flag)
ea52d706 643 fprintf (out, muscle_find ("linef"),
9222837b 644 rules[r].action_location.first_line,
ea52d706
AD
645 quotearg_style (c_quoting_style,
646 muscle_find ("filename")));
e9955c83 647 fprintf (out, " %s\n break;\n\n",
9222837b 648 rules[r].action);
3f96f4dc 649 }
dafdc66f 650 fputs ("]])\n\n", out);
3f96f4dc
AD
651}
652
676385e2
PH
653/*--------------------------------------.
654| Output the merge functions to OUT. |
655`--------------------------------------*/
656
41442480 657static void
676385e2
PH
658merger_output (FILE *out)
659{
660 int n;
661 merger_list* p;
662
663 fputs ("m4_define([b4_mergers], \n[[", out);
e0e5bf84 664 for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
676385e2 665 {
e0e5bf84 666 if (p->type[0] == '\0')
676385e2
PH
667 fprintf (out, " case %d: yyval = %s (*yy0, *yy1); break;\n",
668 n, p->name);
669 else
670 fprintf (out, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
671 n, p->type, p->name);
672 }
673 fputs ("]])\n\n", out);
674}
3f96f4dc 675
091e20bb
AD
676/*---------------------------------------.
677| Output the tokens definition to OOUT. |
678`---------------------------------------*/
679
9b3add5b 680void
be2a1a68 681token_definitions_output (FILE *out)
091e20bb
AD
682{
683 int i;
0d8bed56 684 int first = 1;
dafdc66f
AD
685
686 fputs ("m4_define([b4_tokens], \n[", out);
091e20bb
AD
687 for (i = 0; i < ntokens; ++i)
688 {
db8837cb 689 symbol_t *symbol = symbols[i];
091e20bb
AD
690 int number = symbol->user_token_number;
691
b87f8b21
AD
692 /* At this stage, if there are literal aliases, they are part of
693 SYMBOLS, so we should not find symbols which are the aliases
694 here. */
695 assert (number != USER_NUMBER_ALIAS);
696
091e20bb 697 /* Skip error token. */
007a50a4 698 if (symbol == errtoken)
091e20bb 699 continue;
b87f8b21
AD
700
701 /* If this string has an alias, then it is necessarily the alias
702 which is to be output. */
703 if (symbol->alias)
704 symbol = symbol->alias;
705
706 /* Don't output literal chars or strings (when defined only as a
707 string). Note that must be done after the alias resolution:
708 think about `%token 'f' "f"'. */
709 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
710 continue;
091e20bb
AD
711
712 /* Don't #define nonliteral tokens whose names contain periods
713 or '$' (as does the default value of the EOF token). */
714 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
715 continue;
716
83ccf991 717 fprintf (out, "%s[[[%s]], [%d]]",
0d8bed56 718 first ? "" : ",\n", symbol->tag, number);
b87f8b21 719
0d8bed56 720 first = 0;
091e20bb 721 }
dafdc66f 722 fputs ("])\n\n", out);
091e20bb
AD
723}
724
725
9280d3ef
AD
726/*----------------------------------------.
727| Output the symbol destructors to OOUT. |
728`----------------------------------------*/
729
730static void
731symbol_destructors_output (FILE *out)
732{
733 int i;
734 int first = 1;
735
736 fputs ("m4_define([b4_symbol_destructors], \n[", out);
737 for (i = 0; i < nsyms; ++i)
738 if (symbols[i]->destructor)
739 {
740 symbol_t *symbol = symbols[i];
741
24c0aad7
AD
742 /* Filename, lineno,
743 Symbol-name, Symbol-number,
744 destructor, typename. */
745 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
9280d3ef 746 first ? "" : ",\n",
24c0aad7
AD
747 infile, symbol->destructor_location.first_line,
748 symbol_tag_get (symbol),
749 symbol->number,
750 symbol->destructor,
751 symbol->type_name);
9280d3ef
AD
752
753 first = 0;
754 }
755 fputs ("])\n\n", out);
756}
757
758
366eea36
AD
759/*-------------------------------------.
760| Output the symbol printers to OOUT. |
761`-------------------------------------*/
762
763static void
764symbol_printers_output (FILE *out)
765{
766 int i;
767 int first = 1;
768
769 fputs ("m4_define([b4_symbol_printers], \n[", out);
770 for (i = 0; i < nsyms; ++i)
771 if (symbols[i]->destructor)
772 {
773 symbol_t *symbol = symbols[i];
774
775 /* Filename, lineno,
776 Symbol-name, Symbol-number,
777 destructor, typename. */
778 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
779 first ? "" : ",\n",
780 infile, symbol->printer_location.first_line,
781 symbol_tag_get (symbol),
782 symbol->number,
783 symbol->printer,
784 symbol->type_name);
785
786 first = 0;
787 }
788 fputs ("])\n\n", out);
789}
790
791
4a120d45 792static void
d57650a5 793save_column (symbol_number_t symbol, state_number_t default_state)
c3e23647 794{
6c89f1c1 795 int i;
6c89f1c1
AD
796 short *sp;
797 short *sp1;
798 short *sp2;
799 int count;
d57650a5 800 int symno = symbol - ntokens + state_number_as_int (nstates);
c3e23647 801
d57650a5
AD
802 int begin = goto_map[symbol];
803 int end = goto_map[symbol + 1];
c3e23647
RS
804
805 count = 0;
43591cec 806 for (i = begin; i < end; i++)
796d61fb
AD
807 if (to_state[i] != default_state)
808 count++;
c3e23647
RS
809
810 if (count == 0)
811 return;
812
d7913476
AD
813 froms[symno] = sp1 = sp = XCALLOC (short, count);
814 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 815
43591cec 816 for (i = begin; i < end; i++)
796d61fb
AD
817 if (to_state[i] != default_state)
818 {
819 *sp1++ = from_state[i];
820 *sp2++ = to_state[i];
821 }
c3e23647
RS
822
823 tally[symno] = count;
824 width[symno] = sp1[-1] - sp[0] + 1;
825}
826
d57650a5
AD
827
828static state_number_t
829default_goto (symbol_number_t symbol)
6c89f1c1 830{
d57650a5
AD
831 state_number_t s;
832 int i;
833 int m = goto_map[symbol];
834 int n = goto_map[symbol + 1];
835 state_number_t default_state = (state_number_t) -1;
837491d8 836 int max = 0;
6c89f1c1
AD
837
838 if (m == n)
d57650a5 839 return (state_number_t) -1;
6c89f1c1 840
d57650a5
AD
841 for (s = 0; s < nstates; s++)
842 state_count[s] = 0;
6c89f1c1
AD
843
844 for (i = m; i < n; i++)
845 state_count[to_state[i]]++;
846
d57650a5
AD
847 for (s = 0; s < nstates; s++)
848 if (state_count[s] > max)
796d61fb 849 {
d57650a5
AD
850 max = state_count[s];
851 default_state = s;
796d61fb 852 }
6c89f1c1
AD
853
854 return default_state;
855}
856
857
858/*-------------------------------------------------------------------.
859| Figure out what to do after reducing with each rule, depending on |
860| the saved state from before the beginning of parsing the data that |
861| matched this rule. |
862| |
863| The YYDEFGOTO table is output now. The detailed info is saved for |
864| putting into YYTABLE later. |
865`-------------------------------------------------------------------*/
866
867static void
868goto_actions (void)
869{
d57650a5
AD
870 symbol_number_t i;
871 state_number_t *yydefgoto = XMALLOC (state_number_t, nsyms - ntokens);
bbb5bcc6 872
26f609ff 873 state_count = XCALLOC (short, nstates);
43591cec 874 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 875 {
d57650a5 876 state_number_t default_state = default_goto (i);
43591cec
AD
877 save_column (i, default_state);
878 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
879 }
880
d57650a5
AD
881 muscle_insert_state_number_table ("defgoto", yydefgoto,
882 yydefgoto[0], 1, nsyms - ntokens);
d7913476 883 XFREE (state_count);
43591cec 884 XFREE (yydefgoto);
6c89f1c1 885}
c3e23647
RS
886
887
9ee3c97b
AD
888/* The next few functions decide how to pack the actions and gotos
889 information into yytable. */
c3e23647 890
4a120d45 891static void
d2729d44 892sort_actions (void)
c3e23647 893{
6c89f1c1 894 int i;
c3e23647 895
d7913476 896 order = XCALLOC (short, nvectors);
c3e23647
RS
897 nentries = 0;
898
899 for (i = 0; i < nvectors; i++)
796d61fb
AD
900 if (tally[i] > 0)
901 {
837491d8
AD
902 int k;
903 int t = tally[i];
904 int w = width[i];
905 int j = nentries - 1;
c3e23647 906
796d61fb
AD
907 while (j >= 0 && (width[order[j]] < w))
908 j--;
c3e23647 909
796d61fb
AD
910 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
911 j--;
c3e23647 912
796d61fb
AD
913 for (k = nentries - 1; k > j; k--)
914 order[k + 1] = order[k];
c3e23647 915
796d61fb
AD
916 order[j + 1] = i;
917 nentries++;
918 }
c3e23647
RS
919}
920
921
4a120d45 922static int
d2729d44 923matching_state (int vector)
c3e23647 924{
837491d8 925 int i = order[vector];
6c89f1c1
AD
926 int t;
927 int w;
6c89f1c1 928 int prev;
c3e23647 929
602bbf31 930 if (i >= (int) nstates)
36281465 931 return -1;
c3e23647
RS
932
933 t = tally[i];
934 w = width[i];
935
936 for (prev = vector - 1; prev >= 0; prev--)
937 {
837491d8
AD
938 int j = order[prev];
939 int k;
940 int match = 1;
941
c3e23647 942 if (width[j] != w || tally[j] != t)
36281465 943 return -1;
c3e23647 944
c3e23647 945 for (k = 0; match && k < t; k++)
796d61fb
AD
946 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
947 match = 0;
c3e23647
RS
948
949 if (match)
36281465 950 return j;
c3e23647
RS
951 }
952
36281465 953 return -1;
c3e23647
RS
954}
955
956
4a120d45 957static int
d2729d44 958pack_vector (int vector)
c3e23647 959{
837491d8 960 int i = order[vector];
6c89f1c1 961 int j;
837491d8 962 int t = tally[i];
6c89f1c1 963 int loc = 0;
837491d8
AD
964 short *from = froms[i];
965 short *to = tos[i];
676385e2 966 unsigned int *conflict_to = conflict_tos[i];
c3e23647 967
340ef489 968 assert (t);
c3e23647 969
133c20e2 970 for (j = lowzero - from[0]; j < (int) table_size; j++)
c3e23647 971 {
837491d8
AD
972 int k;
973 int ok = 1;
c3e23647
RS
974
975 for (k = 0; ok && k < t; k++)
976 {
d57650a5 977 loc = j + state_number_as_int (from[k]);
133c20e2
AD
978 if (loc > (int) table_size)
979 table_grow (loc);
c3e23647
RS
980
981 if (table[loc] != 0)
982 ok = 0;
983 }
984
985 for (k = 0; ok && k < vector; k++)
796d61fb
AD
986 if (pos[k] == j)
987 ok = 0;
c3e23647
RS
988
989 if (ok)
990 {
991 for (k = 0; k < t; k++)
992 {
d57650a5
AD
993 loc = j + state_number_as_int (from[k]);
994 table[loc] = state_number_as_int (to[k]);
676385e2
PH
995 if (glr_parser && conflict_to != NULL)
996 conflict_table[loc] = conflict_to[k];
d57650a5 997 check[loc] = state_number_as_int (from[k]);
c3e23647
RS
998 }
999
1000 while (table[lowzero] != 0)
1001 lowzero++;
1002
1003 if (loc > high)
1004 high = loc;
1005
36281465 1006 return j;
c3e23647
RS
1007 }
1008 }
275fc3ad
AD
1009#define pack_vector_succeeded 0
1010 assert (pack_vector_succeeded);
3843c413 1011 return 0;
c3e23647
RS
1012}
1013
1014
6c89f1c1
AD
1015static void
1016pack_table (void)
1017{
1018 int i;
1019 int place;
1020 int state;
1021
d7913476
AD
1022 base = XCALLOC (short, nvectors);
1023 pos = XCALLOC (short, nentries);
133c20e2 1024 table = XCALLOC (short, table_size);
676385e2
PH
1025 if (glr_parser)
1026 conflict_table = XCALLOC (unsigned int, table_size);
133c20e2 1027 check = XCALLOC (short, table_size);
6c89f1c1
AD
1028
1029 lowzero = 0;
1030 high = 0;
1031
1032 for (i = 0; i < nvectors; i++)
62a3e4f0 1033 base[i] = SHRT_MIN;
6c89f1c1 1034
133c20e2 1035 for (i = 0; i < (int) table_size; i++)
6c89f1c1
AD
1036 check[i] = -1;
1037
1038 for (i = 0; i < nentries; i++)
1039 {
1040 state = matching_state (i);
1041
1042 if (state < 0)
1043 place = pack_vector (i);
1044 else
1045 place = base[state];
1046
1047 pos[i] = place;
1048 base[order[i]] = place;
1049 }
1050
1051 for (i = 0; i < nvectors; i++)
1052 {
796d61fb
AD
1053 XFREE (froms[i]);
1054 XFREE (tos[i]);
676385e2 1055 XFREE (conflict_tos[i]);
6c89f1c1
AD
1056 }
1057
d7913476
AD
1058 XFREE (froms);
1059 XFREE (tos);
676385e2 1060 XFREE (conflict_tos);
d7913476 1061 XFREE (pos);
6c89f1c1 1062}
c3e23647 1063
676385e2 1064/* the following functions output yytable, yycheck, yyconflp, yyconfl,
c3e23647
RS
1065 and the vectors whose elements index the portion starts */
1066
4a120d45 1067static void
d2729d44 1068output_base (void)
c3e23647 1069{
26f609ff 1070 /* Output pact. */
5372019f
AD
1071 muscle_insert_short_table ("pact", base,
1072 base[0], 1, nstates);
c3e23647 1073
26f609ff 1074 /* Output pgoto. */
5372019f
AD
1075 muscle_insert_short_table ("pgoto", base,
1076 base[nstates], nstates + 1, nvectors);
d7913476 1077 XFREE (base);
c3e23647
RS
1078}
1079
1080
4a120d45 1081static void
d2729d44 1082output_table (void)
c3e23647 1083{
5372019f
AD
1084 muscle_insert_short_table ("table", table,
1085 table[0], 1, high + 1);
d7913476 1086 XFREE (table);
c3e23647
RS
1087}
1088
1089
676385e2
PH
1090static void
1091output_conflicts (void)
1092{
1093 /* GLR parsing slightly modifies yytable and yycheck
1094 (and thus yypact) so that in states with unresolved conflicts,
1095 the default reduction is not used in the conflicted entries, so
1096 that there is a place to put a conflict pointer. This means that
1097 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1098 avoid accidents by not writing them out in that case. */
1099 if (! glr_parser)
1100 return;
1101
e0e5bf84 1102 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
676385e2 1103 conflict_table[0], 1, high+1);
e0e5bf84 1104 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
676385e2
PH
1105 conflict_list[0], 1, conflict_list_cnt);
1106
1107 XFREE (conflict_table);
1108 XFREE (conflict_list);
1109}
1110
1111
4a120d45 1112static void
d2729d44 1113output_check (void)
c3e23647 1114{
5372019f
AD
1115 muscle_insert_short_table ("check", check,
1116 check[0], 1, high + 1);
d7913476 1117 XFREE (check);
c3e23647
RS
1118}
1119
b0940840
AD
1120/*-----------------------------------------------------------------.
1121| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1122| and yycheck. |
1123`-----------------------------------------------------------------*/
6c89f1c1
AD
1124
1125static void
1126output_actions (void)
1127{
d57650a5
AD
1128 /* That's a poor way to make sure the sizes are properly corelated,
1129 in particular the signedness is not taking into account, but it's
1130 not useless. */
1131 assert (sizeof (nvectors) >= sizeof (nstates));
1132 assert (sizeof (nvectors) >= sizeof (nvars));
1133
1134 nvectors = state_number_as_int (nstates) + nvars;
c3e23647 1135
d7913476
AD
1136 froms = XCALLOC (short *, nvectors);
1137 tos = XCALLOC (short *, nvectors);
676385e2 1138 conflict_tos = XCALLOC (unsigned int *, nvectors);
d7913476
AD
1139 tally = XCALLOC (short, nvectors);
1140 width = XCALLOC (short, nvectors);
6c89f1c1
AD
1141
1142 token_actions ();
914feea9 1143 bitsetv_free (LA);
b0299a2e 1144 free (LArule);
6c89f1c1
AD
1145
1146 goto_actions ();
d7913476
AD
1147 XFREE (goto_map + ntokens);
1148 XFREE (from_state);
1149 XFREE (to_state);
6c89f1c1
AD
1150
1151 sort_actions ();
1152 pack_table ();
4e5caae2 1153
6c89f1c1
AD
1154 output_base ();
1155 output_table ();
676385e2 1156 output_conflicts ();
4e5caae2 1157
6c89f1c1
AD
1158 output_check ();
1159}
c3e23647 1160
652def80 1161\f
f958596b
AD
1162/*----------------------.
1163| Run our backend, M4. |
1164`----------------------*/
1165
1166static void
1167m4_invoke (const char *definitions)
1168{
1169 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1170 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1171 const char *m4 = getenv ("M4");
1172 int pkg_data_len;
1173 char *full_skeleton;
1174
1175 if (!m4)
1176 m4 = M4;
1177 if (!bison_pkgdatadir)
1178 bison_pkgdatadir = PKGDATADIR;
1179 pkg_data_len = strlen (bison_pkgdatadir);
1180 full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
1181 if (bison_pkgdatadir[pkg_data_len-1] == '/')
1182 sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
1183 else
1184 sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
1185 if (trace_flag)
1186 fprintf (stderr,
1187 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1188 m4, bison_pkgdatadir, definitions, full_skeleton);
1189 skel_in = readpipe (m4,
1190 "-I", bison_pkgdatadir,
1191 "m4sugar/m4sugar.m4",
1192 definitions,
1193 full_skeleton,
1194 NULL);
1195 XFREE (full_skeleton);
1196 if (!skel_in)
1197 error (EXIT_FAILURE, errno, "cannot run m4");
1198 skel_lex ();
1199
1200}
1201
1239777d
AD
1202/*---------------------------.
1203| Call the skeleton parser. |
1204`---------------------------*/
c3e23647 1205
4a120d45 1206static void
1239777d 1207output_skeleton (void)
9b3add5b 1208{
be2a1a68 1209 /* Store the definition of all the muscles. */
d0039cbc 1210 const char *tempdir = getenv ("TMPDIR");
381fb12e
AD
1211 char *tempfile = NULL;
1212 FILE *out = NULL;
381fb12e
AD
1213 int fd;
1214
1215 if (tempdir == NULL)
1216 tempdir = DEFAULT_TMPDIR;
1217 tempfile = xmalloc (strlen (tempdir) + 11);
1218 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
1219 fd = mkstemp (tempfile);
1220 if (fd == -1)
1221 error (EXIT_FAILURE, errno, "%s", tempfile);
1222
1223 out = fdopen (fd, "w");
1224 if (out == NULL)
1225 error (EXIT_FAILURE, errno, "%s", tempfile);
1226
1227 /* There are no comments, especially not `#': we do want M4 expansion
1228 after `#': think of CPP macros! */
1229 fputs ("m4_changecom()\n", out);
1230 fputs ("m4_init()\n", out);
1231
381fb12e 1232 actions_output (out);
676385e2 1233 merger_output (out);
381fb12e 1234 token_definitions_output (out);
9280d3ef 1235 symbol_destructors_output (out);
366eea36 1236 symbol_printers_output (out);
be2a1a68 1237
381fb12e 1238 muscles_m4_output (out);
be2a1a68 1239
381fb12e
AD
1240 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1241 fputs ("m4_divert_push(0)dnl\n", out);
1242 xfclose (out);
be2a1a68 1243
f958596b
AD
1244 m4_invoke (tempfile);
1245
1246 /* If `debugging', keep this file alive. */
1247 if (!trace_flag)
1248 unlink (tempfile);
1249
1250 free (tempfile);
26f609ff
RA
1251}
1252
1253static void
1254prepare (void)
1255{
11d82f03 1256 MUSCLE_INSERT_INT ("last", high);
62a3e4f0 1257 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
11d82f03
MA
1258 MUSCLE_INSERT_INT ("pure", pure_parser);
1259 MUSCLE_INSERT_INT ("nsym", nsyms);
1260 MUSCLE_INSERT_INT ("debug", debug_flag);
d57650a5 1261 MUSCLE_INSERT_INT ("final", final_state->number);
007a50a4
AD
1262 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1263 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
be2a1a68 1264 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
b5b61c61 1265 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
11d82f03 1266
b85810ae
AD
1267 /* FIXME: This is wrong: the muscles should decide whether they hold
1268 a copy or not, but the situation is too obscure currently. */
be2a1a68
AD
1269 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1270 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1271 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1272 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
b85810ae 1273
11d82f03
MA
1274 MUSCLE_INSERT_INT ("nnts", nvars);
1275 MUSCLE_INSERT_INT ("nrules", nrules);
1276 MUSCLE_INSERT_INT ("nstates", nstates);
1277 MUSCLE_INSERT_INT ("ntokens", ntokens);
1278
be2a1a68
AD
1279 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1280 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
381fb12e
AD
1281
1282 /* Copy definitions in directive. */
0dd1580a
RA
1283 obstack_1grow (&pre_prologue_obstack, 0);
1284 obstack_1grow (&post_prologue_obstack, 0);
1285 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1286 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
381fb12e
AD
1287
1288 /* Find the right skeleton file. */
1289 if (!skeleton)
676385e2
PH
1290 {
1291 if (glr_parser)
1292 skeleton = "glr.c";
1293 else
1294 skeleton = "yacc.c";
1295 }
381fb12e
AD
1296
1297 /* Parse the skeleton file and output the needed parsers. */
1298 muscle_insert ("skeleton", skeleton);
26f609ff 1299}
c3e23647 1300
93ede233 1301
6c89f1c1
AD
1302/*----------------------------------------------------------.
1303| Output the parsing tables and the parser code to ftable. |
1304`----------------------------------------------------------*/
c3e23647 1305
6c89f1c1
AD
1306void
1307output (void)
1308{
f87685c3 1309 obstack_init (&format_obstack);
dd60faec 1310
b0940840
AD
1311 prepare_tokens ();
1312 prepare_rules ();
1313 prepare_states ();
6c89f1c1 1314 output_actions ();
342b8b6e 1315
26f609ff 1316 prepare ();
652def80 1317
9b3add5b
RA
1318 /* Process the selected skeleton file. */
1319 output_skeleton ();
1320
f499b062 1321 obstack_free (&format_obstack, NULL);
0dd1580a
RA
1322 obstack_free (&pre_prologue_obstack, NULL);
1323 obstack_free (&post_prologue_obstack, NULL);
c3e23647 1324}