]> git.saurik.com Git - bison.git/blame_incremental - src/output.c
* doc/bison.texinfo: Update copyright date.
[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/* FIXME. */
151
152static inline void
153output_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
179static void
180output_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
189static void
190output_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
227static void
228output_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
240static void
241output_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
335static int
336action_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
449static void
450save_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
489static void
490token_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
515void
516actions_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
543void
544guards_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
567void
568token_definitions_output (FILE *out)
569{
570 int i;
571 int first = 1;
572 for (i = 0; i < ntokens; ++i)
573 {
574 bucket *symbol = symbols[i];
575 int number = symbol->user_token_number;
576
577 if (number == SALIAS)
578 continue;
579 /* Skip error token. */
580 if (symbol->value == error_token_number)
581 continue;
582 if (symbol->tag[0] == '\'')
583 continue; /* skip literal character */
584 if (symbol->tag[0] == '\"')
585 {
586 /* use literal string only if given a symbol with an alias */
587 if (symbol->alias)
588 symbol = symbol->alias;
589 else
590 continue;
591 }
592
593 /* Don't #define nonliteral tokens whose names contain periods
594 or '$' (as does the default value of the EOF token). */
595 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
596 continue;
597
598 fprintf (out, "%s [[[%s]], [%d]]",
599 first ? "" : ",\n", symbol->tag, number);
600 if (semantic_parser)
601 /* FIXME: This is probably wrong, and should be just as
602 above. --akim. */
603 fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value);
604 first = 0;
605 }
606}
607
608
609static void
610save_column (int symbol, int default_state)
611{
612 int i;
613 short *sp;
614 short *sp1;
615 short *sp2;
616 int count;
617 int symno = symbol - ntokens + nstates;
618
619 short begin = goto_map[symbol];
620 short end = goto_map[symbol + 1];
621
622 count = 0;
623 for (i = begin; i < end; i++)
624 if (to_state[i] != default_state)
625 count++;
626
627 if (count == 0)
628 return;
629
630 froms[symno] = sp1 = sp = XCALLOC (short, count);
631 tos[symno] = sp2 = XCALLOC (short, count);
632
633 for (i = begin; i < end; i++)
634 if (to_state[i] != default_state)
635 {
636 *sp1++ = from_state[i];
637 *sp2++ = to_state[i];
638 }
639
640 tally[symno] = count;
641 width[symno] = sp1[-1] - sp[0] + 1;
642}
643
644static int
645default_goto (int symbol)
646{
647 size_t i;
648 size_t m = goto_map[symbol];
649 size_t n = goto_map[symbol + 1];
650 int default_state = -1;
651 int max = 0;
652
653 if (m == n)
654 return -1;
655
656 for (i = 0; i < nstates; i++)
657 state_count[i] = 0;
658
659 for (i = m; i < n; i++)
660 state_count[to_state[i]]++;
661
662 for (i = 0; i < nstates; i++)
663 if (state_count[i] > max)
664 {
665 max = state_count[i];
666 default_state = i;
667 }
668
669 return default_state;
670}
671
672
673/*-------------------------------------------------------------------.
674| Figure out what to do after reducing with each rule, depending on |
675| the saved state from before the beginning of parsing the data that |
676| matched this rule. |
677| |
678| The YYDEFGOTO table is output now. The detailed info is saved for |
679| putting into YYTABLE later. |
680`-------------------------------------------------------------------*/
681
682static void
683goto_actions (void)
684{
685 int i;
686 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
687
688 state_count = XCALLOC (short, nstates);
689 for (i = ntokens; i < nsyms; ++i)
690 {
691 int default_state = default_goto (i);
692 save_column (i, default_state);
693 yydefgoto[i - ntokens] = default_state;
694 }
695
696 output_table_data (&format_obstack, yydefgoto,
697 yydefgoto[0], 1, nsyms - ntokens);
698 muscle_insert ("defgoto", obstack_finish (&format_obstack));
699
700 XFREE (state_count);
701 XFREE (yydefgoto);
702}
703
704
705/* The next few functions decide how to pack the actions and gotos
706 information into yytable. */
707
708static void
709sort_actions (void)
710{
711 int i;
712
713 order = XCALLOC (short, nvectors);
714 nentries = 0;
715
716 for (i = 0; i < nvectors; i++)
717 if (tally[i] > 0)
718 {
719 int k;
720 int t = tally[i];
721 int w = width[i];
722 int j = nentries - 1;
723
724 while (j >= 0 && (width[order[j]] < w))
725 j--;
726
727 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
728 j--;
729
730 for (k = nentries - 1; k > j; k--)
731 order[k + 1] = order[k];
732
733 order[j + 1] = i;
734 nentries++;
735 }
736}
737
738
739static int
740matching_state (int vector)
741{
742 int i = order[vector];
743 int t;
744 int w;
745 int prev;
746
747 if (i >= (int) nstates)
748 return -1;
749
750 t = tally[i];
751 w = width[i];
752
753 for (prev = vector - 1; prev >= 0; prev--)
754 {
755 int j = order[prev];
756 int k;
757 int match = 1;
758
759 if (width[j] != w || tally[j] != t)
760 return -1;
761
762 for (k = 0; match && k < t; k++)
763 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
764 match = 0;
765
766 if (match)
767 return j;
768 }
769
770 return -1;
771}
772
773
774static int
775pack_vector (int vector)
776{
777 int i = order[vector];
778 int j;
779 int t = tally[i];
780 int loc = 0;
781 short *from = froms[i];
782 short *to = tos[i];
783
784 assert (t);
785
786 for (j = lowzero - from[0]; j < MAXTABLE; j++)
787 {
788 int k;
789 int ok = 1;
790
791 for (k = 0; ok && k < t; k++)
792 {
793 loc = j + from[k];
794 if (loc > MAXTABLE)
795 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
796
797 if (table[loc] != 0)
798 ok = 0;
799 }
800
801 for (k = 0; ok && k < vector; k++)
802 if (pos[k] == j)
803 ok = 0;
804
805 if (ok)
806 {
807 for (k = 0; k < t; k++)
808 {
809 loc = j + from[k];
810 table[loc] = to[k];
811 check[loc] = from[k];
812 }
813
814 while (table[lowzero] != 0)
815 lowzero++;
816
817 if (loc > high)
818 high = loc;
819
820 return j;
821 }
822 }
823#define pack_vector_succeeded 0
824 assert (pack_vector_succeeded);
825 return 0;
826}
827
828
829static void
830pack_table (void)
831{
832 int i;
833 int place;
834 int state;
835
836 base = XCALLOC (short, nvectors);
837 pos = XCALLOC (short, nentries);
838 table = XCALLOC (short, MAXTABLE);
839 check = XCALLOC (short, MAXTABLE);
840
841 lowzero = 0;
842 high = 0;
843
844 for (i = 0; i < nvectors; i++)
845 base[i] = MINSHORT;
846
847 for (i = 0; i < MAXTABLE; i++)
848 check[i] = -1;
849
850 for (i = 0; i < nentries; i++)
851 {
852 state = matching_state (i);
853
854 if (state < 0)
855 place = pack_vector (i);
856 else
857 place = base[state];
858
859 pos[i] = place;
860 base[order[i]] = place;
861 }
862
863 for (i = 0; i < nvectors; i++)
864 {
865 XFREE (froms[i]);
866 XFREE (tos[i]);
867 }
868
869 XFREE (froms);
870 XFREE (tos);
871 XFREE (pos);
872}
873
874/* the following functions output yytable, yycheck
875 and the vectors whose elements index the portion starts */
876
877static void
878output_base (void)
879{
880 /* Output pact. */
881 output_table_data (&format_obstack, base,
882 base[0], 1, nstates);
883 muscle_insert ("pact", obstack_finish (&format_obstack));
884
885 /* Output pgoto. */
886 output_table_data (&format_obstack, base,
887 base[nstates], nstates + 1, nvectors);
888 muscle_insert ("pgoto", obstack_finish (&format_obstack));
889
890 XFREE (base);
891}
892
893
894static void
895output_table (void)
896{
897 output_table_data (&format_obstack, table,
898 table[0], 1, high + 1);
899 muscle_insert ("table", obstack_finish (&format_obstack));
900 XFREE (table);
901}
902
903
904static void
905output_check (void)
906{
907 output_table_data (&format_obstack, check,
908 check[0], 1, high + 1);
909 muscle_insert ("check", obstack_finish (&format_obstack));
910 XFREE (check);
911}
912
913/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
914 and yycheck. */
915
916static void
917output_actions (void)
918{
919 size_t i;
920 nvectors = nstates + nvars;
921
922 froms = XCALLOC (short *, nvectors);
923 tos = XCALLOC (short *, nvectors);
924 tally = XCALLOC (short, nvectors);
925 width = XCALLOC (short, nvectors);
926
927 token_actions ();
928 bitsetv_free (LA);
929 XFREE (LAruleno);
930
931 goto_actions ();
932 XFREE (goto_map + ntokens);
933 XFREE (from_state);
934 XFREE (to_state);
935
936 sort_actions ();
937 pack_table ();
938
939 output_base ();
940 output_table ();
941
942 output_check ();
943
944 for (i = 0; i < nstates; ++i)
945 {
946 free (states[i]->shifts);
947 XFREE (states[i]->reductions);
948 free (states[i]->errs);
949 free (states[i]);
950 }
951 XFREE (states);
952}
953
954\f
955/*---------------------------.
956| Call the skeleton parser. |
957`---------------------------*/
958
959static void
960output_skeleton (void)
961{
962 /* Store the definition of all the muscles. */
963 const char *tempdir = getenv ("TMPDIR");
964 char *tempfile = NULL;
965 FILE *out = NULL;
966 int fd;
967
968 if (tempdir == NULL)
969 tempdir = DEFAULT_TMPDIR;
970 tempfile = xmalloc (strlen (tempdir) + 11);
971 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
972 fd = mkstemp (tempfile);
973 if (fd == -1)
974 error (EXIT_FAILURE, errno, "%s", tempfile);
975
976 out = fdopen (fd, "w");
977 if (out == NULL)
978 error (EXIT_FAILURE, errno, "%s", tempfile);
979
980 /* There are no comments, especially not `#': we do want M4 expansion
981 after `#': think of CPP macros! */
982 fputs ("m4_changecom()\n", out);
983 fputs ("m4_init()\n", out);
984
985 fputs ("m4_define([b4_actions], \n[[", out);
986 actions_output (out);
987 fputs ("]])\n\n", out);
988
989 fputs ("m4_define([b4_guards], \n[[", out);
990 guards_output (out);
991 fputs ("]])\n\n", out);
992
993 fputs ("m4_define([b4_tokens], \n[", out);
994 token_definitions_output (out);
995 fputs ("])\n\n", out);
996
997 muscles_m4_output (out);
998
999 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1000 fputs ("m4_divert_push(0)dnl\n", out);
1001 xfclose (out);
1002
1003 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1004 {
1005 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1006 const char *m4 = getenv ("M4");
1007 if (!m4)
1008 m4 = M4;
1009 if (!bison_pkgdatadir)
1010 bison_pkgdatadir = PKGDATADIR;
1011 if (trace_flag)
1012 fprintf (stderr,
1013 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1014 m4, bison_pkgdatadir, tempfile, skeleton);
1015 skel_in = readpipe (m4,
1016 "-I", bison_pkgdatadir,
1017 "m4sugar/m4sugar.m4",
1018 tempfile,
1019 skeleton,
1020 NULL);
1021 if (!skel_in)
1022 error (EXIT_FAILURE, errno, "cannot run m4");
1023 skel_lex ();
1024
1025 /* If `debugging', keep this file alive. */
1026 if (!trace_flag)
1027 unlink (tempfile);
1028 }
1029}
1030
1031static void
1032prepare (void)
1033{
1034 MUSCLE_INSERT_INT ("last", high);
1035 MUSCLE_INSERT_INT ("flag", MINSHORT);
1036 MUSCLE_INSERT_INT ("pure", pure_parser);
1037 MUSCLE_INSERT_INT ("nsym", nsyms);
1038 MUSCLE_INSERT_INT ("debug", debug_flag);
1039 MUSCLE_INSERT_INT ("final", final_state);
1040 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
1041 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1042 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1043
1044 /* FIXME: This is wrong: the muscles should decide whether they hold
1045 a copy or not, but the situation is too obscure currently. */
1046 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1047 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1048 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1049 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1050
1051 MUSCLE_INSERT_INT ("nnts", nvars);
1052 MUSCLE_INSERT_INT ("nrules", nrules);
1053 MUSCLE_INSERT_INT ("nstates", nstates);
1054 MUSCLE_INSERT_INT ("ntokens", ntokens);
1055
1056 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1057 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1058
1059 /* Copy definitions in directive. */
1060 obstack_1grow (&attrs_obstack, 0);
1061 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1062
1063 /* Find the right skeleton file. */
1064 if (!skeleton)
1065 {
1066 if (semantic_parser)
1067 skeleton = "bison.hairy";
1068 else
1069 skeleton = "bison.simple";
1070 }
1071
1072 /* Parse the skeleton file and output the needed parsers. */
1073 muscle_insert ("skeleton", skeleton);
1074}
1075
1076
1077/*----------------------------------------------------------.
1078| Output the parsing tables and the parser code to ftable. |
1079`----------------------------------------------------------*/
1080
1081void
1082output (void)
1083{
1084 obstack_init (&format_obstack);
1085
1086 output_token_translations ();
1087 output_gram ();
1088
1089 if (semantic_parser)
1090 output_stos ();
1091 output_rule_data ();
1092 output_actions ();
1093
1094 prepare ();
1095
1096 /* Process the selected skeleton file. */
1097 output_skeleton ();
1098
1099 obstack_free (&muscle_obstack, NULL);
1100 obstack_free (&format_obstack, NULL);
1101 obstack_free (&action_obstack, NULL);
1102 obstack_free (&attrs_obstack, NULL);
1103}