]>
git.saurik.com Git - bison.git/blob - src/output.c
34ff7d36551e6bf32c7551def2ff78eca1f209d0
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 shifts
*shiftp
= state
->shifts
;
330 errs
*errp
= state
->errs
;
331 /* set nonzero to inhibit having any default reduction */
334 for (i
= 0; i
< ntokens
; i
++)
337 if (redp
->nreds
>= 1)
340 /* loop over all the rules available here which require
342 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
343 /* and find each token which the rule finds acceptable
345 for (j
= 0; j
< ntokens
; j
++)
346 /* and record this rule as the rule to use if that
348 if (BITISSET (LA (state
->lookaheadsp
+ i
), j
))
349 actrow
[j
] = -LAruleno
[state
->lookaheadsp
+ i
];
352 /* Now see which tokens are allowed for shifts in this state. For
353 them, record the shift as the thing to do. So shift is preferred
355 for (i
= 0; i
< shiftp
->nshifts
; i
++)
358 int shift_state
= shiftp
->shifts
[i
];
362 symbol
= state_table
[shift_state
]->accessing_symbol
;
367 actrow
[symbol
] = shift_state
;
369 /* Do not use any default reduction if there is a shift for
371 if (symbol
== error_token_number
)
375 /* See which tokens are an explicit error in this state (due to
376 %nonassoc). For them, record MINSHORT as the action. */
377 for (i
= 0; i
< errp
->nerrs
; i
++)
379 int symbol
= errp
->errs
[i
];
380 actrow
[symbol
] = MINSHORT
;
383 /* Now find the most common reduction and make it the default action
386 if (redp
->nreds
>= 1 && !nodefault
)
388 if (state
->consistent
)
389 default_rule
= redp
->rules
[0];
393 for (i
= 0; i
< state
->nlookaheads
; i
++)
396 int rule
= -LAruleno
[state
->lookaheadsp
+ i
];
399 for (j
= 0; j
< ntokens
; j
++)
400 if (actrow
[j
] == rule
)
410 /* actions which match the default are replaced with zero,
411 which means "use the default" */
416 for (j
= 0; j
< ntokens
; j
++)
417 if (actrow
[j
] == default_rule
)
420 default_rule
= -default_rule
;
425 /* If have no default rule, the default is an error.
426 So replace any action which says "error" with "use default". */
428 if (default_rule
== 0)
429 for (i
= 0; i
< ntokens
; i
++)
430 if (actrow
[i
] == MINSHORT
)
447 for (i
= 0; i
< ntokens
; i
++)
454 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
455 tos
[state
] = sp2
= XCALLOC (short, count
);
457 for (i
= 0; i
< ntokens
; i
++)
464 tally
[state
] = count
;
465 width
[state
] = sp1
[-1] - sp
[0] + 1;
469 /*------------------------------------------------------------------.
470 | Figure out the actions for the specified state, indexed by |
471 | lookahead token type. |
473 | The YYDEFACT table is output now. The detailed info is saved for |
474 | putting into YYTABLE later. |
475 `------------------------------------------------------------------*/
481 short *yydefact
= XCALLOC (short, nstates
);
483 actrow
= XCALLOC (short, ntokens
);
484 for (i
= 0; i
< nstates
; ++i
)
486 yydefact
[i
] = action_row (state_table
[i
]);
490 output_table_data (&format_obstack
, yydefact
,
491 yydefact
[0], 1, nstates
);
492 muscle_insert ("defact", obstack_finish (&format_obstack
));
499 /*-----------------------------.
500 | Output the actions to OOUT. |
501 `-----------------------------*/
504 actions_output (FILE *out
, size_t *line
)
507 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
508 if (rule_table
[rule
].action
)
510 fprintf (out
, " case %d:\n", rule
);
513 fprintf (out
, muscle_find ("linef"),
514 rule_table
[rule
].action_line
,
515 quotearg_style (c_quoting_style
,
516 muscle_find ("filename")));
517 /* As a Bison extension, add the ending semicolon. Since some
518 Yacc don't do that, help people using bison as a Yacc
519 finding their missing semicolons. */
520 fprintf (out
, "{ %s%s }\n break;\n\n",
521 rule_table
[rule
].action
,
522 yacc_flag
? ";" : "");
524 /* We always output 4 '\n' per action. */
526 /* Plus one if !no_lines_flag. */
529 /* Get the number of lines written by the user. */
530 *line
+= get_lines_number (rule_table
[rule
].action
);
535 /*----------------------------.
536 | Output the guards to OOUT. |
537 `----------------------------*/
540 guards_output (FILE *out
, size_t *line
)
543 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
544 if (rule_table
[rule
].action
)
546 fprintf (out
, " case %d:\n", rule
);
549 fprintf (out
, muscle_find ("linef"),
550 rule_table
[rule
].guard_line
,
551 quotearg_style (c_quoting_style
,
552 muscle_find ("filename")));
553 fprintf (out
, "{ %s; }\n break;\n\n",
554 rule_table
[rule
].guard
);
556 /* We always output 4 '\n' per action. */
558 /* Plus one if !no_lines_flag. */
561 /* Get the number of lines written by the user. */
562 *line
+= get_lines_number (rule_table
[rule
].guard
);
568 save_column (int symbol
, int default_state
)
575 int symno
= symbol
- ntokens
+ nstates
;
577 short begin
= goto_map
[symbol
];
578 short end
= goto_map
[symbol
+ 1];
581 for (i
= begin
; i
< end
; i
++)
582 if (to_state
[i
] != default_state
)
588 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
589 tos
[symno
] = sp2
= XCALLOC (short, count
);
591 for (i
= begin
; i
< end
; i
++)
592 if (to_state
[i
] != default_state
)
594 *sp1
++ = from_state
[i
];
595 *sp2
++ = to_state
[i
];
598 tally
[symno
] = count
;
599 width
[symno
] = sp1
[-1] - sp
[0] + 1;
603 default_goto (int symbol
)
606 int m
= goto_map
[symbol
];
607 int n
= goto_map
[symbol
+ 1];
608 int default_state
= -1;
614 for (i
= 0; i
< nstates
; i
++)
617 for (i
= m
; i
< n
; i
++)
618 state_count
[to_state
[i
]]++;
620 for (i
= 0; i
< nstates
; i
++)
621 if (state_count
[i
] > max
)
623 max
= state_count
[i
];
627 return default_state
;
631 /*-------------------------------------------------------------------.
632 | Figure out what to do after reducing with each rule, depending on |
633 | the saved state from before the beginning of parsing the data that |
634 | matched this rule. |
636 | The YYDEFGOTO table is output now. The detailed info is saved for |
637 | putting into YYTABLE later. |
638 `-------------------------------------------------------------------*/
644 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
646 state_count
= XCALLOC (short, nstates
);
647 for (i
= ntokens
; i
< nsyms
; ++i
)
649 int default_state
= default_goto (i
);
650 save_column (i
, default_state
);
651 yydefgoto
[i
- ntokens
] = default_state
;
654 output_table_data (&format_obstack
, yydefgoto
,
655 yydefgoto
[0], 1, nsyms
- ntokens
);
656 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
663 /* The next few functions decide how to pack the actions and gotos
664 information into yytable. */
671 order
= XCALLOC (short, nvectors
);
674 for (i
= 0; i
< nvectors
; i
++)
680 int j
= nentries
- 1;
682 while (j
>= 0 && (width
[order
[j
]] < w
))
685 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
688 for (k
= nentries
- 1; k
> j
; k
--)
689 order
[k
+ 1] = order
[k
];
698 matching_state (int vector
)
700 int i
= order
[vector
];
711 for (prev
= vector
- 1; prev
>= 0; prev
--)
717 if (width
[j
] != w
|| tally
[j
] != t
)
720 for (k
= 0; match
&& k
< t
; k
++)
721 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
733 pack_vector (int vector
)
735 int i
= order
[vector
];
739 short *from
= froms
[i
];
744 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
749 for (k
= 0; ok
&& k
< t
; k
++)
753 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
759 for (k
= 0; ok
&& k
< vector
; k
++)
765 for (k
= 0; k
< t
; k
++)
769 check
[loc
] = from
[k
];
772 while (table
[lowzero
] != 0)
781 #define pack_vector_succeeded 0
782 assert (pack_vector_succeeded
);
794 base
= XCALLOC (short, nvectors
);
795 pos
= XCALLOC (short, nentries
);
796 table
= XCALLOC (short, MAXTABLE
);
797 check
= XCALLOC (short, MAXTABLE
);
802 for (i
= 0; i
< nvectors
; i
++)
805 for (i
= 0; i
< MAXTABLE
; i
++)
808 for (i
= 0; i
< nentries
; i
++)
810 state
= matching_state (i
);
813 place
= pack_vector (i
);
818 base
[order
[i
]] = place
;
821 for (i
= 0; i
< nvectors
; i
++)
832 /* the following functions output yytable, yycheck
833 and the vectors whose elements index the portion starts */
839 output_table_data (&format_obstack
, base
,
840 base
[0], 1, nstates
);
841 muscle_insert ("pact", obstack_finish (&format_obstack
));
844 output_table_data (&format_obstack
, base
,
845 base
[nstates
], nstates
+ 1, nvectors
);
846 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
855 output_table_data (&format_obstack
, table
,
856 table
[0], 1, high
+ 1);
857 muscle_insert ("table", obstack_finish (&format_obstack
));
865 output_table_data (&format_obstack
, check
,
866 check
[0], 1, high
+ 1);
867 muscle_insert ("check", obstack_finish (&format_obstack
));
871 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
875 output_actions (void)
878 nvectors
= nstates
+ nvars
;
880 froms
= XCALLOC (short *, nvectors
);
881 tos
= XCALLOC (short *, nvectors
);
882 tally
= XCALLOC (short, nvectors
);
883 width
= XCALLOC (short, nvectors
);
890 XFREE (goto_map
+ ntokens
);
902 for (i
= 0; i
< nstates
; ++i
)
904 free (state_table
[i
]->shifts
);
905 XFREE (state_table
[i
]->reductions
);
906 free (state_table
[i
]->errs
);
907 free (state_table
[i
]);
913 /*------------------------------------------------------------.
914 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
915 | and do the muscle substitution. |
916 `------------------------------------------------------------*/
919 output_parser (const char *skel_filename
, FILE *out
)
924 size_t skeleton_line
;
926 fskel
= xfopen (skel_filename
, "r");
928 /* New output code. */
944 else if ((c
= getc (fskel
)) == '%')
946 /* Read the muscle. */
947 const char *muscle_key
= 0;
948 const char *muscle_value
= 0;
950 while (isalnum (c
= getc (fskel
)) || c
== '-')
951 obstack_1grow (&muscle_obstack
, c
);
952 obstack_1grow (&muscle_obstack
, 0);
954 /* Output the right value, or see if it's something special. */
955 muscle_key
= obstack_finish (&muscle_obstack
);
956 muscle_value
= muscle_find (muscle_key
);
957 if (!strcmp (muscle_key
, "actions"))
958 actions_output (out
, &output_line
);
959 else if (!strcmp (muscle_key
, "guards"))
960 guards_output (out
, &output_line
);
961 else if (!strcmp (muscle_key
, "line"))
962 fprintf (out
, "%d", output_line
);
963 else if (!strcmp (muscle_key
, "skeleton-line"))
964 fprintf (out
, "%d", skeleton_line
);
965 else if (muscle_value
)
967 fputs (muscle_value
, out
);
968 output_line
+= get_lines_number (muscle_value
);
973 fputs (muscle_key
, out
);
984 /*----------------------------------------.
985 | Prepare the master parser to be output |
986 `----------------------------------------*/
989 output_master_parser (void)
991 FILE *parser
= xfopen (parser_file_name
, "w");
995 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
997 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
999 muscle_insert ("skeleton", skeleton
);
1000 muscle_insert ("parser-file-name", parser_file_name
);
1002 output_parser (skeleton
, parser
);
1009 #define MUSCLE_INSERT_INT(Key, Value) \
1011 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1012 obstack_1grow (&muscle_obstack, 0); \
1013 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1016 #define MUSCLE_INSERT_STRING(Key, Value) \
1018 obstack_sgrow (&muscle_obstack, Value); \
1019 obstack_1grow (&muscle_obstack, 0); \
1020 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1023 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1025 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1026 obstack_1grow (&muscle_obstack, 0); \
1027 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1033 MUSCLE_INSERT_INT ("last", high
);
1034 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1035 MUSCLE_INSERT_INT ("pure", pure_parser
);
1036 MUSCLE_INSERT_INT ("nsym", nsyms
);
1037 MUSCLE_INSERT_INT ("debug", debug_flag
);
1038 MUSCLE_INSERT_INT ("final", final_state
);
1039 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1040 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1041 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1043 MUSCLE_INSERT_INT ("nnts", nvars
);
1044 MUSCLE_INSERT_INT ("nrules", nrules
);
1045 MUSCLE_INSERT_INT ("nstates", nstates
);
1046 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1048 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1052 /*-------------------------.
1053 | Output the header file. |
1054 `-------------------------*/
1057 header_output (void)
1059 FILE *out
= xfopen (spec_defines_file
, "w");
1060 char *macro_name
= compute_header_macro ();
1062 fprintf (out
, "#ifndef %s\n", macro_name
);
1063 fprintf (out
, "# define %s\n\n", macro_name
);
1065 fputs (muscle_find ("tokendef"), out
);
1070 # define YYSTYPE yystype\n\
1072 muscle_find ("stype"));
1075 fprintf (out
, "\nextern YYSTYPE %slval;\n",
1077 if (semantic_parser
)
1081 for (i
= ntokens
; i
< nsyms
; i
++)
1082 /* don't make these for dummy nonterminals made by gensym. */
1083 if (*tags
[i
] != '@')
1084 fprintf (out
, "# define NT%s\t%d\n", tags
[i
], i
);
1087 fprintf (out
, "\n#endif /* not %s */\n", macro_name
);
1093 /*----------------------------------------------------------.
1094 | Output the parsing tables and the parser code to ftable. |
1095 `----------------------------------------------------------*/
1100 obstack_init (&format_obstack
);
1102 output_token_translations ();
1106 if (semantic_parser
)
1108 output_rule_data ();
1109 XFREE (user_toknums
);
1113 /* Copy definitions in directive. */
1114 obstack_1grow (&attrs_obstack
, 0);
1115 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1117 /* Output the parser. */
1118 output_master_parser ();
1119 /* Output the header if needed. */
1123 free (rule_table
+ 1);
1124 obstack_free (&muscle_obstack
, NULL
);
1125 obstack_free (&format_obstack
, NULL
);
1126 obstack_free (&action_obstack
, NULL
);
1127 obstack_free (&attrs_obstack
, NULL
);