]>
git.saurik.com Git - bison.git/blob - src/output.c
1 /* Output the generated parsing program for bison,
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.
4 This file is part of Bison, the GNU Compiler Compiler.
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)
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.
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
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.
26 yytranslate = vector mapping yylex's token numbers into bison's token
29 ** yytname = vector of string-names indexed by bison token number
31 ** yytoknum = vector of yylex token numbers corresponding to entries
34 yyrline = vector of line-numbers of all rules. For yydebug printouts.
36 yyrhs = vector of items of all rules.
37 This is exactly what ritems contains. For yydebug and for semantic
40 yyprhs[r] = index in yyrhs of first item for rule r.
42 yyr1[r] = symbol number of symbol that rule r derives.
44 yyr2[r] = number of symbols composing right hand side of rule r.
46 * yystos[s] = the symbol number of the symbol that leads to state s.
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.
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.
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.
60 If the value in yytable is positive,
61 we shift the token and go to that state.
63 If the value is negative, it is minus a rule number to reduce by.
65 If the value is zero, the default action from yydefact[s] is used.
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.
74 yytable = a vector filled with portions for different uses,
75 found via yypact and yypgoto.
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.
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.
88 YYFINAL = the state number of the termination state.
89 YYFLAG = most negative short int. Used to flag ??
103 #include "conflicts.h"
104 #include "muscle_tab.h"
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
;
123 struct obstack muscle_obstack
;
124 static struct obstack format_obstack
;
126 int error_verbose
= 0;
128 /* Returns the number of lines of S. */
130 get_lines_number (const char *s
)
135 for (i
= 0; s
[i
]; ++i
)
146 output_table_data (struct obstack
*oout
,
155 obstack_fgrow1 (oout
, "%6d", first
);
156 for (i
= begin
; i
< end
; ++i
)
158 obstack_1grow (oout
, ',');
161 obstack_sgrow (oout
, "\n ");
166 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
168 obstack_1grow (oout
, 0);
173 output_token_translations (void)
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
);
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
,
195 muscle_insert ("prhs", obstack_finish (&format_obstack
));
198 size_t yyrhs_size
= 1;
202 for (sp
= ritem
+ 1; *sp
; sp
++)
204 yyrhs
= XMALLOC (short, yyrhs_size
);
206 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
207 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
209 output_table_data (&format_obstack
, yyrhs
,
210 ritem
[0], 1, yyrhs_size
);
211 muscle_insert ("rhs", obstack_finish (&format_obstack
));
217 if (!semantic_parser
)
218 obstack_sgrow (&table_obstack
, "\n#endif\n");
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
,
232 muscle_insert ("stos", obstack_finish (&format_obstack
));
237 output_rule_data (void)
241 short *short_tab
= NULL
;
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
,
249 muscle_insert ("rline", obstack_finish (&format_obstack
));
255 for (i
= 0; i
< nsyms
; i
++)
257 /* Be sure not to use twice the same quotearg slot. */
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
263 int strsize
= strlen (cp
) + 2;
265 if (j
+ strsize
> 75)
267 obstack_sgrow (&format_obstack
, "\n ");
271 obstack_sgrow (&format_obstack
, cp
);
272 obstack_sgrow (&format_obstack
, ", ");
275 /* add a NULL entry to list of tokens */
276 obstack_sgrow (&format_obstack
, "NULL");
278 /* Finish table and store. */
279 obstack_1grow (&format_obstack
, 0);
280 muscle_insert ("tname", obstack_finish (&format_obstack
));
282 /* Output YYTOKNUM. */
283 output_table_data (&format_obstack
, user_toknums
,
285 muscle_insert ("toknum", obstack_finish (&format_obstack
));
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
,
294 muscle_insert ("r1", obstack_finish (&format_obstack
));
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
,
305 muscle_insert ("r2", obstack_finish (&format_obstack
));
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. |
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 `------------------------------------------------------------------*/
324 action_row (state_t
*state
)
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 */
335 for (i
= 0; i
< ntokens
; i
++)
341 /* loop over all the rules available here which require
343 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
344 /* and find each token which the rule finds acceptable
346 for (j
= 0; j
< ntokens
; j
++)
347 /* and record this rule as the rule to use if that
349 if (BITISSET (LA (state
->lookaheadsp
+ i
), j
))
350 actrow
[j
] = -LAruleno
[state
->lookaheadsp
+ i
];
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
356 for (i
= 0; i
< shiftp
->nshifts
; i
++)
359 int shift_state
= shiftp
->shifts
[i
];
363 symbol
= state_table
[shift_state
]->accessing_symbol
;
368 actrow
[symbol
] = shift_state
;
370 /* Do not use any default reduction if there is a shift for
372 if (symbol
== error_token_number
)
376 /* See which tokens are an explicit error in this state (due to
377 %nonassoc). For them, record MINSHORT as the action. */
379 for (i
= 0; i
< errp
->nerrs
; i
++)
381 int symbol
= errp
->errs
[i
];
382 actrow
[symbol
] = MINSHORT
;
385 /* Now find the most common reduction and make it the default action
388 if (nreds
>= 1 && !nodefault
)
390 if (state
->consistent
)
391 default_rule
= redp
->rules
[0];
395 for (i
= 0; i
< state
->nlookaheads
; i
++)
398 int rule
= -LAruleno
[state
->lookaheadsp
+ i
];
401 for (j
= 0; j
< ntokens
; j
++)
402 if (actrow
[j
] == rule
)
412 /* actions which match the default are replaced with zero,
413 which means "use the default" */
418 for (j
= 0; j
< ntokens
; j
++)
419 if (actrow
[j
] == default_rule
)
422 default_rule
= -default_rule
;
427 /* If have no default rule, the default is an error.
428 So replace any action which says "error" with "use default". */
430 if (default_rule
== 0)
431 for (i
= 0; i
< ntokens
; i
++)
432 if (actrow
[i
] == MINSHORT
)
449 for (i
= 0; i
< ntokens
; i
++)
456 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
457 tos
[state
] = sp2
= XCALLOC (short, count
);
459 for (i
= 0; i
< ntokens
; i
++)
466 tally
[state
] = count
;
467 width
[state
] = sp1
[-1] - sp
[0] + 1;
471 /*------------------------------------------------------------------.
472 | Figure out the actions for the specified state, indexed by |
473 | lookahead token type. |
475 | The YYDEFACT table is output now. The detailed info is saved for |
476 | putting into YYTABLE later. |
477 `------------------------------------------------------------------*/
483 short *yydefact
= XCALLOC (short, nstates
);
485 actrow
= XCALLOC (short, ntokens
);
486 for (i
= 0; i
< nstates
; ++i
)
488 yydefact
[i
] = action_row (state_table
[i
]);
492 output_table_data (&format_obstack
, yydefact
,
493 yydefact
[0], 1, nstates
);
494 muscle_insert ("defact", obstack_finish (&format_obstack
));
501 /*-----------------------------.
502 | Output the actions to OOUT. |
503 `-----------------------------*/
506 actions_output (FILE *out
, size_t *line
)
509 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
510 if (rule_table
[rule
].action
)
512 fprintf (out
, " case %d:\n", rule
);
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
? ";" : "");
526 /* We always output 4 '\n' per action. */
528 /* Plus one if !no_lines_flag. */
531 /* Get the number of lines written by the user. */
532 *line
+= get_lines_number (rule_table
[rule
].action
);
537 /*----------------------------.
538 | Output the guards to OOUT. |
539 `----------------------------*/
542 guards_output (FILE *out
, size_t *line
)
545 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
546 if (rule_table
[rule
].action
)
548 fprintf (out
, " case %d:\n", rule
);
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
);
558 /* We always output 4 '\n' per action. */
560 /* Plus one if !no_lines_flag. */
563 /* Get the number of lines written by the user. */
564 *line
+= get_lines_number (rule_table
[rule
].guard
);
570 save_column (int symbol
, int default_state
)
577 int symno
= symbol
- ntokens
+ nstates
;
579 short begin
= goto_map
[symbol
];
580 short end
= goto_map
[symbol
+ 1];
583 for (i
= begin
; i
< end
; i
++)
584 if (to_state
[i
] != default_state
)
590 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
591 tos
[symno
] = sp2
= XCALLOC (short, count
);
593 for (i
= begin
; i
< end
; i
++)
594 if (to_state
[i
] != default_state
)
596 *sp1
++ = from_state
[i
];
597 *sp2
++ = to_state
[i
];
600 tally
[symno
] = count
;
601 width
[symno
] = sp1
[-1] - sp
[0] + 1;
605 default_goto (int symbol
)
608 int m
= goto_map
[symbol
];
609 int n
= goto_map
[symbol
+ 1];
610 int default_state
= -1;
616 for (i
= 0; i
< nstates
; i
++)
619 for (i
= m
; i
< n
; i
++)
620 state_count
[to_state
[i
]]++;
622 for (i
= 0; i
< nstates
; i
++)
623 if (state_count
[i
] > max
)
625 max
= state_count
[i
];
629 return default_state
;
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. |
638 | The YYDEFGOTO table is output now. The detailed info is saved for |
639 | putting into YYTABLE later. |
640 `-------------------------------------------------------------------*/
646 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
648 state_count
= XCALLOC (short, nstates
);
649 for (i
= ntokens
; i
< nsyms
; ++i
)
651 int default_state
= default_goto (i
);
652 save_column (i
, default_state
);
653 yydefgoto
[i
- ntokens
] = default_state
;
656 output_table_data (&format_obstack
, yydefgoto
,
657 yydefgoto
[0], 1, nsyms
- ntokens
);
658 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
665 /* The next few functions decide how to pack the actions and gotos
666 information into yytable. */
673 order
= XCALLOC (short, nvectors
);
676 for (i
= 0; i
< nvectors
; i
++)
682 int j
= nentries
- 1;
684 while (j
>= 0 && (width
[order
[j
]] < w
))
687 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
690 for (k
= nentries
- 1; k
> j
; k
--)
691 order
[k
+ 1] = order
[k
];
700 matching_state (int vector
)
702 int i
= order
[vector
];
713 for (prev
= vector
- 1; prev
>= 0; prev
--)
719 if (width
[j
] != w
|| tally
[j
] != t
)
722 for (k
= 0; match
&& k
< t
; k
++)
723 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
735 pack_vector (int vector
)
737 int i
= order
[vector
];
741 short *from
= froms
[i
];
746 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
751 for (k
= 0; ok
&& k
< t
; k
++)
755 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
761 for (k
= 0; ok
&& k
< vector
; k
++)
767 for (k
= 0; k
< t
; k
++)
771 check
[loc
] = from
[k
];
774 while (table
[lowzero
] != 0)
783 #define pack_vector_succeeded 0
784 assert (pack_vector_succeeded
);
796 base
= XCALLOC (short, nvectors
);
797 pos
= XCALLOC (short, nentries
);
798 table
= XCALLOC (short, MAXTABLE
);
799 check
= XCALLOC (short, MAXTABLE
);
804 for (i
= 0; i
< nvectors
; i
++)
807 for (i
= 0; i
< MAXTABLE
; i
++)
810 for (i
= 0; i
< nentries
; i
++)
812 state
= matching_state (i
);
815 place
= pack_vector (i
);
820 base
[order
[i
]] = place
;
823 for (i
= 0; i
< nvectors
; i
++)
834 /* the following functions output yytable, yycheck
835 and the vectors whose elements index the portion starts */
841 output_table_data (&format_obstack
, base
,
842 base
[0], 1, nstates
);
843 muscle_insert ("pact", obstack_finish (&format_obstack
));
846 output_table_data (&format_obstack
, base
,
847 base
[nstates
], nstates
+ 1, nvectors
);
848 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
857 output_table_data (&format_obstack
, table
,
858 table
[0], 1, high
+ 1);
859 muscle_insert ("table", obstack_finish (&format_obstack
));
867 output_table_data (&format_obstack
, check
,
868 check
[0], 1, high
+ 1);
869 muscle_insert ("check", obstack_finish (&format_obstack
));
873 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
877 output_actions (void)
880 nvectors
= nstates
+ nvars
;
882 froms
= XCALLOC (short *, nvectors
);
883 tos
= XCALLOC (short *, nvectors
);
884 tally
= XCALLOC (short, nvectors
);
885 width
= XCALLOC (short, nvectors
);
892 XFREE (goto_map
+ ntokens
);
904 for (i
= 0; i
< nstates
; ++i
)
906 XFREE (state_table
[i
]->shifts
);
907 XFREE (state_table
[i
]->reductions
);
908 XFREE (state_table
[i
]->errs
);
909 free (state_table
[i
]);
915 /*------------------------------------------------------------.
916 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
917 | and do the muscle substitution. |
918 `------------------------------------------------------------*/
921 output_parser (const char *skel_filename
, FILE *out
)
926 size_t skeleton_line
;
928 fskel
= xfopen (skel_filename
, "r");
930 /* New output code. */
946 else if ((c
= getc (fskel
)) == '%')
948 /* Read the muscle. */
949 const char *muscle_key
= 0;
950 const char *muscle_value
= 0;
952 while (isalnum (c
= getc (fskel
)) || c
== '-')
953 obstack_1grow (&muscle_obstack
, c
);
954 obstack_1grow (&muscle_obstack
, 0);
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
)
969 fputs (muscle_value
, out
);
970 output_line
+= get_lines_number (muscle_value
);
975 fputs (muscle_key
, out
);
986 /*----------------------------------------.
987 | Prepare the master parser to be output |
988 `----------------------------------------*/
991 output_master_parser (void)
993 FILE *parser
= xfopen (parser_file_name
, "w");
997 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
999 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1001 muscle_insert ("skeleton", skeleton
);
1002 muscle_insert ("parser-file-name", parser_file_name
);
1004 output_parser (skeleton
, parser
);
1011 #define MUSCLE_INSERT_INT(Key, Value) \
1013 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1014 obstack_1grow (&muscle_obstack, 0); \
1015 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1018 #define MUSCLE_INSERT_STRING(Key, Value) \
1020 obstack_sgrow (&muscle_obstack, Value); \
1021 obstack_1grow (&muscle_obstack, 0); \
1022 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1025 #define MUSCLE_INSERT_PREFIX(Key, Value) \
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)); \
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
);
1045 MUSCLE_INSERT_INT ("nnts", nvars
);
1046 MUSCLE_INSERT_INT ("nrules", nrules
);
1047 MUSCLE_INSERT_INT ("nstates", nstates
);
1048 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1050 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1054 /*-------------------------.
1055 | Output the header file. |
1056 `-------------------------*/
1059 header_output (void)
1061 FILE *out
= xfopen (spec_defines_file
, "w");
1062 char *macro_name
= compute_header_macro ();
1064 fprintf (out
, "#ifndef %s\n", macro_name
);
1065 fprintf (out
, "# define %s\n\n", macro_name
);
1067 fputs (muscle_find ("tokendef"), out
);
1072 # define YYSTYPE yystype\n\
1074 muscle_find ("stype"));
1077 fprintf (out
, "\nextern YYSTYPE %slval;\n",
1079 if (semantic_parser
)
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
);
1089 fprintf (out
, "\n#endif /* not %s */\n", macro_name
);
1095 /*----------------------------------------------------------.
1096 | Output the parsing tables and the parser code to ftable. |
1097 `----------------------------------------------------------*/
1102 obstack_init (&format_obstack
);
1104 output_token_translations ();
1108 if (semantic_parser
)
1110 output_rule_data ();
1111 XFREE (user_toknums
);
1115 /* Copy definitions in directive. */
1116 obstack_1grow (&attrs_obstack
, 0);
1117 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1119 /* Output the parser. */
1120 output_master_parser ();
1121 /* Output the header if needed. */
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
);