]> git.saurik.com Git - bison.git/blob - src/output.c
* src/state.h, src/state.c (errs_new, errs_dup): New.
[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 int nreds = redp ? redp->nreds : 0;
330 shifts *shiftp = state->shifts;
331 errs *errp = state->errs;
332 /* set nonzero to inhibit having any default reduction */
333 int nodefault = 0;
334
335 for (i = 0; i < ntokens; i++)
336 actrow[i] = 0;
337
338 if (nreds >= 1)
339 {
340 int j;
341 /* loop over all the rules available here which require
342 lookahead */
343 for (i = state->nlookaheads - 1; i >= 0; --i)
344 /* and find each token which the rule finds acceptable
345 to come next */
346 for (j = 0; j < ntokens; j++)
347 /* and record this rule as the rule to use if that
348 token follows. */
349 if (BITISSET (LA (state->lookaheadsp + i), j))
350 actrow[j] = -LAruleno[state->lookaheadsp + i];
351 }
352
353 /* Now see which tokens are allowed for shifts in this state. For
354 them, record the shift as the thing to do. So shift is preferred
355 to reduce. */
356 for (i = 0; i < shiftp->nshifts; i++)
357 {
358 int symbol;
359 int shift_state = shiftp->shifts[i];
360 if (!shift_state)
361 continue;
362
363 symbol = state_table[shift_state]->accessing_symbol;
364
365 if (ISVAR (symbol))
366 break;
367
368 actrow[symbol] = shift_state;
369
370 /* Do not use any default reduction if there is a shift for
371 error */
372 if (symbol == error_token_number)
373 nodefault = 1;
374 }
375
376 /* See which tokens are an explicit error in this state (due to
377 %nonassoc). For them, record MINSHORT as the action. */
378 for (i = 0; i < errp->nerrs; i++)
379 {
380 int symbol = errp->errs[i];
381 actrow[symbol] = MINSHORT;
382 }
383
384 /* Now find the most common reduction and make it the default action
385 for this state. */
386
387 if (nreds >= 1 && !nodefault)
388 {
389 if (state->consistent)
390 default_rule = redp->rules[0];
391 else
392 {
393 int max = 0;
394 for (i = 0; i < state->nlookaheads; i++)
395 {
396 int count = 0;
397 int rule = -LAruleno[state->lookaheadsp + i];
398 int j;
399
400 for (j = 0; j < ntokens; j++)
401 if (actrow[j] == rule)
402 count++;
403
404 if (count > max)
405 {
406 max = count;
407 default_rule = rule;
408 }
409 }
410
411 /* actions which match the default are replaced with zero,
412 which means "use the default" */
413
414 if (max > 0)
415 {
416 int j;
417 for (j = 0; j < ntokens; j++)
418 if (actrow[j] == default_rule)
419 actrow[j] = 0;
420
421 default_rule = -default_rule;
422 }
423 }
424 }
425
426 /* If have no default rule, the default is an error.
427 So replace any action which says "error" with "use default". */
428
429 if (default_rule == 0)
430 for (i = 0; i < ntokens; i++)
431 if (actrow[i] == MINSHORT)
432 actrow[i] = 0;
433
434 return default_rule;
435 }
436
437
438 static void
439 save_row (int state)
440 {
441 int i;
442 int count;
443 short *sp;
444 short *sp1;
445 short *sp2;
446
447 count = 0;
448 for (i = 0; i < ntokens; i++)
449 if (actrow[i] != 0)
450 count++;
451
452 if (count == 0)
453 return;
454
455 froms[state] = sp1 = sp = XCALLOC (short, count);
456 tos[state] = sp2 = XCALLOC (short, count);
457
458 for (i = 0; i < ntokens; i++)
459 if (actrow[i] != 0)
460 {
461 *sp1++ = i;
462 *sp2++ = actrow[i];
463 }
464
465 tally[state] = count;
466 width[state] = sp1[-1] - sp[0] + 1;
467 }
468
469
470 /*------------------------------------------------------------------.
471 | Figure out the actions for the specified state, indexed by |
472 | lookahead token type. |
473 | |
474 | The YYDEFACT table is output now. The detailed info is saved for |
475 | putting into YYTABLE later. |
476 `------------------------------------------------------------------*/
477
478 static void
479 token_actions (void)
480 {
481 int i;
482 short *yydefact = XCALLOC (short, nstates);
483
484 actrow = XCALLOC (short, ntokens);
485 for (i = 0; i < nstates; ++i)
486 {
487 yydefact[i] = action_row (state_table[i]);
488 save_row (i);
489 }
490
491 output_table_data (&format_obstack, yydefact,
492 yydefact[0], 1, nstates);
493 muscle_insert ("defact", obstack_finish (&format_obstack));
494
495 XFREE (actrow);
496 XFREE (yydefact);
497 }
498
499
500 /*-----------------------------.
501 | Output the actions to OOUT. |
502 `-----------------------------*/
503
504 static void
505 actions_output (FILE *out, size_t *line)
506 {
507 int rule;
508 for (rule = 1; rule < nrules + 1; ++rule)
509 if (rule_table[rule].action)
510 {
511 fprintf (out, " case %d:\n", rule);
512
513 if (!no_lines_flag)
514 fprintf (out, muscle_find ("linef"),
515 rule_table[rule].action_line,
516 quotearg_style (c_quoting_style,
517 muscle_find ("filename")));
518 /* As a Bison extension, add the ending semicolon. Since some
519 Yacc don't do that, help people using bison as a Yacc
520 finding their missing semicolons. */
521 fprintf (out, "{ %s%s }\n break;\n\n",
522 rule_table[rule].action,
523 yacc_flag ? ";" : "");
524
525 /* We always output 4 '\n' per action. */
526 *line += 4;
527 /* Plus one if !no_lines_flag. */
528 if (!no_lines_flag)
529 ++*line;
530 /* Get the number of lines written by the user. */
531 *line += get_lines_number (rule_table[rule].action);
532 }
533 }
534
535
536 /*----------------------------.
537 | Output the guards to OOUT. |
538 `----------------------------*/
539
540 static void
541 guards_output (FILE *out, size_t *line)
542 {
543 int rule;
544 for (rule = 1; rule < nrules + 1; ++rule)
545 if (rule_table[rule].action)
546 {
547 fprintf (out, " case %d:\n", rule);
548
549 if (!no_lines_flag)
550 fprintf (out, muscle_find ("linef"),
551 rule_table[rule].guard_line,
552 quotearg_style (c_quoting_style,
553 muscle_find ("filename")));
554 fprintf (out, "{ %s; }\n break;\n\n",
555 rule_table[rule].guard);
556
557 /* We always output 4 '\n' per action. */
558 *line += 4;
559 /* Plus one if !no_lines_flag. */
560 if (!no_lines_flag)
561 ++*line;
562 /* Get the number of lines written by the user. */
563 *line += get_lines_number (rule_table[rule].guard);
564 }
565 }
566
567
568 static void
569 save_column (int symbol, int default_state)
570 {
571 int i;
572 short *sp;
573 short *sp1;
574 short *sp2;
575 int count;
576 int symno = symbol - ntokens + nstates;
577
578 short begin = goto_map[symbol];
579 short end = goto_map[symbol + 1];
580
581 count = 0;
582 for (i = begin; i < end; i++)
583 if (to_state[i] != default_state)
584 count++;
585
586 if (count == 0)
587 return;
588
589 froms[symno] = sp1 = sp = XCALLOC (short, count);
590 tos[symno] = sp2 = XCALLOC (short, count);
591
592 for (i = begin; i < end; i++)
593 if (to_state[i] != default_state)
594 {
595 *sp1++ = from_state[i];
596 *sp2++ = to_state[i];
597 }
598
599 tally[symno] = count;
600 width[symno] = sp1[-1] - sp[0] + 1;
601 }
602
603 static int
604 default_goto (int symbol)
605 {
606 int i;
607 int m = goto_map[symbol];
608 int n = goto_map[symbol + 1];
609 int default_state = -1;
610 int max = 0;
611
612 if (m == n)
613 return -1;
614
615 for (i = 0; i < nstates; i++)
616 state_count[i] = 0;
617
618 for (i = m; i < n; i++)
619 state_count[to_state[i]]++;
620
621 for (i = 0; i < nstates; i++)
622 if (state_count[i] > max)
623 {
624 max = state_count[i];
625 default_state = i;
626 }
627
628 return default_state;
629 }
630
631
632 /*-------------------------------------------------------------------.
633 | Figure out what to do after reducing with each rule, depending on |
634 | the saved state from before the beginning of parsing the data that |
635 | matched this rule. |
636 | |
637 | The YYDEFGOTO table is output now. The detailed info is saved for |
638 | putting into YYTABLE later. |
639 `-------------------------------------------------------------------*/
640
641 static void
642 goto_actions (void)
643 {
644 int i;
645 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
646
647 state_count = XCALLOC (short, nstates);
648 for (i = ntokens; i < nsyms; ++i)
649 {
650 int default_state = default_goto (i);
651 save_column (i, default_state);
652 yydefgoto[i - ntokens] = default_state;
653 }
654
655 output_table_data (&format_obstack, yydefgoto,
656 yydefgoto[0], 1, nsyms - ntokens);
657 muscle_insert ("defgoto", obstack_finish (&format_obstack));
658
659 XFREE (state_count);
660 XFREE (yydefgoto);
661 }
662
663
664 /* The next few functions decide how to pack the actions and gotos
665 information into yytable. */
666
667 static void
668 sort_actions (void)
669 {
670 int i;
671
672 order = XCALLOC (short, nvectors);
673 nentries = 0;
674
675 for (i = 0; i < nvectors; i++)
676 if (tally[i] > 0)
677 {
678 int k;
679 int t = tally[i];
680 int w = width[i];
681 int j = nentries - 1;
682
683 while (j >= 0 && (width[order[j]] < w))
684 j--;
685
686 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
687 j--;
688
689 for (k = nentries - 1; k > j; k--)
690 order[k + 1] = order[k];
691
692 order[j + 1] = i;
693 nentries++;
694 }
695 }
696
697
698 static int
699 matching_state (int vector)
700 {
701 int i = order[vector];
702 int t;
703 int w;
704 int prev;
705
706 if (i >= nstates)
707 return -1;
708
709 t = tally[i];
710 w = width[i];
711
712 for (prev = vector - 1; prev >= 0; prev--)
713 {
714 int j = order[prev];
715 int k;
716 int match = 1;
717
718 if (width[j] != w || tally[j] != t)
719 return -1;
720
721 for (k = 0; match && k < t; k++)
722 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
723 match = 0;
724
725 if (match)
726 return j;
727 }
728
729 return -1;
730 }
731
732
733 static int
734 pack_vector (int vector)
735 {
736 int i = order[vector];
737 int j;
738 int t = tally[i];
739 int loc = 0;
740 short *from = froms[i];
741 short *to = tos[i];
742
743 assert (t);
744
745 for (j = lowzero - from[0]; j < MAXTABLE; j++)
746 {
747 int k;
748 int ok = 1;
749
750 for (k = 0; ok && k < t; k++)
751 {
752 loc = j + from[k];
753 if (loc > MAXTABLE)
754 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
755
756 if (table[loc] != 0)
757 ok = 0;
758 }
759
760 for (k = 0; ok && k < vector; k++)
761 if (pos[k] == j)
762 ok = 0;
763
764 if (ok)
765 {
766 for (k = 0; k < t; k++)
767 {
768 loc = j + from[k];
769 table[loc] = to[k];
770 check[loc] = from[k];
771 }
772
773 while (table[lowzero] != 0)
774 lowzero++;
775
776 if (loc > high)
777 high = loc;
778
779 return j;
780 }
781 }
782 #define pack_vector_succeeded 0
783 assert (pack_vector_succeeded);
784 return 0;
785 }
786
787
788 static void
789 pack_table (void)
790 {
791 int i;
792 int place;
793 int state;
794
795 base = XCALLOC (short, nvectors);
796 pos = XCALLOC (short, nentries);
797 table = XCALLOC (short, MAXTABLE);
798 check = XCALLOC (short, MAXTABLE);
799
800 lowzero = 0;
801 high = 0;
802
803 for (i = 0; i < nvectors; i++)
804 base[i] = MINSHORT;
805
806 for (i = 0; i < MAXTABLE; i++)
807 check[i] = -1;
808
809 for (i = 0; i < nentries; i++)
810 {
811 state = matching_state (i);
812
813 if (state < 0)
814 place = pack_vector (i);
815 else
816 place = base[state];
817
818 pos[i] = place;
819 base[order[i]] = place;
820 }
821
822 for (i = 0; i < nvectors; i++)
823 {
824 XFREE (froms[i]);
825 XFREE (tos[i]);
826 }
827
828 XFREE (froms);
829 XFREE (tos);
830 XFREE (pos);
831 }
832
833 /* the following functions output yytable, yycheck
834 and the vectors whose elements index the portion starts */
835
836 static void
837 output_base (void)
838 {
839 /* Output pact. */
840 output_table_data (&format_obstack, base,
841 base[0], 1, nstates);
842 muscle_insert ("pact", obstack_finish (&format_obstack));
843
844 /* Output pgoto. */
845 output_table_data (&format_obstack, base,
846 base[nstates], nstates + 1, nvectors);
847 muscle_insert ("pgoto", obstack_finish (&format_obstack));
848
849 XFREE (base);
850 }
851
852
853 static void
854 output_table (void)
855 {
856 output_table_data (&format_obstack, table,
857 table[0], 1, high + 1);
858 muscle_insert ("table", obstack_finish (&format_obstack));
859 XFREE (table);
860 }
861
862
863 static void
864 output_check (void)
865 {
866 output_table_data (&format_obstack, check,
867 check[0], 1, high + 1);
868 muscle_insert ("check", obstack_finish (&format_obstack));
869 XFREE (check);
870 }
871
872 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
873 and yycheck. */
874
875 static void
876 output_actions (void)
877 {
878 int i;
879 nvectors = nstates + nvars;
880
881 froms = XCALLOC (short *, nvectors);
882 tos = XCALLOC (short *, nvectors);
883 tally = XCALLOC (short, nvectors);
884 width = XCALLOC (short, nvectors);
885
886 token_actions ();
887 XFREE (LA);
888 XFREE (LAruleno);
889
890 goto_actions ();
891 XFREE (goto_map + ntokens);
892 XFREE (from_state);
893 XFREE (to_state);
894
895 sort_actions ();
896 pack_table ();
897
898 output_base ();
899 output_table ();
900
901 output_check ();
902
903 for (i = 0; i < nstates; ++i)
904 {
905 free (state_table[i]->shifts);
906 XFREE (state_table[i]->reductions);
907 free (state_table[i]->errs);
908 free (state_table[i]);
909 }
910 XFREE (state_table);
911 }
912
913 \f
914 /*------------------------------------------------------------.
915 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
916 | and do the muscle substitution. |
917 `------------------------------------------------------------*/
918
919 static void
920 output_parser (const char *skel_filename, FILE *out)
921 {
922 int c;
923 FILE *fskel;
924 size_t output_line;
925 size_t skeleton_line;
926
927 fskel = xfopen (skel_filename, "r");
928
929 /* New output code. */
930 output_line = 1;
931 skeleton_line = 1;
932 c = getc (fskel);
933 while (c != EOF)
934 {
935 if (c != '%')
936 {
937 if (c == '\n')
938 {
939 ++output_line;
940 ++skeleton_line;
941 }
942 putc (c, out);
943 c = getc (fskel);
944 }
945 else if ((c = getc (fskel)) == '%')
946 {
947 /* Read the muscle. */
948 const char *muscle_key = 0;
949 const char *muscle_value = 0;
950
951 while (isalnum (c = getc (fskel)) || c == '-')
952 obstack_1grow (&muscle_obstack, c);
953 obstack_1grow (&muscle_obstack, 0);
954
955 /* Output the right value, or see if it's something special. */
956 muscle_key = obstack_finish (&muscle_obstack);
957 muscle_value = muscle_find (muscle_key);
958 if (!strcmp (muscle_key, "actions"))
959 actions_output (out, &output_line);
960 else if (!strcmp (muscle_key, "guards"))
961 guards_output (out, &output_line);
962 else if (!strcmp (muscle_key, "line"))
963 fprintf (out, "%d", output_line);
964 else if (!strcmp (muscle_key, "skeleton-line"))
965 fprintf (out, "%d", skeleton_line);
966 else if (muscle_value)
967 {
968 fputs (muscle_value, out);
969 output_line += get_lines_number (muscle_value);
970 }
971 else
972 {
973 fputs ("%%", out);
974 fputs (muscle_key, out);
975 }
976 }
977 else
978 putc ('%', out);
979 }
980
981 /* End. */
982 xfclose (fskel);
983 }
984
985 /*----------------------------------------.
986 | Prepare the master parser to be output |
987 `----------------------------------------*/
988
989 static void
990 output_master_parser (void)
991 {
992 FILE *parser = xfopen (parser_file_name, "w");
993 if (!skeleton)
994 {
995 if (semantic_parser)
996 skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
997 else
998 skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
999 }
1000 muscle_insert ("skeleton", skeleton);
1001 muscle_insert ("parser-file-name", parser_file_name);
1002
1003 output_parser (skeleton, parser);
1004 xfclose (parser);
1005 }
1006
1007
1008 /* FIXME. */
1009
1010 #define MUSCLE_INSERT_INT(Key, Value) \
1011 { \
1012 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1013 obstack_1grow (&muscle_obstack, 0); \
1014 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1015 }
1016
1017 #define MUSCLE_INSERT_STRING(Key, Value) \
1018 { \
1019 obstack_sgrow (&muscle_obstack, Value); \
1020 obstack_1grow (&muscle_obstack, 0); \
1021 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1022 }
1023
1024 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1025 { \
1026 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1027 obstack_1grow (&muscle_obstack, 0); \
1028 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1029 }
1030
1031 static void
1032 prepare (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);
1043
1044 MUSCLE_INSERT_INT ("nnts", nvars);
1045 MUSCLE_INSERT_INT ("nrules", nrules);
1046 MUSCLE_INSERT_INT ("nstates", nstates);
1047 MUSCLE_INSERT_INT ("ntokens", ntokens);
1048
1049 MUSCLE_INSERT_INT ("locations-flag", locations_flag);
1050 }
1051
1052
1053 /*-------------------------.
1054 | Output the header file. |
1055 `-------------------------*/
1056
1057 static void
1058 header_output (void)
1059 {
1060 FILE *out = xfopen (spec_defines_file, "w");
1061 char *macro_name = compute_header_macro ();
1062
1063 fprintf (out, "#ifndef %s\n", macro_name);
1064 fprintf (out, "# define %s\n\n", macro_name);
1065
1066 fputs (muscle_find ("tokendef"), out);
1067 fprintf (out, "\
1068 #ifndef YYSTYPE\n\
1069 typedef %s
1070 yystype;\n\
1071 # define YYSTYPE yystype\n\
1072 #endif\n",
1073 muscle_find ("stype"));
1074
1075 if (!pure_parser)
1076 fprintf (out, "\nextern YYSTYPE %slval;\n",
1077 spec_name_prefix);
1078 if (semantic_parser)
1079 {
1080 int i;
1081
1082 for (i = ntokens; i < nsyms; i++)
1083 /* don't make these for dummy nonterminals made by gensym. */
1084 if (*tags[i] != '@')
1085 fprintf (out, "# define NT%s\t%d\n", tags[i], i);
1086 }
1087
1088 fprintf (out, "\n#endif /* not %s */\n", macro_name);
1089 free (macro_name);
1090 xfclose (out);
1091 }
1092
1093
1094 /*----------------------------------------------------------.
1095 | Output the parsing tables and the parser code to ftable. |
1096 `----------------------------------------------------------*/
1097
1098 void
1099 output (void)
1100 {
1101 obstack_init (&format_obstack);
1102
1103 output_token_translations ();
1104 output_gram ();
1105
1106 XFREE (ritem);
1107 if (semantic_parser)
1108 output_stos ();
1109 output_rule_data ();
1110 XFREE (user_toknums);
1111 output_actions ();
1112
1113 prepare ();
1114 /* Copy definitions in directive. */
1115 obstack_1grow (&attrs_obstack, 0);
1116 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1117
1118 /* Output the parser. */
1119 output_master_parser ();
1120 /* Output the header if needed. */
1121 if (defines_flag)
1122 header_output ();
1123
1124 free (rule_table + 1);
1125 obstack_free (&muscle_obstack, NULL);
1126 obstack_free (&format_obstack, NULL);
1127 obstack_free (&action_obstack, NULL);
1128 obstack_free (&attrs_obstack, NULL);
1129 }