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