]>
git.saurik.com Git - bison.git/blob - src/output.c
28a7992e4adc77ea8069ef737791ebfc8f08b86a
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;
136 /*----------------------------------------------------------------.
137 | Format the FIRST and then TABLE_DATA[BEGIN..END[ into OOUT, and |
138 | return the number of bits needed for its longuest value. |
139 `----------------------------------------------------------------*/
141 static inline long int
142 output_short_table (struct obstack
*oout
,
148 long int max
= first
;
152 obstack_fgrow1 (oout
, "%6d", first
);
153 for (i
= begin
; i
< end
; ++i
)
155 obstack_1grow (oout
, ',');
158 obstack_sgrow (oout
, "\n ");
163 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
164 if (table_data
[i
] > max
)
167 obstack_1grow (oout
, 0);
173 /*--------------------.
174 | Similar, for ints. |
175 `--------------------*/
177 static inline long int
178 output_int_table (struct obstack
*oout
,
184 long int max
= first
;
188 obstack_fgrow1 (oout
, "%6d", first
);
189 for (i
= begin
; i
< end
; ++i
)
191 obstack_1grow (oout
, ',');
194 obstack_sgrow (oout
, "\n ");
199 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
200 if (table_data
[i
] > max
)
203 obstack_1grow (oout
, 0);
209 /*-----------------------------------------------------------------.
210 | Prepare the muscles related to the tokens: translate, tname, and |
212 `-----------------------------------------------------------------*/
215 prepare_tokens (void)
217 long int max
= output_short_table (&format_obstack
, token_translations
,
218 0, 1, max_user_token_number
+ 1);
219 muscle_insert ("translate", obstack_finish (&format_obstack
));
220 MUSCLE_INSERT_LONG_INT ("token_number_max", max
);
221 XFREE (token_translations
);
226 for (i
= 0; i
< nsyms
; i
++)
228 /* Be sure not to use twice the same quotearg slot. */
230 quotearg_n_style (1, c_quoting_style
,
231 quotearg_style (escape_quoting_style
,
233 /* Width of the next token, including the two quotes, the coma
235 int strsize
= strlen (cp
) + 2;
237 if (j
+ strsize
> 75)
239 obstack_sgrow (&format_obstack
, "\n ");
243 obstack_sgrow (&format_obstack
, cp
);
244 obstack_sgrow (&format_obstack
, ", ");
247 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
249 obstack_sgrow (&format_obstack
, "0");
251 /* Finish table and store. */
252 obstack_1grow (&format_obstack
, 0);
253 muscle_insert ("tname", obstack_finish (&format_obstack
));
256 /* Output YYTOKNUM. */
259 short *values
= XCALLOC (short, ntokens
+ 1);
260 for (i
= 0; i
< ntokens
+ 1; ++i
)
261 values
[i
] = symbols
[i
]->user_token_number
;
262 output_short_table (&format_obstack
, values
,
264 muscle_insert ("toknum", obstack_finish (&format_obstack
));
270 /*-------------------------------------------------------------.
271 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
273 `-------------------------------------------------------------*/
282 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
283 short *prhs
= XMALLOC (short, nrules
+ 1);
284 short *r1
= XMALLOC (short, nrules
+ 1);
285 short *r2
= XMALLOC (short, nrules
+ 1);
286 short *rline
= XMALLOC (short, nrules
+ 1);
288 for (r
= 1; r
< nrules
+ 1; ++r
)
290 /* Index of rule R in RHS. */
292 /* RHS of the rule R. */
293 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
295 /* LHS of the rule R. */
296 r1
[r
] = rules
[r
].lhs
->number
;
297 /* Length of rule R's RHS. */
299 /* Separator in RHS. */
301 /* Line where rule was defined. */
302 rline
[r
] = rules
[r
].line
;
304 assert (i
== nritems
);
306 max
= output_int_table (&format_obstack
, rhs
, ritem
[0], 1, nritems
);
307 muscle_insert ("rhs", obstack_finish (&format_obstack
));
308 MUSCLE_INSERT_LONG_INT ("rhs_number_max", max
);
310 output_short_table (&format_obstack
, prhs
, 0, 1, nrules
+ 1);
311 muscle_insert ("prhs", obstack_finish (&format_obstack
));
313 output_short_table (&format_obstack
, rline
, 0, 1, nrules
+ 1);
314 muscle_insert ("rline", obstack_finish (&format_obstack
));
316 output_short_table (&format_obstack
, r1
, 0, 1, nrules
+ 1);
317 muscle_insert ("r1", obstack_finish (&format_obstack
));
319 output_short_table (&format_obstack
, r2
, 0, 1, nrules
+ 1);
320 muscle_insert ("r2", obstack_finish (&format_obstack
));
327 /*--------------------------------------------.
328 | Prepare the muscles related to the states. |
329 `--------------------------------------------*/
332 prepare_states (void)
335 short *values
= (short *) alloca (sizeof (short) * nstates
);
336 for (i
= 0; i
< nstates
; ++i
)
337 values
[i
] = states
[i
]->accessing_symbol
;
338 output_short_table (&format_obstack
, values
,
340 muscle_insert ("stos", obstack_finish (&format_obstack
));
344 /*------------------------------------------------------------------.
345 | Decide what to do for each type of token if seen as the lookahead |
346 | token in specified state. The value returned is used as the |
347 | default action (yydefact) for the state. In addition, actrow is |
348 | filled with what to do for each kind of token, index by symbol |
349 | number, with zero meaning do the default action. The value |
350 | SHRT_MIN, a very negative number, means this situation is an |
351 | error. The parser recognizes this value specially. |
353 | This is where conflicts are resolved. The loop over lookahead |
354 | rules considered lower-numbered rules last, and the last rule |
355 | considered that likes a token gets to handle it. |
356 `------------------------------------------------------------------*/
359 action_row (state_t
*state
)
362 int default_rule
= 0;
363 reductions
*redp
= state
->reductions
;
364 shifts
*shiftp
= state
->shifts
;
365 errs
*errp
= state
->errs
;
366 /* set nonzero to inhibit having any default reduction */
369 for (i
= 0; i
< ntokens
; i
++)
372 if (redp
->nreds
>= 1)
375 /* loop over all the rules available here which require
377 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
378 /* and find each token which the rule finds acceptable
380 for (j
= 0; j
< ntokens
; j
++)
381 /* and record this rule as the rule to use if that
383 if (bitset_test (LA
[state
->lookaheadsp
+ i
], j
))
384 actrow
[j
] = -LArule
[state
->lookaheadsp
+ i
]->number
;
387 /* Now see which tokens are allowed for shifts in this state. For
388 them, record the shift as the thing to do. So shift is preferred
390 for (i
= 0; i
< shiftp
->nshifts
; i
++)
393 int shift_state
= shiftp
->shifts
[i
];
397 symbol
= states
[shift_state
]->accessing_symbol
;
402 actrow
[symbol
] = shift_state
;
404 /* Do not use any default reduction if there is a shift for
406 if (symbol
== errtoken
->number
)
410 /* See which tokens are an explicit error in this state (due to
411 %nonassoc). For them, record SHRT_MIN as the action. */
412 for (i
= 0; i
< errp
->nerrs
; i
++)
414 int symbol
= errp
->errs
[i
];
415 actrow
[symbol
] = SHRT_MIN
;
418 /* Now find the most common reduction and make it the default action
421 if (redp
->nreds
>= 1 && !nodefault
)
423 if (state
->consistent
)
424 default_rule
= redp
->rules
[0];
428 for (i
= 0; i
< state
->nlookaheads
; i
++)
431 int rule
= -LArule
[state
->lookaheadsp
+ i
]->number
;
434 for (j
= 0; j
< ntokens
; j
++)
435 if (actrow
[j
] == rule
)
445 /* actions which match the default are replaced with zero,
446 which means "use the default" */
451 for (j
= 0; j
< ntokens
; j
++)
452 if (actrow
[j
] == default_rule
)
455 default_rule
= -default_rule
;
460 /* If have no default rule, the default is an error.
461 So replace any action which says "error" with "use default". */
463 if (default_rule
== 0)
464 for (i
= 0; i
< ntokens
; i
++)
465 if (actrow
[i
] == SHRT_MIN
)
482 for (i
= 0; i
< ntokens
; i
++)
489 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
490 tos
[state
] = sp2
= XCALLOC (short, count
);
492 for (i
= 0; i
< ntokens
; i
++)
499 tally
[state
] = count
;
500 width
[state
] = sp1
[-1] - sp
[0] + 1;
504 /*------------------------------------------------------------------.
505 | Figure out the actions for the specified state, indexed by |
506 | lookahead token type. |
508 | The YYDEFACT table is output now. The detailed info is saved for |
509 | putting into YYTABLE later. |
510 `------------------------------------------------------------------*/
516 short *yydefact
= XCALLOC (short, nstates
);
518 actrow
= XCALLOC (short, ntokens
);
519 for (i
= 0; i
< nstates
; ++i
)
521 yydefact
[i
] = action_row (states
[i
]);
525 output_short_table (&format_obstack
, yydefact
,
526 yydefact
[0], 1, nstates
);
527 muscle_insert ("defact", obstack_finish (&format_obstack
));
534 /*-----------------------------.
535 | Output the actions to OOUT. |
536 `-----------------------------*/
539 actions_output (FILE *out
)
542 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
543 if (rules
[rule
].action
)
545 fprintf (out
, " case %d:\n", rule
);
548 fprintf (out
, muscle_find ("linef"),
549 rules
[rule
].action_line
,
550 quotearg_style (c_quoting_style
,
551 muscle_find ("filename")));
552 /* As a Bison extension, add the ending semicolon. Since some
553 Yacc don't do that, help people using bison as a Yacc
554 finding their missing semicolons. */
555 fprintf (out
, "{ %s%s }\n break;\n\n",
557 yacc_flag
? ";" : "");
562 /*----------------------------.
563 | Output the guards to OOUT. |
564 `----------------------------*/
567 guards_output (FILE *out
)
570 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
571 if (rules
[rule
].guard
)
573 fprintf (out
, " case %d:\n", rule
);
576 fprintf (out
, muscle_find ("linef"),
577 rules
[rule
].guard_line
,
578 quotearg_style (c_quoting_style
,
579 muscle_find ("filename")));
580 fprintf (out
, "{ %s; }\n break;\n\n",
586 /*---------------------------------------.
587 | Output the tokens definition to OOUT. |
588 `---------------------------------------*/
591 token_definitions_output (FILE *out
)
595 for (i
= 0; i
< ntokens
; ++i
)
597 symbol_t
*symbol
= symbols
[i
];
598 int number
= symbol
->user_token_number
;
600 if (number
== SALIAS
)
602 /* Skip error token. */
603 if (symbol
== errtoken
)
605 if (symbol
->tag
[0] == '\'')
606 continue; /* skip literal character */
607 if (symbol
->tag
[0] == '\"')
609 /* use literal string only if given a symbol with an alias */
611 symbol
= symbol
->alias
;
616 /* Don't #define nonliteral tokens whose names contain periods
617 or '$' (as does the default value of the EOF token). */
618 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
621 fprintf (out
, "%s [[[%s]], [%d]]",
622 first
? "" : ",\n", symbol
->tag
, number
);
624 /* FIXME: This is probably wrong, and should be just as
626 fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->number
);
633 save_column (int symbol
, int default_state
)
640 int symno
= symbol
- ntokens
+ nstates
;
642 short begin
= goto_map
[symbol
];
643 short end
= goto_map
[symbol
+ 1];
646 for (i
= begin
; i
< end
; i
++)
647 if (to_state
[i
] != default_state
)
653 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
654 tos
[symno
] = sp2
= XCALLOC (short, count
);
656 for (i
= begin
; i
< end
; i
++)
657 if (to_state
[i
] != default_state
)
659 *sp1
++ = from_state
[i
];
660 *sp2
++ = to_state
[i
];
663 tally
[symno
] = count
;
664 width
[symno
] = sp1
[-1] - sp
[0] + 1;
668 default_goto (int symbol
)
671 size_t m
= goto_map
[symbol
];
672 size_t n
= goto_map
[symbol
+ 1];
673 int default_state
= -1;
679 for (i
= 0; i
< nstates
; i
++)
682 for (i
= m
; i
< n
; i
++)
683 state_count
[to_state
[i
]]++;
685 for (i
= 0; i
< nstates
; i
++)
686 if (state_count
[i
] > max
)
688 max
= state_count
[i
];
692 return default_state
;
696 /*-------------------------------------------------------------------.
697 | Figure out what to do after reducing with each rule, depending on |
698 | the saved state from before the beginning of parsing the data that |
699 | matched this rule. |
701 | The YYDEFGOTO table is output now. The detailed info is saved for |
702 | putting into YYTABLE later. |
703 `-------------------------------------------------------------------*/
709 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
711 state_count
= XCALLOC (short, nstates
);
712 for (i
= ntokens
; i
< nsyms
; ++i
)
714 int default_state
= default_goto (i
);
715 save_column (i
, default_state
);
716 yydefgoto
[i
- ntokens
] = default_state
;
719 output_short_table (&format_obstack
, yydefgoto
,
720 yydefgoto
[0], 1, nsyms
- ntokens
);
721 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
728 /* The next few functions decide how to pack the actions and gotos
729 information into yytable. */
736 order
= XCALLOC (short, nvectors
);
739 for (i
= 0; i
< nvectors
; i
++)
745 int j
= nentries
- 1;
747 while (j
>= 0 && (width
[order
[j
]] < w
))
750 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
753 for (k
= nentries
- 1; k
> j
; k
--)
754 order
[k
+ 1] = order
[k
];
763 matching_state (int vector
)
765 int i
= order
[vector
];
770 if (i
>= (int) nstates
)
776 for (prev
= vector
- 1; prev
>= 0; prev
--)
782 if (width
[j
] != w
|| tally
[j
] != t
)
785 for (k
= 0; match
&& k
< t
; k
++)
786 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
796 /* FIXME: For the time being, best approximation... */
797 #define MAXTABLE SHRT_MAX
800 pack_vector (int vector
)
802 int i
= order
[vector
];
806 short *from
= froms
[i
];
811 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
816 for (k
= 0; ok
&& k
< t
; k
++)
820 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
826 for (k
= 0; ok
&& k
< vector
; k
++)
832 for (k
= 0; k
< t
; k
++)
836 check
[loc
] = from
[k
];
839 while (table
[lowzero
] != 0)
848 #define pack_vector_succeeded 0
849 assert (pack_vector_succeeded
);
861 base
= XCALLOC (short, nvectors
);
862 pos
= XCALLOC (short, nentries
);
863 table
= XCALLOC (short, MAXTABLE
);
864 check
= XCALLOC (short, MAXTABLE
);
869 for (i
= 0; i
< nvectors
; i
++)
872 for (i
= 0; i
< MAXTABLE
; i
++)
875 for (i
= 0; i
< nentries
; i
++)
877 state
= matching_state (i
);
880 place
= pack_vector (i
);
885 base
[order
[i
]] = place
;
888 for (i
= 0; i
< nvectors
; i
++)
899 /* the following functions output yytable, yycheck
900 and the vectors whose elements index the portion starts */
906 output_short_table (&format_obstack
, base
,
907 base
[0], 1, nstates
);
908 muscle_insert ("pact", obstack_finish (&format_obstack
));
911 output_short_table (&format_obstack
, base
,
912 base
[nstates
], nstates
+ 1, nvectors
);
913 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
922 output_short_table (&format_obstack
, table
,
923 table
[0], 1, high
+ 1);
924 muscle_insert ("table", obstack_finish (&format_obstack
));
932 output_short_table (&format_obstack
, check
,
933 check
[0], 1, high
+ 1);
934 muscle_insert ("check", obstack_finish (&format_obstack
));
938 /*-----------------------------------------------------------------.
939 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
941 `-----------------------------------------------------------------*/
944 output_actions (void)
947 nvectors
= nstates
+ nvars
;
949 froms
= XCALLOC (short *, nvectors
);
950 tos
= XCALLOC (short *, nvectors
);
951 tally
= XCALLOC (short, nvectors
);
952 width
= XCALLOC (short, nvectors
);
959 XFREE (goto_map
+ ntokens
);
971 for (i
= 0; i
< nstates
; ++i
)
973 free (states
[i
]->shifts
);
974 XFREE (states
[i
]->reductions
);
975 free (states
[i
]->errs
);
982 /*---------------------------.
983 | Call the skeleton parser. |
984 `---------------------------*/
987 output_skeleton (void)
989 /* Store the definition of all the muscles. */
990 const char *tempdir
= getenv ("TMPDIR");
991 char *tempfile
= NULL
;
996 tempdir
= DEFAULT_TMPDIR
;
997 tempfile
= xmalloc (strlen (tempdir
) + 11);
998 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
999 fd
= mkstemp (tempfile
);
1001 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1003 out
= fdopen (fd
, "w");
1005 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1007 /* There are no comments, especially not `#': we do want M4 expansion
1008 after `#': think of CPP macros! */
1009 fputs ("m4_changecom()\n", out
);
1010 fputs ("m4_init()\n", out
);
1012 fputs ("m4_define([b4_actions], \n[[", out
);
1013 actions_output (out
);
1014 fputs ("]])\n\n", out
);
1016 fputs ("m4_define([b4_guards], \n[[", out
);
1017 guards_output (out
);
1018 fputs ("]])\n\n", out
);
1020 fputs ("m4_define([b4_tokens], \n[", out
);
1021 token_definitions_output (out
);
1022 fputs ("])\n\n", out
);
1024 muscles_m4_output (out
);
1026 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1027 fputs ("m4_divert_push(0)dnl\n", out
);
1030 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1032 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1033 const char *m4
= getenv ("M4");
1036 if (!bison_pkgdatadir
)
1037 bison_pkgdatadir
= PKGDATADIR
;
1040 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1041 m4
, bison_pkgdatadir
, tempfile
, skeleton
);
1042 skel_in
= readpipe (m4
,
1043 "-I", bison_pkgdatadir
,
1044 "m4sugar/m4sugar.m4",
1049 error (EXIT_FAILURE
, errno
, "cannot run m4");
1052 /* If `debugging', keep this file alive. */
1061 MUSCLE_INSERT_INT ("last", high
);
1062 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1063 MUSCLE_INSERT_INT ("pure", pure_parser
);
1064 MUSCLE_INSERT_INT ("nsym", nsyms
);
1065 MUSCLE_INSERT_INT ("debug", debug_flag
);
1066 MUSCLE_INSERT_INT ("final", final_state
);
1067 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1068 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1069 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1070 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1072 /* FIXME: This is wrong: the muscles should decide whether they hold
1073 a copy or not, but the situation is too obscure currently. */
1074 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1075 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1076 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1077 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1079 MUSCLE_INSERT_INT ("nnts", nvars
);
1080 MUSCLE_INSERT_INT ("nrules", nrules
);
1081 MUSCLE_INSERT_INT ("nstates", nstates
);
1082 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1084 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1085 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1087 /* Copy definitions in directive. */
1088 obstack_1grow (&attrs_obstack
, 0);
1089 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1091 /* Find the right skeleton file. */
1094 if (semantic_parser
)
1095 skeleton
= "bison.hairy";
1097 skeleton
= "bison.simple";
1100 /* Parse the skeleton file and output the needed parsers. */
1101 muscle_insert ("skeleton", skeleton
);
1105 /*----------------------------------------------------------.
1106 | Output the parsing tables and the parser code to ftable. |
1107 `----------------------------------------------------------*/
1112 obstack_init (&format_obstack
);
1121 /* Process the selected skeleton file. */
1124 obstack_free (&muscle_obstack
, NULL
);
1125 obstack_free (&format_obstack
, NULL
);
1126 obstack_free (&action_obstack
, NULL
);
1127 obstack_free (&attrs_obstack
, NULL
);