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