]> git.saurik.com Git - bison.git/blob - src/output.c
Be sure never to walk through RITEMS, but use only data related to
[bison.git] / src / output.c
1 /* Output the generated parsing program for bison,
2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
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.
11
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.
16
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. */
21
22
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.
26
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 token numbers.
29
30 ++ YYTNAME = vector of string-names indexed by bison token number.
31
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
33 entries in YYTNAME.
34
35 YYRLINE = vector of line-numbers of all rules. For yydebug
36 printouts.
37
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
40
41 YYPRHS[R] = index in YYRHS of first item for rule R.
42
43 YYR1[R] = symbol number of symbol that rule R derives.
44
45 YYR2[R] = number of symbols composing right hand side of rule R.
46
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
48 S.
49
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.
53
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.
57
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.
61
62 If the value in YYTABLE is positive, we shift the token and go to
63 that state.
64
65 If the value is negative, it is minus a rule number to reduce by.
66
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 ?? */
90
91 #include "system.h"
92 #include "bitsetv.h"
93 #include "quotearg.h"
94 #include "error.h"
95 #include "getargs.h"
96 #include "files.h"
97 #include "gram.h"
98 #include "LR0.h"
99 #include "complain.h"
100 #include "output.h"
101 #include "lalr.h"
102 #include "reader.h"
103 #include "symtab.h"
104 #include "conflicts.h"
105 #include "muscle_tab.h"
106
107 /* From lib/readpipe.h. */
108 FILE *readpipe PARAMS ((const char *, ...));
109
110 /* From src/scan-skel.l. */
111 int skel_lex PARAMS ((void));
112 extern FILE *skel_in;
113
114 static int nvectors;
115 static int nentries;
116 static short **froms = NULL;
117 static short **tos = NULL;
118 static short *tally = NULL;
119 static short *width = NULL;
120 static short *actrow = NULL;
121 static short *state_count = NULL;
122 static short *order = NULL;
123 static short *base = NULL;
124 static short *pos = NULL;
125 static short *table = NULL;
126 static short *check = NULL;
127 static int lowzero;
128 static int high;
129
130 struct obstack muscle_obstack;
131 static struct obstack format_obstack;
132
133 int error_verbose = 0;
134
135 /* Returns the number of lines of S. */
136 size_t
137 get_lines_number (const char *s)
138 {
139 size_t lines = 0;
140
141 size_t i;
142 for (i = 0; s[i]; ++i)
143 if (s[i] == '\n')
144 ++lines;
145
146 return lines;
147 }
148
149
150 /* FIXME. */
151
152 static inline void
153 output_table_data (struct obstack *oout,
154 short *table_data,
155 short first,
156 int begin,
157 int end)
158 {
159 int i;
160 int j = 1;
161
162 obstack_fgrow1 (oout, "%6d", first);
163 for (i = begin; i < end; ++i)
164 {
165 obstack_1grow (oout, ',');
166 if (j >= 10)
167 {
168 obstack_sgrow (oout, "\n ");
169 j = 1;
170 }
171 else
172 ++j;
173 obstack_fgrow1 (oout, "%6d", table_data[i]);
174 }
175 obstack_1grow (oout, 0);
176 }
177
178
179 /*-----------------------------------------------------------------.
180 | Prepare the muscles related to the tokens: translate, tname, and |
181 | toknum. |
182 `-----------------------------------------------------------------*/
183
184 static void
185 prepare_tokens (void)
186 {
187 output_table_data (&format_obstack, token_translations,
188 0, 1, max_user_token_number + 1);
189 muscle_insert ("translate", obstack_finish (&format_obstack));
190 XFREE (token_translations);
191
192 {
193 int i;
194 int j = 0;
195 for (i = 0; i < nsyms; i++)
196 {
197 /* Be sure not to use twice the same quotearg slot. */
198 const char *cp =
199 quotearg_n_style (1, c_quoting_style,
200 quotearg_style (escape_quoting_style,
201 symbols[i]->tag));
202 /* Width of the next token, including the two quotes, the coma
203 and the space. */
204 int strsize = strlen (cp) + 2;
205
206 if (j + strsize > 75)
207 {
208 obstack_sgrow (&format_obstack, "\n ");
209 j = 2;
210 }
211
212 obstack_sgrow (&format_obstack, cp);
213 obstack_sgrow (&format_obstack, ", ");
214 j += strsize;
215 }
216 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
217 defined). */
218 obstack_sgrow (&format_obstack, "0");
219
220 /* Finish table and store. */
221 obstack_1grow (&format_obstack, 0);
222 muscle_insert ("tname", obstack_finish (&format_obstack));
223 }
224
225 /* Output YYTOKNUM. */
226 {
227 int i;
228 short *values = XCALLOC (short, ntokens + 1);
229 for (i = 0; i < ntokens + 1; ++i)
230 values[i] = symbols[i]->user_token_number;
231 output_table_data (&format_obstack, values,
232 0, 1, ntokens + 1);
233 muscle_insert ("toknum", obstack_finish (&format_obstack));
234 free (values);
235 }
236 }
237
238
239 /*-------------------------------------------------------------.
240 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
241 | rline. |
242 `-------------------------------------------------------------*/
243
244 static void
245 prepare_rules (void)
246 {
247 short *rhsp;
248 int r;
249 int i = 0;
250 short *rhs = XMALLOC (short, nritems);
251 short *prhs = XMALLOC (short, nrules + 1);
252 short *r1 = XMALLOC (short, nrules + 1);
253 short *r2 = XMALLOC (short, nrules + 1);
254 short *rline = XMALLOC (short, nrules + 1);
255
256 for (r = 1; r < nrules + 1; ++r)
257 {
258 /* Index of rule R in RHS. */
259 prhs[r] = i;
260 /* RHS of the rule R. */
261 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
262 rhs[i++] = *rhsp;
263 /* LHS of the rule R. */
264 r1[r] = rules[r].lhs->number;
265 /* Length of rule R's RHS. */
266 r2[r] = i - prhs[r];
267 /* Separator in RHS. */
268 rhs[i++] = -1;
269 /* Line where rule was defined. */
270 rline[r] = rules[r].line;
271 }
272 assert (i == nritems);
273
274 output_table_data (&format_obstack, rhs, ritem[0], 1, nritems);
275 muscle_insert ("rhs", obstack_finish (&format_obstack));
276
277 output_table_data (&format_obstack, prhs, 0, 1, nrules + 1);
278 muscle_insert ("prhs", obstack_finish (&format_obstack));
279
280 output_table_data (&format_obstack, rline, 0, 1, nrules + 1);
281 muscle_insert ("rline", obstack_finish (&format_obstack));
282
283 output_table_data (&format_obstack, r1, 0, 1, nrules + 1);
284 muscle_insert ("r1", obstack_finish (&format_obstack));
285
286 output_table_data (&format_obstack, r2, 0, 1, nrules + 1);
287 muscle_insert ("r2", obstack_finish (&format_obstack));
288
289 free (rhs);
290 free (prhs);
291 free (r2);
292 }
293
294 /*--------------------------------------------.
295 | Prepare the muscles related to the states. |
296 `--------------------------------------------*/
297
298 static void
299 prepare_states (void)
300 {
301 size_t i;
302 short *values = (short *) alloca (sizeof (short) * nstates);
303 for (i = 0; i < nstates; ++i)
304 values[i] = states[i]->accessing_symbol;
305 output_table_data (&format_obstack, values,
306 0, 1, nstates);
307 muscle_insert ("stos", obstack_finish (&format_obstack));
308 }
309
310
311 /*------------------------------------------------------------------.
312 | Decide what to do for each type of token if seen as the lookahead |
313 | token in specified state. The value returned is used as the |
314 | default action (yydefact) for the state. In addition, actrow is |
315 | filled with what to do for each kind of token, index by symbol |
316 | number, with zero meaning do the default action. The value |
317 | MINSHORT, a very negative number, means this situation is an |
318 | error. The parser recognizes this value specially. |
319 | |
320 | This is where conflicts are resolved. The loop over lookahead |
321 | rules considered lower-numbered rules last, and the last rule |
322 | considered that likes a token gets to handle it. |
323 `------------------------------------------------------------------*/
324
325 static int
326 action_row (state_t *state)
327 {
328 int i;
329 int default_rule = 0;
330 reductions *redp = state->reductions;
331 shifts *shiftp = state->shifts;
332 errs *errp = state->errs;
333 /* set nonzero to inhibit having any default reduction */
334 int nodefault = 0;
335
336 for (i = 0; i < ntokens; i++)
337 actrow[i] = 0;
338
339 if (redp->nreds >= 1)
340 {
341 int j;
342 /* loop over all the rules available here which require
343 lookahead */
344 for (i = state->nlookaheads - 1; i >= 0; --i)
345 /* and find each token which the rule finds acceptable
346 to come next */
347 for (j = 0; j < ntokens; j++)
348 /* and record this rule as the rule to use if that
349 token follows. */
350 if (bitset_test (LA[state->lookaheadsp + i], j))
351 actrow[j] = -LAruleno[state->lookaheadsp + i];
352 }
353
354 /* Now see which tokens are allowed for shifts in this state. For
355 them, record the shift as the thing to do. So shift is preferred
356 to reduce. */
357 for (i = 0; i < shiftp->nshifts; i++)
358 {
359 int symbol;
360 int shift_state = shiftp->shifts[i];
361 if (!shift_state)
362 continue;
363
364 symbol = states[shift_state]->accessing_symbol;
365
366 if (ISVAR (symbol))
367 break;
368
369 actrow[symbol] = shift_state;
370
371 /* Do not use any default reduction if there is a shift for
372 error */
373 if (symbol == error_token_number)
374 nodefault = 1;
375 }
376
377 /* See which tokens are an explicit error in this state (due to
378 %nonassoc). For them, record MINSHORT as the action. */
379 for (i = 0; i < errp->nerrs; i++)
380 {
381 int symbol = errp->errs[i];
382 actrow[symbol] = MINSHORT;
383 }
384
385 /* Now find the most common reduction and make it the default action
386 for this state. */
387
388 if (redp->nreds >= 1 && !nodefault)
389 {
390 if (state->consistent)
391 default_rule = redp->rules[0];
392 else
393 {
394 int max = 0;
395 for (i = 0; i < state->nlookaheads; i++)
396 {
397 int count = 0;
398 int rule = -LAruleno[state->lookaheadsp + i];
399 int j;
400
401 for (j = 0; j < ntokens; j++)
402 if (actrow[j] == rule)
403 count++;
404
405 if (count > max)
406 {
407 max = count;
408 default_rule = rule;
409 }
410 }
411
412 /* actions which match the default are replaced with zero,
413 which means "use the default" */
414
415 if (max > 0)
416 {
417 int j;
418 for (j = 0; j < ntokens; j++)
419 if (actrow[j] == default_rule)
420 actrow[j] = 0;
421
422 default_rule = -default_rule;
423 }
424 }
425 }
426
427 /* If have no default rule, the default is an error.
428 So replace any action which says "error" with "use default". */
429
430 if (default_rule == 0)
431 for (i = 0; i < ntokens; i++)
432 if (actrow[i] == MINSHORT)
433 actrow[i] = 0;
434
435 return default_rule;
436 }
437
438
439 static void
440 save_row (int state)
441 {
442 int i;
443 int count;
444 short *sp;
445 short *sp1;
446 short *sp2;
447
448 count = 0;
449 for (i = 0; i < ntokens; i++)
450 if (actrow[i] != 0)
451 count++;
452
453 if (count == 0)
454 return;
455
456 froms[state] = sp1 = sp = XCALLOC (short, count);
457 tos[state] = sp2 = XCALLOC (short, count);
458
459 for (i = 0; i < ntokens; i++)
460 if (actrow[i] != 0)
461 {
462 *sp1++ = i;
463 *sp2++ = actrow[i];
464 }
465
466 tally[state] = count;
467 width[state] = sp1[-1] - sp[0] + 1;
468 }
469
470
471 /*------------------------------------------------------------------.
472 | Figure out the actions for the specified state, indexed by |
473 | lookahead token type. |
474 | |
475 | The YYDEFACT table is output now. The detailed info is saved for |
476 | putting into YYTABLE later. |
477 `------------------------------------------------------------------*/
478
479 static void
480 token_actions (void)
481 {
482 size_t i;
483 short *yydefact = XCALLOC (short, nstates);
484
485 actrow = XCALLOC (short, ntokens);
486 for (i = 0; i < nstates; ++i)
487 {
488 yydefact[i] = action_row (states[i]);
489 save_row (i);
490 }
491
492 output_table_data (&format_obstack, yydefact,
493 yydefact[0], 1, nstates);
494 muscle_insert ("defact", obstack_finish (&format_obstack));
495
496 XFREE (actrow);
497 XFREE (yydefact);
498 }
499
500
501 /*-----------------------------.
502 | Output the actions to OOUT. |
503 `-----------------------------*/
504
505 void
506 actions_output (FILE *out)
507 {
508 int rule;
509 for (rule = 1; rule < nrules + 1; ++rule)
510 if (rules[rule].action)
511 {
512 fprintf (out, " case %d:\n", rule);
513
514 if (!no_lines_flag)
515 fprintf (out, muscle_find ("linef"),
516 rules[rule].action_line,
517 quotearg_style (c_quoting_style,
518 muscle_find ("filename")));
519 /* As a Bison extension, add the ending semicolon. Since some
520 Yacc don't do that, help people using bison as a Yacc
521 finding their missing semicolons. */
522 fprintf (out, "{ %s%s }\n break;\n\n",
523 rules[rule].action,
524 yacc_flag ? ";" : "");
525 }
526 }
527
528
529 /*----------------------------.
530 | Output the guards to OOUT. |
531 `----------------------------*/
532
533 void
534 guards_output (FILE *out)
535 {
536 int rule;
537 for (rule = 1; rule < nrules + 1; ++rule)
538 if (rules[rule].guard)
539 {
540 fprintf (out, " case %d:\n", rule);
541
542 if (!no_lines_flag)
543 fprintf (out, muscle_find ("linef"),
544 rules[rule].guard_line,
545 quotearg_style (c_quoting_style,
546 muscle_find ("filename")));
547 fprintf (out, "{ %s; }\n break;\n\n",
548 rules[rule].guard);
549 }
550 }
551
552
553 /*---------------------------------------.
554 | Output the tokens definition to OOUT. |
555 `---------------------------------------*/
556
557 void
558 token_definitions_output (FILE *out)
559 {
560 int i;
561 int first = 1;
562 for (i = 0; i < ntokens; ++i)
563 {
564 bucket *symbol = symbols[i];
565 int number = symbol->user_token_number;
566
567 if (number == SALIAS)
568 continue;
569 /* Skip error token. */
570 if (symbol->number == error_token_number)
571 continue;
572 if (symbol->tag[0] == '\'')
573 continue; /* skip literal character */
574 if (symbol->tag[0] == '\"')
575 {
576 /* use literal string only if given a symbol with an alias */
577 if (symbol->alias)
578 symbol = symbol->alias;
579 else
580 continue;
581 }
582
583 /* Don't #define nonliteral tokens whose names contain periods
584 or '$' (as does the default value of the EOF token). */
585 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
586 continue;
587
588 fprintf (out, "%s [[[%s]], [%d]]",
589 first ? "" : ",\n", symbol->tag, number);
590 if (semantic_parser)
591 /* FIXME: This is probably wrong, and should be just as
592 above. --akim. */
593 fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->number);
594 first = 0;
595 }
596 }
597
598
599 static void
600 save_column (int symbol, int default_state)
601 {
602 int i;
603 short *sp;
604 short *sp1;
605 short *sp2;
606 int count;
607 int symno = symbol - ntokens + nstates;
608
609 short begin = goto_map[symbol];
610 short end = goto_map[symbol + 1];
611
612 count = 0;
613 for (i = begin; i < end; i++)
614 if (to_state[i] != default_state)
615 count++;
616
617 if (count == 0)
618 return;
619
620 froms[symno] = sp1 = sp = XCALLOC (short, count);
621 tos[symno] = sp2 = XCALLOC (short, count);
622
623 for (i = begin; i < end; i++)
624 if (to_state[i] != default_state)
625 {
626 *sp1++ = from_state[i];
627 *sp2++ = to_state[i];
628 }
629
630 tally[symno] = count;
631 width[symno] = sp1[-1] - sp[0] + 1;
632 }
633
634 static int
635 default_goto (int symbol)
636 {
637 size_t i;
638 size_t m = goto_map[symbol];
639 size_t n = goto_map[symbol + 1];
640 int default_state = -1;
641 int max = 0;
642
643 if (m == n)
644 return -1;
645
646 for (i = 0; i < nstates; i++)
647 state_count[i] = 0;
648
649 for (i = m; i < n; i++)
650 state_count[to_state[i]]++;
651
652 for (i = 0; i < nstates; i++)
653 if (state_count[i] > max)
654 {
655 max = state_count[i];
656 default_state = i;
657 }
658
659 return default_state;
660 }
661
662
663 /*-------------------------------------------------------------------.
664 | Figure out what to do after reducing with each rule, depending on |
665 | the saved state from before the beginning of parsing the data that |
666 | matched this rule. |
667 | |
668 | The YYDEFGOTO table is output now. The detailed info is saved for |
669 | putting into YYTABLE later. |
670 `-------------------------------------------------------------------*/
671
672 static void
673 goto_actions (void)
674 {
675 int i;
676 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
677
678 state_count = XCALLOC (short, nstates);
679 for (i = ntokens; i < nsyms; ++i)
680 {
681 int default_state = default_goto (i);
682 save_column (i, default_state);
683 yydefgoto[i - ntokens] = default_state;
684 }
685
686 output_table_data (&format_obstack, yydefgoto,
687 yydefgoto[0], 1, nsyms - ntokens);
688 muscle_insert ("defgoto", obstack_finish (&format_obstack));
689
690 XFREE (state_count);
691 XFREE (yydefgoto);
692 }
693
694
695 /* The next few functions decide how to pack the actions and gotos
696 information into yytable. */
697
698 static void
699 sort_actions (void)
700 {
701 int i;
702
703 order = XCALLOC (short, nvectors);
704 nentries = 0;
705
706 for (i = 0; i < nvectors; i++)
707 if (tally[i] > 0)
708 {
709 int k;
710 int t = tally[i];
711 int w = width[i];
712 int j = nentries - 1;
713
714 while (j >= 0 && (width[order[j]] < w))
715 j--;
716
717 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
718 j--;
719
720 for (k = nentries - 1; k > j; k--)
721 order[k + 1] = order[k];
722
723 order[j + 1] = i;
724 nentries++;
725 }
726 }
727
728
729 static int
730 matching_state (int vector)
731 {
732 int i = order[vector];
733 int t;
734 int w;
735 int prev;
736
737 if (i >= (int) nstates)
738 return -1;
739
740 t = tally[i];
741 w = width[i];
742
743 for (prev = vector - 1; prev >= 0; prev--)
744 {
745 int j = order[prev];
746 int k;
747 int match = 1;
748
749 if (width[j] != w || tally[j] != t)
750 return -1;
751
752 for (k = 0; match && k < t; k++)
753 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
754 match = 0;
755
756 if (match)
757 return j;
758 }
759
760 return -1;
761 }
762
763
764 static int
765 pack_vector (int vector)
766 {
767 int i = order[vector];
768 int j;
769 int t = tally[i];
770 int loc = 0;
771 short *from = froms[i];
772 short *to = tos[i];
773
774 assert (t);
775
776 for (j = lowzero - from[0]; j < MAXTABLE; j++)
777 {
778 int k;
779 int ok = 1;
780
781 for (k = 0; ok && k < t; k++)
782 {
783 loc = j + from[k];
784 if (loc > MAXTABLE)
785 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
786
787 if (table[loc] != 0)
788 ok = 0;
789 }
790
791 for (k = 0; ok && k < vector; k++)
792 if (pos[k] == j)
793 ok = 0;
794
795 if (ok)
796 {
797 for (k = 0; k < t; k++)
798 {
799 loc = j + from[k];
800 table[loc] = to[k];
801 check[loc] = from[k];
802 }
803
804 while (table[lowzero] != 0)
805 lowzero++;
806
807 if (loc > high)
808 high = loc;
809
810 return j;
811 }
812 }
813 #define pack_vector_succeeded 0
814 assert (pack_vector_succeeded);
815 return 0;
816 }
817
818
819 static void
820 pack_table (void)
821 {
822 int i;
823 int place;
824 int state;
825
826 base = XCALLOC (short, nvectors);
827 pos = XCALLOC (short, nentries);
828 table = XCALLOC (short, MAXTABLE);
829 check = XCALLOC (short, MAXTABLE);
830
831 lowzero = 0;
832 high = 0;
833
834 for (i = 0; i < nvectors; i++)
835 base[i] = MINSHORT;
836
837 for (i = 0; i < MAXTABLE; i++)
838 check[i] = -1;
839
840 for (i = 0; i < nentries; i++)
841 {
842 state = matching_state (i);
843
844 if (state < 0)
845 place = pack_vector (i);
846 else
847 place = base[state];
848
849 pos[i] = place;
850 base[order[i]] = place;
851 }
852
853 for (i = 0; i < nvectors; i++)
854 {
855 XFREE (froms[i]);
856 XFREE (tos[i]);
857 }
858
859 XFREE (froms);
860 XFREE (tos);
861 XFREE (pos);
862 }
863
864 /* the following functions output yytable, yycheck
865 and the vectors whose elements index the portion starts */
866
867 static void
868 output_base (void)
869 {
870 /* Output pact. */
871 output_table_data (&format_obstack, base,
872 base[0], 1, nstates);
873 muscle_insert ("pact", obstack_finish (&format_obstack));
874
875 /* Output pgoto. */
876 output_table_data (&format_obstack, base,
877 base[nstates], nstates + 1, nvectors);
878 muscle_insert ("pgoto", obstack_finish (&format_obstack));
879
880 XFREE (base);
881 }
882
883
884 static void
885 output_table (void)
886 {
887 output_table_data (&format_obstack, table,
888 table[0], 1, high + 1);
889 muscle_insert ("table", obstack_finish (&format_obstack));
890 XFREE (table);
891 }
892
893
894 static void
895 output_check (void)
896 {
897 output_table_data (&format_obstack, check,
898 check[0], 1, high + 1);
899 muscle_insert ("check", obstack_finish (&format_obstack));
900 XFREE (check);
901 }
902
903 /*-----------------------------------------------------------------.
904 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
905 | and yycheck. |
906 `-----------------------------------------------------------------*/
907
908 static void
909 output_actions (void)
910 {
911 size_t i;
912 nvectors = nstates + nvars;
913
914 froms = XCALLOC (short *, nvectors);
915 tos = XCALLOC (short *, nvectors);
916 tally = XCALLOC (short, nvectors);
917 width = XCALLOC (short, nvectors);
918
919 token_actions ();
920 bitsetv_free (LA);
921 XFREE (LAruleno);
922
923 goto_actions ();
924 XFREE (goto_map + ntokens);
925 XFREE (from_state);
926 XFREE (to_state);
927
928 sort_actions ();
929 pack_table ();
930
931 output_base ();
932 output_table ();
933
934 output_check ();
935
936 for (i = 0; i < nstates; ++i)
937 {
938 free (states[i]->shifts);
939 XFREE (states[i]->reductions);
940 free (states[i]->errs);
941 free (states[i]);
942 }
943 XFREE (states);
944 }
945
946 \f
947 /*---------------------------.
948 | Call the skeleton parser. |
949 `---------------------------*/
950
951 static void
952 output_skeleton (void)
953 {
954 /* Store the definition of all the muscles. */
955 const char *tempdir = getenv ("TMPDIR");
956 char *tempfile = NULL;
957 FILE *out = NULL;
958 int fd;
959
960 if (tempdir == NULL)
961 tempdir = DEFAULT_TMPDIR;
962 tempfile = xmalloc (strlen (tempdir) + 11);
963 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
964 fd = mkstemp (tempfile);
965 if (fd == -1)
966 error (EXIT_FAILURE, errno, "%s", tempfile);
967
968 out = fdopen (fd, "w");
969 if (out == NULL)
970 error (EXIT_FAILURE, errno, "%s", tempfile);
971
972 /* There are no comments, especially not `#': we do want M4 expansion
973 after `#': think of CPP macros! */
974 fputs ("m4_changecom()\n", out);
975 fputs ("m4_init()\n", out);
976
977 fputs ("m4_define([b4_actions], \n[[", out);
978 actions_output (out);
979 fputs ("]])\n\n", out);
980
981 fputs ("m4_define([b4_guards], \n[[", out);
982 guards_output (out);
983 fputs ("]])\n\n", out);
984
985 fputs ("m4_define([b4_tokens], \n[", out);
986 token_definitions_output (out);
987 fputs ("])\n\n", out);
988
989 muscles_m4_output (out);
990
991 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
992 fputs ("m4_divert_push(0)dnl\n", out);
993 xfclose (out);
994
995 /* Invoke m4 on the definition of the muscles, and the skeleton. */
996 {
997 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
998 const char *m4 = getenv ("M4");
999 if (!m4)
1000 m4 = M4;
1001 if (!bison_pkgdatadir)
1002 bison_pkgdatadir = PKGDATADIR;
1003 if (trace_flag)
1004 fprintf (stderr,
1005 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1006 m4, bison_pkgdatadir, tempfile, skeleton);
1007 skel_in = readpipe (m4,
1008 "-I", bison_pkgdatadir,
1009 "m4sugar/m4sugar.m4",
1010 tempfile,
1011 skeleton,
1012 NULL);
1013 if (!skel_in)
1014 error (EXIT_FAILURE, errno, "cannot run m4");
1015 skel_lex ();
1016
1017 /* If `debugging', keep this file alive. */
1018 if (!trace_flag)
1019 unlink (tempfile);
1020 }
1021 }
1022
1023 static void
1024 prepare (void)
1025 {
1026 MUSCLE_INSERT_INT ("last", high);
1027 MUSCLE_INSERT_INT ("flag", MINSHORT);
1028 MUSCLE_INSERT_INT ("pure", pure_parser);
1029 MUSCLE_INSERT_INT ("nsym", nsyms);
1030 MUSCLE_INSERT_INT ("debug", debug_flag);
1031 MUSCLE_INSERT_INT ("final", final_state);
1032 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
1033 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1034 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1035
1036 /* FIXME: This is wrong: the muscles should decide whether they hold
1037 a copy or not, but the situation is too obscure currently. */
1038 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1039 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1040 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1041 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1042
1043 MUSCLE_INSERT_INT ("nnts", nvars);
1044 MUSCLE_INSERT_INT ("nrules", nrules);
1045 MUSCLE_INSERT_INT ("nstates", nstates);
1046 MUSCLE_INSERT_INT ("ntokens", ntokens);
1047
1048 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1049 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1050
1051 /* Copy definitions in directive. */
1052 obstack_1grow (&attrs_obstack, 0);
1053 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1054
1055 /* Find the right skeleton file. */
1056 if (!skeleton)
1057 {
1058 if (semantic_parser)
1059 skeleton = "bison.hairy";
1060 else
1061 skeleton = "bison.simple";
1062 }
1063
1064 /* Parse the skeleton file and output the needed parsers. */
1065 muscle_insert ("skeleton", skeleton);
1066 }
1067
1068
1069 /*----------------------------------------------------------.
1070 | Output the parsing tables and the parser code to ftable. |
1071 `----------------------------------------------------------*/
1072
1073 void
1074 output (void)
1075 {
1076 obstack_init (&format_obstack);
1077
1078 prepare_tokens ();
1079 prepare_rules ();
1080 prepare_states ();
1081 output_actions ();
1082
1083 prepare ();
1084
1085 /* Process the selected skeleton file. */
1086 output_skeleton ();
1087
1088 obstack_free (&muscle_obstack, NULL);
1089 obstack_free (&format_obstack, NULL);
1090 obstack_free (&action_obstack, NULL);
1091 obstack_free (&attrs_obstack, NULL);
1092 }