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