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