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