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