]>
git.saurik.com Git - bison.git/blob - src/output.c
1 /* Output the generated parsing program for bison,
2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
5 This file is part of Bison, the GNU Compiler Compiler.
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 /* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
30 ++ YYTNAME = vector of string-names indexed by bison token number.
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
35 YYRLINE = vector of line-numbers of all rules. For yydebug
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
41 YYPRHS[R] = index in YYRHS of first item for rule R.
43 YYR1[R] = symbol number of symbol that rule R derives.
45 YYR2[R] = number of symbols composing right hand side of rule R.
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
62 If the value in YYTABLE is positive, we shift the token and go to
65 If the value is negative, it is minus a rule number to reduce by.
67 If the value is zero, the default action from YYDEFACT[S] is used.
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
104 #include "conflicts.h"
105 #include "muscle_tab.h"
107 /* From lib/readpipe.h. */
108 FILE *readpipe
PARAMS ((const char *, ...));
110 /* From src/scan-skel.l. */
111 int skel_lex
PARAMS ((void));
112 extern FILE *skel_in
;
116 static short **froms
= NULL
;
117 static short **tos
= NULL
;
118 static short *tally
= NULL
;
119 static short *width
= NULL
;
120 static short *actrow
= NULL
;
121 static short *state_count
= NULL
;
122 static short *order
= NULL
;
123 static short *base
= NULL
;
124 static short *pos
= NULL
;
125 static short *table
= NULL
;
126 static short *check
= NULL
;
130 struct obstack muscle_obstack
;
131 static struct obstack format_obstack
;
133 int error_verbose
= 0;
135 /* Returns the number of lines of S. */
137 get_lines_number (const char *s
)
142 for (i
= 0; s
[i
]; ++i
)
153 output_table_data (struct obstack
*oout
,
162 obstack_fgrow1 (oout
, "%6d", first
);
163 for (i
= begin
; i
< end
; ++i
)
165 obstack_1grow (oout
, ',');
168 obstack_sgrow (oout
, "\n ");
173 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
175 obstack_1grow (oout
, 0);
180 output_token_translations (void)
182 output_table_data (&format_obstack
, token_translations
,
183 0, 1, max_user_token_number
+ 1);
184 muscle_insert ("translate", obstack_finish (&format_obstack
));
185 XFREE (token_translations
);
194 short *values
= XCALLOC (short, nrules
+ 1);
195 for (i
= 1; i
< nrules
+ 1; ++i
)
196 values
[i
] = rules
[i
].rhs
- ritem
;
197 output_table_data (&format_obstack
, values
,
202 muscle_insert ("prhs", obstack_finish (&format_obstack
));
208 short *yyrhs
= XMALLOC (short, nritems
);
210 for (r
= 1; r
< nrules
+ 1; ++r
)
212 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
216 assert (i
== nritems
);
217 output_table_data (&format_obstack
, yyrhs
,
218 ritem
[0], 1, nritems
);
219 muscle_insert ("rhs", obstack_finish (&format_obstack
));
225 if (!semantic_parser
)
226 obstack_sgrow (&table_obstack
, "\n#endif\n");
235 short *values
= (short *) alloca (sizeof (short) * nstates
);
236 for (i
= 0; i
< nstates
; ++i
)
237 values
[i
] = states
[i
]->accessing_symbol
;
238 output_table_data (&format_obstack
, values
,
240 muscle_insert ("stos", obstack_finish (&format_obstack
));
245 output_rule_data (void)
249 short *short_tab
= NULL
;
252 short *values
= XCALLOC (short, nrules
+ 1);
253 for (i
= 1; i
< nrules
+ 1; ++i
)
254 values
[i
] = rules
[i
].line
;
255 output_table_data (&format_obstack
, values
,
257 muscle_insert ("rline", obstack_finish (&format_obstack
));
263 for (i
= 0; i
< nsyms
; i
++)
265 /* Be sure not to use twice the same quotearg slot. */
267 quotearg_n_style (1, c_quoting_style
,
268 quotearg_style (escape_quoting_style
, symbols
[i
]->tag
));
269 /* Width of the next token, including the two quotes, the coma
271 int strsize
= strlen (cp
) + 2;
273 if (j
+ strsize
> 75)
275 obstack_sgrow (&format_obstack
, "\n ");
279 obstack_sgrow (&format_obstack
, cp
);
280 obstack_sgrow (&format_obstack
, ", ");
283 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
285 obstack_sgrow (&format_obstack
, "0");
287 /* Finish table and store. */
288 obstack_1grow (&format_obstack
, 0);
289 muscle_insert ("tname", obstack_finish (&format_obstack
));
291 /* Output YYTOKNUM. */
293 short *values
= XCALLOC (short, ntokens
+ 1);
294 for (i
= 0; i
< ntokens
+ 1; ++i
)
295 values
[i
] = symbols
[i
]->user_token_number
;
296 output_table_data (&format_obstack
, values
,
298 muscle_insert ("toknum", obstack_finish (&format_obstack
));
305 short *values
= XCALLOC (short, nrules
+ 1);
306 for (i
= 1; i
< nrules
+ 1; ++i
)
307 values
[i
] = rules
[i
].lhs
->number
;
308 output_table_data (&format_obstack
, values
,
310 muscle_insert ("r1", obstack_finish (&format_obstack
));
315 short_tab
= XMALLOC (short, nrules
+ 1);
316 for (i
= 1; i
< nrules
; i
++)
317 short_tab
[i
] = rules
[i
+ 1].rhs
- rules
[i
].rhs
- 1;
318 short_tab
[nrules
] = nritems
- (rules
[nrules
].rhs
- ritem
) - 1;
319 output_table_data (&format_obstack
, short_tab
,
321 muscle_insert ("r2", obstack_finish (&format_obstack
));
325 /*------------------------------------------------------------------.
326 | Decide what to do for each type of token if seen as the lookahead |
327 | token in specified state. The value returned is used as the |
328 | default action (yydefact) for the state. In addition, actrow is |
329 | filled with what to do for each kind of token, index by symbol |
330 | number, with zero meaning do the default action. The value |
331 | MINSHORT, a very negative number, means this situation is an |
332 | error. The parser recognizes this value specially. |
334 | This is where conflicts are resolved. The loop over lookahead |
335 | rules considered lower-numbered rules last, and the last rule |
336 | considered that likes a token gets to handle it. |
337 `------------------------------------------------------------------*/
340 action_row (state_t
*state
)
343 int default_rule
= 0;
344 reductions
*redp
= state
->reductions
;
345 shifts
*shiftp
= state
->shifts
;
346 errs
*errp
= state
->errs
;
347 /* set nonzero to inhibit having any default reduction */
350 for (i
= 0; i
< ntokens
; i
++)
353 if (redp
->nreds
>= 1)
356 /* loop over all the rules available here which require
358 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
359 /* and find each token which the rule finds acceptable
361 for (j
= 0; j
< ntokens
; j
++)
362 /* and record this rule as the rule to use if that
364 if (bitset_test (LA
[state
->lookaheadsp
+ i
], j
))
365 actrow
[j
] = -LAruleno
[state
->lookaheadsp
+ i
];
368 /* Now see which tokens are allowed for shifts in this state. For
369 them, record the shift as the thing to do. So shift is preferred
371 for (i
= 0; i
< shiftp
->nshifts
; i
++)
374 int shift_state
= shiftp
->shifts
[i
];
378 symbol
= states
[shift_state
]->accessing_symbol
;
383 actrow
[symbol
] = shift_state
;
385 /* Do not use any default reduction if there is a shift for
387 if (symbol
== error_token_number
)
391 /* See which tokens are an explicit error in this state (due to
392 %nonassoc). For them, record MINSHORT as the action. */
393 for (i
= 0; i
< errp
->nerrs
; i
++)
395 int symbol
= errp
->errs
[i
];
396 actrow
[symbol
] = MINSHORT
;
399 /* Now find the most common reduction and make it the default action
402 if (redp
->nreds
>= 1 && !nodefault
)
404 if (state
->consistent
)
405 default_rule
= redp
->rules
[0];
409 for (i
= 0; i
< state
->nlookaheads
; i
++)
412 int rule
= -LAruleno
[state
->lookaheadsp
+ i
];
415 for (j
= 0; j
< ntokens
; j
++)
416 if (actrow
[j
] == rule
)
426 /* actions which match the default are replaced with zero,
427 which means "use the default" */
432 for (j
= 0; j
< ntokens
; j
++)
433 if (actrow
[j
] == default_rule
)
436 default_rule
= -default_rule
;
441 /* If have no default rule, the default is an error.
442 So replace any action which says "error" with "use default". */
444 if (default_rule
== 0)
445 for (i
= 0; i
< ntokens
; i
++)
446 if (actrow
[i
] == MINSHORT
)
463 for (i
= 0; i
< ntokens
; i
++)
470 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
471 tos
[state
] = sp2
= XCALLOC (short, count
);
473 for (i
= 0; i
< ntokens
; i
++)
480 tally
[state
] = count
;
481 width
[state
] = sp1
[-1] - sp
[0] + 1;
485 /*------------------------------------------------------------------.
486 | Figure out the actions for the specified state, indexed by |
487 | lookahead token type. |
489 | The YYDEFACT table is output now. The detailed info is saved for |
490 | putting into YYTABLE later. |
491 `------------------------------------------------------------------*/
497 short *yydefact
= XCALLOC (short, nstates
);
499 actrow
= XCALLOC (short, ntokens
);
500 for (i
= 0; i
< nstates
; ++i
)
502 yydefact
[i
] = action_row (states
[i
]);
506 output_table_data (&format_obstack
, yydefact
,
507 yydefact
[0], 1, nstates
);
508 muscle_insert ("defact", obstack_finish (&format_obstack
));
515 /*-----------------------------.
516 | Output the actions to OOUT. |
517 `-----------------------------*/
520 actions_output (FILE *out
)
523 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
524 if (rules
[rule
].action
)
526 fprintf (out
, " case %d:\n", rule
);
529 fprintf (out
, muscle_find ("linef"),
530 rules
[rule
].action_line
,
531 quotearg_style (c_quoting_style
,
532 muscle_find ("filename")));
533 /* As a Bison extension, add the ending semicolon. Since some
534 Yacc don't do that, help people using bison as a Yacc
535 finding their missing semicolons. */
536 fprintf (out
, "{ %s%s }\n break;\n\n",
538 yacc_flag
? ";" : "");
543 /*----------------------------.
544 | Output the guards to OOUT. |
545 `----------------------------*/
548 guards_output (FILE *out
)
551 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
552 if (rules
[rule
].guard
)
554 fprintf (out
, " case %d:\n", rule
);
557 fprintf (out
, muscle_find ("linef"),
558 rules
[rule
].guard_line
,
559 quotearg_style (c_quoting_style
,
560 muscle_find ("filename")));
561 fprintf (out
, "{ %s; }\n break;\n\n",
567 /*---------------------------------------.
568 | Output the tokens definition to OOUT. |
569 `---------------------------------------*/
572 token_definitions_output (FILE *out
)
576 for (i
= 0; i
< ntokens
; ++i
)
578 bucket
*symbol
= symbols
[i
];
579 int number
= symbol
->user_token_number
;
581 if (number
== SALIAS
)
583 /* Skip error token. */
584 if (symbol
->number
== error_token_number
)
586 if (symbol
->tag
[0] == '\'')
587 continue; /* skip literal character */
588 if (symbol
->tag
[0] == '\"')
590 /* use literal string only if given a symbol with an alias */
592 symbol
= symbol
->alias
;
597 /* Don't #define nonliteral tokens whose names contain periods
598 or '$' (as does the default value of the EOF token). */
599 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
602 fprintf (out
, "%s [[[%s]], [%d]]",
603 first
? "" : ",\n", symbol
->tag
, number
);
605 /* FIXME: This is probably wrong, and should be just as
607 fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->number
);
614 save_column (int symbol
, int default_state
)
621 int symno
= symbol
- ntokens
+ nstates
;
623 short begin
= goto_map
[symbol
];
624 short end
= goto_map
[symbol
+ 1];
627 for (i
= begin
; i
< end
; i
++)
628 if (to_state
[i
] != default_state
)
634 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
635 tos
[symno
] = sp2
= XCALLOC (short, count
);
637 for (i
= begin
; i
< end
; i
++)
638 if (to_state
[i
] != default_state
)
640 *sp1
++ = from_state
[i
];
641 *sp2
++ = to_state
[i
];
644 tally
[symno
] = count
;
645 width
[symno
] = sp1
[-1] - sp
[0] + 1;
649 default_goto (int symbol
)
652 size_t m
= goto_map
[symbol
];
653 size_t n
= goto_map
[symbol
+ 1];
654 int default_state
= -1;
660 for (i
= 0; i
< nstates
; i
++)
663 for (i
= m
; i
< n
; i
++)
664 state_count
[to_state
[i
]]++;
666 for (i
= 0; i
< nstates
; i
++)
667 if (state_count
[i
] > max
)
669 max
= state_count
[i
];
673 return default_state
;
677 /*-------------------------------------------------------------------.
678 | Figure out what to do after reducing with each rule, depending on |
679 | the saved state from before the beginning of parsing the data that |
680 | matched this rule. |
682 | The YYDEFGOTO table is output now. The detailed info is saved for |
683 | putting into YYTABLE later. |
684 `-------------------------------------------------------------------*/
690 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
692 state_count
= XCALLOC (short, nstates
);
693 for (i
= ntokens
; i
< nsyms
; ++i
)
695 int default_state
= default_goto (i
);
696 save_column (i
, default_state
);
697 yydefgoto
[i
- ntokens
] = default_state
;
700 output_table_data (&format_obstack
, yydefgoto
,
701 yydefgoto
[0], 1, nsyms
- ntokens
);
702 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
709 /* The next few functions decide how to pack the actions and gotos
710 information into yytable. */
717 order
= XCALLOC (short, nvectors
);
720 for (i
= 0; i
< nvectors
; i
++)
726 int j
= nentries
- 1;
728 while (j
>= 0 && (width
[order
[j
]] < w
))
731 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
734 for (k
= nentries
- 1; k
> j
; k
--)
735 order
[k
+ 1] = order
[k
];
744 matching_state (int vector
)
746 int i
= order
[vector
];
751 if (i
>= (int) nstates
)
757 for (prev
= vector
- 1; prev
>= 0; prev
--)
763 if (width
[j
] != w
|| tally
[j
] != t
)
766 for (k
= 0; match
&& k
< t
; k
++)
767 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
779 pack_vector (int vector
)
781 int i
= order
[vector
];
785 short *from
= froms
[i
];
790 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
795 for (k
= 0; ok
&& k
< t
; k
++)
799 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
805 for (k
= 0; ok
&& k
< vector
; k
++)
811 for (k
= 0; k
< t
; k
++)
815 check
[loc
] = from
[k
];
818 while (table
[lowzero
] != 0)
827 #define pack_vector_succeeded 0
828 assert (pack_vector_succeeded
);
840 base
= XCALLOC (short, nvectors
);
841 pos
= XCALLOC (short, nentries
);
842 table
= XCALLOC (short, MAXTABLE
);
843 check
= XCALLOC (short, MAXTABLE
);
848 for (i
= 0; i
< nvectors
; i
++)
851 for (i
= 0; i
< MAXTABLE
; i
++)
854 for (i
= 0; i
< nentries
; i
++)
856 state
= matching_state (i
);
859 place
= pack_vector (i
);
864 base
[order
[i
]] = place
;
867 for (i
= 0; i
< nvectors
; i
++)
878 /* the following functions output yytable, yycheck
879 and the vectors whose elements index the portion starts */
885 output_table_data (&format_obstack
, base
,
886 base
[0], 1, nstates
);
887 muscle_insert ("pact", obstack_finish (&format_obstack
));
890 output_table_data (&format_obstack
, base
,
891 base
[nstates
], nstates
+ 1, nvectors
);
892 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
901 output_table_data (&format_obstack
, table
,
902 table
[0], 1, high
+ 1);
903 muscle_insert ("table", obstack_finish (&format_obstack
));
911 output_table_data (&format_obstack
, check
,
912 check
[0], 1, high
+ 1);
913 muscle_insert ("check", obstack_finish (&format_obstack
));
917 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
921 output_actions (void)
924 nvectors
= nstates
+ nvars
;
926 froms
= XCALLOC (short *, nvectors
);
927 tos
= XCALLOC (short *, nvectors
);
928 tally
= XCALLOC (short, nvectors
);
929 width
= XCALLOC (short, nvectors
);
936 XFREE (goto_map
+ ntokens
);
948 for (i
= 0; i
< nstates
; ++i
)
950 free (states
[i
]->shifts
);
951 XFREE (states
[i
]->reductions
);
952 free (states
[i
]->errs
);
959 /*---------------------------.
960 | Call the skeleton parser. |
961 `---------------------------*/
964 output_skeleton (void)
966 /* Store the definition of all the muscles. */
967 const char *tempdir
= getenv ("TMPDIR");
968 char *tempfile
= NULL
;
973 tempdir
= DEFAULT_TMPDIR
;
974 tempfile
= xmalloc (strlen (tempdir
) + 11);
975 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
976 fd
= mkstemp (tempfile
);
978 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
980 out
= fdopen (fd
, "w");
982 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
984 /* There are no comments, especially not `#': we do want M4 expansion
985 after `#': think of CPP macros! */
986 fputs ("m4_changecom()\n", out
);
987 fputs ("m4_init()\n", out
);
989 fputs ("m4_define([b4_actions], \n[[", out
);
990 actions_output (out
);
991 fputs ("]])\n\n", out
);
993 fputs ("m4_define([b4_guards], \n[[", out
);
995 fputs ("]])\n\n", out
);
997 fputs ("m4_define([b4_tokens], \n[", out
);
998 token_definitions_output (out
);
999 fputs ("])\n\n", out
);
1001 muscles_m4_output (out
);
1003 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1004 fputs ("m4_divert_push(0)dnl\n", out
);
1007 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1009 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1010 const char *m4
= getenv ("M4");
1013 if (!bison_pkgdatadir
)
1014 bison_pkgdatadir
= PKGDATADIR
;
1017 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1018 m4
, bison_pkgdatadir
, tempfile
, skeleton
);
1019 skel_in
= readpipe (m4
,
1020 "-I", bison_pkgdatadir
,
1021 "m4sugar/m4sugar.m4",
1026 error (EXIT_FAILURE
, errno
, "cannot run m4");
1029 /* If `debugging', keep this file alive. */
1038 MUSCLE_INSERT_INT ("last", high
);
1039 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1040 MUSCLE_INSERT_INT ("pure", pure_parser
);
1041 MUSCLE_INSERT_INT ("nsym", nsyms
);
1042 MUSCLE_INSERT_INT ("debug", debug_flag
);
1043 MUSCLE_INSERT_INT ("final", final_state
);
1044 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1045 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1046 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1048 /* FIXME: This is wrong: the muscles should decide whether they hold
1049 a copy or not, but the situation is too obscure currently. */
1050 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1051 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1052 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1053 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1055 MUSCLE_INSERT_INT ("nnts", nvars
);
1056 MUSCLE_INSERT_INT ("nrules", nrules
);
1057 MUSCLE_INSERT_INT ("nstates", nstates
);
1058 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1060 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1061 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1063 /* Copy definitions in directive. */
1064 obstack_1grow (&attrs_obstack
, 0);
1065 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1067 /* Find the right skeleton file. */
1070 if (semantic_parser
)
1071 skeleton
= "bison.hairy";
1073 skeleton
= "bison.simple";
1076 /* Parse the skeleton file and output the needed parsers. */
1077 muscle_insert ("skeleton", skeleton
);
1081 /*----------------------------------------------------------.
1082 | Output the parsing tables and the parser code to ftable. |
1083 `----------------------------------------------------------*/
1088 obstack_init (&format_obstack
);
1090 output_token_translations ();
1093 if (semantic_parser
)
1095 output_rule_data ();
1100 /* Process the selected skeleton file. */
1103 obstack_free (&muscle_obstack
, NULL
);
1104 obstack_free (&format_obstack
, NULL
);
1105 obstack_free (&action_obstack
, NULL
);
1106 obstack_free (&attrs_obstack
, NULL
);