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