]>
git.saurik.com Git - bison.git/blob - src/output.c
2194dda7b1edd7ec07e0ee6685876406456bbdf5
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
= 0; 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 yyrhs
= XMALLOC (short, nritems
);
210 for (i
= 1; i
< nritems
; ++i
)
211 yyrhs
[i
] = ritem
[i
] >= 0 ? ritem
[i
] : -1;
213 output_table_data (&format_obstack
, yyrhs
,
214 ritem
[0], 1, nritems
);
215 muscle_insert ("rhs", obstack_finish (&format_obstack
));
221 if (!semantic_parser
)
222 obstack_sgrow (&table_obstack
, "\n#endif\n");
231 short *values
= (short *) alloca (sizeof (short) * nstates
);
232 for (i
= 0; i
< nstates
; ++i
)
233 values
[i
] = states
[i
]->accessing_symbol
;
234 output_table_data (&format_obstack
, values
,
236 muscle_insert ("stos", obstack_finish (&format_obstack
));
241 output_rule_data (void)
245 short *short_tab
= NULL
;
248 short *values
= XCALLOC (short, nrules
+ 1);
249 for (i
= 0; i
< nrules
+ 1; ++i
)
250 values
[i
] = rules
[i
].line
;
251 output_table_data (&format_obstack
, values
,
253 muscle_insert ("rline", obstack_finish (&format_obstack
));
259 for (i
= 0; i
< nsyms
; i
++)
261 /* Be sure not to use twice the same quotearg slot. */
263 quotearg_n_style (1, c_quoting_style
,
264 quotearg_style (escape_quoting_style
, symbols
[i
]->tag
));
265 /* Width of the next token, including the two quotes, the coma
267 int strsize
= strlen (cp
) + 2;
269 if (j
+ strsize
> 75)
271 obstack_sgrow (&format_obstack
, "\n ");
275 obstack_sgrow (&format_obstack
, cp
);
276 obstack_sgrow (&format_obstack
, ", ");
279 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
281 obstack_sgrow (&format_obstack
, "0");
283 /* Finish table and store. */
284 obstack_1grow (&format_obstack
, 0);
285 muscle_insert ("tname", obstack_finish (&format_obstack
));
287 /* Output YYTOKNUM. */
289 short *values
= XCALLOC (short, ntokens
+ 1);
290 for (i
= 0; i
< ntokens
+ 1; ++i
)
291 values
[i
] = symbols
[i
]->user_token_number
;
292 output_table_data (&format_obstack
, values
,
294 muscle_insert ("toknum", obstack_finish (&format_obstack
));
301 short *values
= XCALLOC (short, nrules
+ 1);
302 for (i
= 0; i
< nrules
+ 1; ++i
)
303 values
[i
] = rules
[i
].lhs
;
304 output_table_data (&format_obstack
, values
,
306 muscle_insert ("r1", obstack_finish (&format_obstack
));
311 short_tab
= XMALLOC (short, nrules
+ 1);
312 for (i
= 1; i
< nrules
; i
++)
313 short_tab
[i
] = rules
[i
+ 1].rhs
- rules
[i
].rhs
- 1;
314 short_tab
[nrules
] = nritems
- (rules
[nrules
].rhs
- ritem
) - 1;
315 output_table_data (&format_obstack
, short_tab
,
317 muscle_insert ("r2", obstack_finish (&format_obstack
));
321 /*------------------------------------------------------------------.
322 | Decide what to do for each type of token if seen as the lookahead |
323 | token in specified state. The value returned is used as the |
324 | default action (yydefact) for the state. In addition, actrow is |
325 | filled with what to do for each kind of token, index by symbol |
326 | number, with zero meaning do the default action. The value |
327 | MINSHORT, a very negative number, means this situation is an |
328 | error. The parser recognizes this value specially. |
330 | This is where conflicts are resolved. The loop over lookahead |
331 | rules considered lower-numbered rules last, and the last rule |
332 | considered that likes a token gets to handle it. |
333 `------------------------------------------------------------------*/
336 action_row (state_t
*state
)
339 int default_rule
= 0;
340 reductions
*redp
= state
->reductions
;
341 shifts
*shiftp
= state
->shifts
;
342 errs
*errp
= state
->errs
;
343 /* set nonzero to inhibit having any default reduction */
346 for (i
= 0; i
< ntokens
; i
++)
349 if (redp
->nreds
>= 1)
352 /* loop over all the rules available here which require
354 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
355 /* and find each token which the rule finds acceptable
357 for (j
= 0; j
< ntokens
; j
++)
358 /* and record this rule as the rule to use if that
360 if (bitset_test (LA
[state
->lookaheadsp
+ i
], j
))
361 actrow
[j
] = -LAruleno
[state
->lookaheadsp
+ i
];
364 /* Now see which tokens are allowed for shifts in this state. For
365 them, record the shift as the thing to do. So shift is preferred
367 for (i
= 0; i
< shiftp
->nshifts
; i
++)
370 int shift_state
= shiftp
->shifts
[i
];
374 symbol
= states
[shift_state
]->accessing_symbol
;
379 actrow
[symbol
] = shift_state
;
381 /* Do not use any default reduction if there is a shift for
383 if (symbol
== error_token_number
)
387 /* See which tokens are an explicit error in this state (due to
388 %nonassoc). For them, record MINSHORT as the action. */
389 for (i
= 0; i
< errp
->nerrs
; i
++)
391 int symbol
= errp
->errs
[i
];
392 actrow
[symbol
] = MINSHORT
;
395 /* Now find the most common reduction and make it the default action
398 if (redp
->nreds
>= 1 && !nodefault
)
400 if (state
->consistent
)
401 default_rule
= redp
->rules
[0];
405 for (i
= 0; i
< state
->nlookaheads
; i
++)
408 int rule
= -LAruleno
[state
->lookaheadsp
+ i
];
411 for (j
= 0; j
< ntokens
; j
++)
412 if (actrow
[j
] == rule
)
422 /* actions which match the default are replaced with zero,
423 which means "use the default" */
428 for (j
= 0; j
< ntokens
; j
++)
429 if (actrow
[j
] == default_rule
)
432 default_rule
= -default_rule
;
437 /* If have no default rule, the default is an error.
438 So replace any action which says "error" with "use default". */
440 if (default_rule
== 0)
441 for (i
= 0; i
< ntokens
; i
++)
442 if (actrow
[i
] == MINSHORT
)
459 for (i
= 0; i
< ntokens
; i
++)
466 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
467 tos
[state
] = sp2
= XCALLOC (short, count
);
469 for (i
= 0; i
< ntokens
; i
++)
476 tally
[state
] = count
;
477 width
[state
] = sp1
[-1] - sp
[0] + 1;
481 /*------------------------------------------------------------------.
482 | Figure out the actions for the specified state, indexed by |
483 | lookahead token type. |
485 | The YYDEFACT table is output now. The detailed info is saved for |
486 | putting into YYTABLE later. |
487 `------------------------------------------------------------------*/
493 short *yydefact
= XCALLOC (short, nstates
);
495 actrow
= XCALLOC (short, ntokens
);
496 for (i
= 0; i
< nstates
; ++i
)
498 yydefact
[i
] = action_row (states
[i
]);
502 output_table_data (&format_obstack
, yydefact
,
503 yydefact
[0], 1, nstates
);
504 muscle_insert ("defact", obstack_finish (&format_obstack
));
511 /*-----------------------------.
512 | Output the actions to OOUT. |
513 `-----------------------------*/
516 actions_output (FILE *out
)
519 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
520 if (rules
[rule
].action
)
522 fprintf (out
, " case %d:\n", rule
);
525 fprintf (out
, muscle_find ("linef"),
526 rules
[rule
].action_line
,
527 quotearg_style (c_quoting_style
,
528 muscle_find ("filename")));
529 /* As a Bison extension, add the ending semicolon. Since some
530 Yacc don't do that, help people using bison as a Yacc
531 finding their missing semicolons. */
532 fprintf (out
, "{ %s%s }\n break;\n\n",
534 yacc_flag
? ";" : "");
539 /*----------------------------.
540 | Output the guards to OOUT. |
541 `----------------------------*/
544 guards_output (FILE *out
)
547 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
548 if (rules
[rule
].guard
)
550 fprintf (out
, " case %d:\n", rule
);
553 fprintf (out
, muscle_find ("linef"),
554 rules
[rule
].guard_line
,
555 quotearg_style (c_quoting_style
,
556 muscle_find ("filename")));
557 fprintf (out
, "{ %s; }\n break;\n\n",
563 /*---------------------------------------.
564 | Output the tokens definition to OOUT. |
565 `---------------------------------------*/
568 token_definitions_output (FILE *out
)
572 for (i
= 0; i
< ntokens
; ++i
)
574 bucket
*symbol
= symbols
[i
];
575 int number
= symbol
->user_token_number
;
577 if (number
== SALIAS
)
579 /* Skip error token. */
580 if (symbol
->value
== error_token_number
)
582 if (symbol
->tag
[0] == '\'')
583 continue; /* skip literal character */
584 if (symbol
->tag
[0] == '\"')
586 /* use literal string only if given a symbol with an alias */
588 symbol
= symbol
->alias
;
593 /* Don't #define nonliteral tokens whose names contain periods
594 or '$' (as does the default value of the EOF token). */
595 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
598 fprintf (out
, "%s [[[%s]], [%d]]",
599 first
? "" : ",\n", symbol
->tag
, number
);
601 /* FIXME: This is probably wrong, and should be just as
603 fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->value
);
610 save_column (int symbol
, int default_state
)
617 int symno
= symbol
- ntokens
+ nstates
;
619 short begin
= goto_map
[symbol
];
620 short end
= goto_map
[symbol
+ 1];
623 for (i
= begin
; i
< end
; i
++)
624 if (to_state
[i
] != default_state
)
630 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
631 tos
[symno
] = sp2
= XCALLOC (short, count
);
633 for (i
= begin
; i
< end
; i
++)
634 if (to_state
[i
] != default_state
)
636 *sp1
++ = from_state
[i
];
637 *sp2
++ = to_state
[i
];
640 tally
[symno
] = count
;
641 width
[symno
] = sp1
[-1] - sp
[0] + 1;
645 default_goto (int symbol
)
648 size_t m
= goto_map
[symbol
];
649 size_t n
= goto_map
[symbol
+ 1];
650 int default_state
= -1;
656 for (i
= 0; i
< nstates
; i
++)
659 for (i
= m
; i
< n
; i
++)
660 state_count
[to_state
[i
]]++;
662 for (i
= 0; i
< nstates
; i
++)
663 if (state_count
[i
] > max
)
665 max
= state_count
[i
];
669 return default_state
;
673 /*-------------------------------------------------------------------.
674 | Figure out what to do after reducing with each rule, depending on |
675 | the saved state from before the beginning of parsing the data that |
676 | matched this rule. |
678 | The YYDEFGOTO table is output now. The detailed info is saved for |
679 | putting into YYTABLE later. |
680 `-------------------------------------------------------------------*/
686 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
688 state_count
= XCALLOC (short, nstates
);
689 for (i
= ntokens
; i
< nsyms
; ++i
)
691 int default_state
= default_goto (i
);
692 save_column (i
, default_state
);
693 yydefgoto
[i
- ntokens
] = default_state
;
696 output_table_data (&format_obstack
, yydefgoto
,
697 yydefgoto
[0], 1, nsyms
- ntokens
);
698 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
705 /* The next few functions decide how to pack the actions and gotos
706 information into yytable. */
713 order
= XCALLOC (short, nvectors
);
716 for (i
= 0; i
< nvectors
; i
++)
722 int j
= nentries
- 1;
724 while (j
>= 0 && (width
[order
[j
]] < w
))
727 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
730 for (k
= nentries
- 1; k
> j
; k
--)
731 order
[k
+ 1] = order
[k
];
740 matching_state (int vector
)
742 int i
= order
[vector
];
747 if (i
>= (int) nstates
)
753 for (prev
= vector
- 1; prev
>= 0; prev
--)
759 if (width
[j
] != w
|| tally
[j
] != t
)
762 for (k
= 0; match
&& k
< t
; k
++)
763 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
775 pack_vector (int vector
)
777 int i
= order
[vector
];
781 short *from
= froms
[i
];
786 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
791 for (k
= 0; ok
&& k
< t
; k
++)
795 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
801 for (k
= 0; ok
&& k
< vector
; k
++)
807 for (k
= 0; k
< t
; k
++)
811 check
[loc
] = from
[k
];
814 while (table
[lowzero
] != 0)
823 #define pack_vector_succeeded 0
824 assert (pack_vector_succeeded
);
836 base
= XCALLOC (short, nvectors
);
837 pos
= XCALLOC (short, nentries
);
838 table
= XCALLOC (short, MAXTABLE
);
839 check
= XCALLOC (short, MAXTABLE
);
844 for (i
= 0; i
< nvectors
; i
++)
847 for (i
= 0; i
< MAXTABLE
; i
++)
850 for (i
= 0; i
< nentries
; i
++)
852 state
= matching_state (i
);
855 place
= pack_vector (i
);
860 base
[order
[i
]] = place
;
863 for (i
= 0; i
< nvectors
; i
++)
874 /* the following functions output yytable, yycheck
875 and the vectors whose elements index the portion starts */
881 output_table_data (&format_obstack
, base
,
882 base
[0], 1, nstates
);
883 muscle_insert ("pact", obstack_finish (&format_obstack
));
886 output_table_data (&format_obstack
, base
,
887 base
[nstates
], nstates
+ 1, nvectors
);
888 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
897 output_table_data (&format_obstack
, table
,
898 table
[0], 1, high
+ 1);
899 muscle_insert ("table", obstack_finish (&format_obstack
));
907 output_table_data (&format_obstack
, check
,
908 check
[0], 1, high
+ 1);
909 muscle_insert ("check", obstack_finish (&format_obstack
));
913 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
917 output_actions (void)
920 nvectors
= nstates
+ nvars
;
922 froms
= XCALLOC (short *, nvectors
);
923 tos
= XCALLOC (short *, nvectors
);
924 tally
= XCALLOC (short, nvectors
);
925 width
= XCALLOC (short, nvectors
);
932 XFREE (goto_map
+ ntokens
);
944 for (i
= 0; i
< nstates
; ++i
)
946 free (states
[i
]->shifts
);
947 XFREE (states
[i
]->reductions
);
948 free (states
[i
]->errs
);
955 /*---------------------------.
956 | Call the skeleton parser. |
957 `---------------------------*/
960 output_skeleton (void)
962 /* Store the definition of all the muscles. */
963 const char *tempdir
= getenv ("TMPDIR");
964 char *tempfile
= NULL
;
969 tempdir
= DEFAULT_TMPDIR
;
970 tempfile
= xmalloc (strlen (tempdir
) + 11);
971 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
972 fd
= mkstemp (tempfile
);
974 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
976 out
= fdopen (fd
, "w");
978 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
980 /* There are no comments, especially not `#': we do want M4 expansion
981 after `#': think of CPP macros! */
982 fputs ("m4_changecom()\n", out
);
983 fputs ("m4_init()\n", out
);
985 fputs ("m4_define([b4_actions], \n[[", out
);
986 actions_output (out
);
987 fputs ("]])\n\n", out
);
989 fputs ("m4_define([b4_guards], \n[[", out
);
991 fputs ("]])\n\n", out
);
993 fputs ("m4_define([b4_tokens], \n[", out
);
994 token_definitions_output (out
);
995 fputs ("])\n\n", out
);
997 muscles_m4_output (out
);
999 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1000 fputs ("m4_divert_push(0)dnl\n", out
);
1003 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1005 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1006 const char *m4
= getenv ("M4");
1009 if (!bison_pkgdatadir
)
1010 bison_pkgdatadir
= PKGDATADIR
;
1013 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1014 m4
, bison_pkgdatadir
, tempfile
, skeleton
);
1015 skel_in
= readpipe (m4
,
1016 "-I", bison_pkgdatadir
,
1017 "m4sugar/m4sugar.m4",
1022 error (EXIT_FAILURE
, errno
, "cannot run m4");
1025 /* If `debugging', keep this file alive. */
1034 MUSCLE_INSERT_INT ("last", high
);
1035 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1036 MUSCLE_INSERT_INT ("pure", pure_parser
);
1037 MUSCLE_INSERT_INT ("nsym", nsyms
);
1038 MUSCLE_INSERT_INT ("debug", debug_flag
);
1039 MUSCLE_INSERT_INT ("final", final_state
);
1040 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1041 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1042 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1044 /* FIXME: This is wrong: the muscles should decide whether they hold
1045 a copy or not, but the situation is too obscure currently. */
1046 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1047 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1048 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1049 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1051 MUSCLE_INSERT_INT ("nnts", nvars
);
1052 MUSCLE_INSERT_INT ("nrules", nrules
);
1053 MUSCLE_INSERT_INT ("nstates", nstates
);
1054 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1056 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1057 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1059 /* Copy definitions in directive. */
1060 obstack_1grow (&attrs_obstack
, 0);
1061 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1063 /* Find the right skeleton file. */
1066 if (semantic_parser
)
1067 skeleton
= "bison.hairy";
1069 skeleton
= "bison.simple";
1072 /* Parse the skeleton file and output the needed parsers. */
1073 muscle_insert ("skeleton", skeleton
);
1077 /*----------------------------------------------------------.
1078 | Output the parsing tables and the parser code to ftable. |
1079 `----------------------------------------------------------*/
1084 obstack_init (&format_obstack
);
1086 output_token_translations ();
1089 if (semantic_parser
)
1091 output_rule_data ();
1096 /* Process the selected skeleton file. */
1099 obstack_free (&muscle_obstack
, NULL
);
1100 obstack_free (&format_obstack
, NULL
);
1101 obstack_free (&action_obstack
, NULL
);
1102 obstack_free (&attrs_obstack
, NULL
);