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