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
;
126 /* TABLE_SIZE is the allocated size of both TABLE and CHECK.
127 We start with the original hard-coded value: SHRT_MAX
128 (yes, not USHRT_MAX). */
129 static size_t table_size
= SHRT_MAX
;
130 static short *table
= NULL
;
131 static short *check
= NULL
;
135 struct obstack muscle_obstack
;
136 static struct obstack format_obstack
;
138 int error_verbose
= 0;
141 /*----------------------------------------------------------------.
142 | If TABLE (and CHECK) appear to be small to be addressed at |
143 | DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
144 | the desired size is at least DESIRED + 1. |
145 `----------------------------------------------------------------*/
148 table_grow (size_t desired
)
150 size_t old_size
= table_size
;
152 while (table_size
<= desired
)
156 fprintf (stderr
, "growing table and check from: %d to %d\n",
157 old_size
, table_size
);
159 table
= XREALLOC (table
, short, table_size
);
160 check
= XREALLOC (check
, short, table_size
);
162 for (/* Nothing. */; old_size
< table_size
; ++old_size
)
165 check
[old_size
] = -1;
170 /*-------------------------------------------------------------------.
171 | Create a function NAME which associates to the muscle NAME the |
172 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
173 | TYPE), and to the muscle NAME_max, the max value of the |
175 `-------------------------------------------------------------------*/
178 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
181 Name (const char *name, \
187 long int max = first; \
191 obstack_fgrow1 (&format_obstack, "%6d", first); \
192 for (i = begin; i < end; ++i) \
194 obstack_1grow (&format_obstack, ','); \
197 obstack_sgrow (&format_obstack, "\n "); \
202 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
203 if (table_data[i] > max) \
204 max = table_data[i]; \
206 obstack_1grow (&format_obstack, 0); \
207 muscle_insert (name, obstack_finish (&format_obstack)); \
209 /* Build `NAME_max' in the obstack. */ \
210 obstack_fgrow1 (&format_obstack, "%s_max", name); \
211 obstack_1grow (&format_obstack, 0); \
212 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), max); \
215 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table
, int)
216 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int)
217 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table
, short)
218 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_token_number_table
, token_number_t
)
219 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number_t
)
222 /*-----------------------------------------------------------------.
223 | Prepare the muscles related to the tokens: translate, tname, and |
225 `-----------------------------------------------------------------*/
228 prepare_tokens (void)
230 muscle_insert_token_number_table ("translate",
232 0, 1, max_user_token_number
+ 1);
237 for (i
= 0; i
< nsyms
; i
++)
239 /* Be sure not to use twice the same quotearg slot. */
241 quotearg_n_style (1, c_quoting_style
,
242 quotearg_style (escape_quoting_style
,
244 /* Width of the next token, including the two quotes, the coma
246 int strsize
= strlen (cp
) + 2;
248 if (j
+ strsize
> 75)
250 obstack_sgrow (&format_obstack
, "\n ");
254 obstack_sgrow (&format_obstack
, cp
);
255 obstack_sgrow (&format_obstack
, ", ");
258 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
260 obstack_sgrow (&format_obstack
, "0");
262 /* Finish table and store. */
263 obstack_1grow (&format_obstack
, 0);
264 muscle_insert ("tname", obstack_finish (&format_obstack
));
267 /* Output YYTOKNUM. */
270 short *values
= XCALLOC (short, ntokens
+ 1);
271 for (i
= 0; i
< ntokens
+ 1; ++i
)
272 values
[i
] = symbols
[i
]->user_token_number
;
273 muscle_insert_short_table ("toknum", values
,
280 /*-------------------------------------------------------------.
281 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
283 `-------------------------------------------------------------*/
291 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
292 unsigned int *prhs
= XMALLOC (unsigned int, nrules
+ 1);
293 unsigned int *rline
= XMALLOC (unsigned int, nrules
+ 1);
294 token_number_t
*r1
= XMALLOC (token_number_t
, nrules
+ 1);
295 unsigned int *r2
= XMALLOC (unsigned int, nrules
+ 1);
297 for (r
= 1; r
< nrules
+ 1; ++r
)
300 /* Index of rule R in RHS. */
302 /* RHS of the rule R. */
303 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
305 /* LHS of the rule R. */
306 r1
[r
] = rules
[r
].lhs
->number
;
307 /* Length of rule R's RHS. */
309 /* Separator in RHS. */
311 /* Line where rule was defined. */
312 rline
[r
] = rules
[r
].line
;
314 assert (i
== nritems
);
316 muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
);
317 muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 1, nrules
+ 1);
318 muscle_insert_unsigned_int_table ("rline", rline
, 0, 1, nrules
+ 1);
319 muscle_insert_token_number_table ("r1", r1
, 0, 1, nrules
+ 1);
320 muscle_insert_unsigned_int_table ("r2", r2
, 0, 1, nrules
+ 1);
329 /*--------------------------------------------.
330 | Prepare the muscles related to the states. |
331 `--------------------------------------------*/
334 prepare_states (void)
337 token_number_t
*values
=
338 (token_number_t
*) alloca (sizeof (token_number_t
) * nstates
);
339 for (i
= 0; i
< nstates
; ++i
)
340 values
[i
] = states
[i
]->accessing_symbol
;
341 muscle_insert_token_number_table ("stos", values
,
346 /*------------------------------------------------------------------.
347 | Decide what to do for each type of token if seen as the lookahead |
348 | token in specified state. The value returned is used as the |
349 | default action (yydefact) for the state. In addition, actrow is |
350 | filled with what to do for each kind of token, index by symbol |
351 | number, with zero meaning do the default action. The value |
352 | SHRT_MIN, a very negative number, means this situation is an |
353 | error. The parser recognizes this value specially. |
355 | This is where conflicts are resolved. The loop over lookahead |
356 | rules considered lower-numbered rules last, and the last rule |
357 | considered that likes a token gets to handle it. |
358 `------------------------------------------------------------------*/
361 action_row (state_t
*state
)
364 int default_rule
= 0;
365 reductions
*redp
= state
->reductions
;
366 shifts
*shiftp
= state
->shifts
;
367 errs
*errp
= state
->errs
;
368 /* set nonzero to inhibit having any default reduction */
371 for (i
= 0; i
< ntokens
; i
++)
374 if (redp
->nreds
>= 1)
377 /* loop over all the rules available here which require
379 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
380 /* and find each token which the rule finds acceptable
382 for (j
= 0; j
< ntokens
; j
++)
383 /* and record this rule as the rule to use if that
385 if (bitset_test (LA
[state
->lookaheadsp
+ i
], j
))
386 actrow
[j
] = -LArule
[state
->lookaheadsp
+ i
]->number
;
389 /* Now see which tokens are allowed for shifts in this state. For
390 them, record the shift as the thing to do. So shift is preferred
392 for (i
= 0; i
< shiftp
->nshifts
; i
++)
394 token_number_t symbol
;
395 int shift_state
= shiftp
->shifts
[i
];
399 symbol
= states
[shift_state
]->accessing_symbol
;
404 actrow
[symbol
] = shift_state
;
406 /* Do not use any default reduction if there is a shift for
408 if (symbol
== errtoken
->number
)
412 /* See which tokens are an explicit error in this state (due to
413 %nonassoc). For them, record SHRT_MIN as the action. */
414 for (i
= 0; i
< errp
->nerrs
; i
++)
416 int symbol
= errp
->errs
[i
];
417 actrow
[symbol
] = SHRT_MIN
;
420 /* Now find the most common reduction and make it the default action
423 if (redp
->nreds
>= 1 && !nodefault
)
425 if (state
->consistent
)
426 default_rule
= redp
->rules
[0];
430 for (i
= 0; i
< state
->nlookaheads
; i
++)
433 int rule
= -LArule
[state
->lookaheadsp
+ i
]->number
;
436 for (j
= 0; j
< ntokens
; j
++)
437 if (actrow
[j
] == rule
)
447 /* actions which match the default are replaced with zero,
448 which means "use the default" */
453 for (j
= 0; j
< ntokens
; j
++)
454 if (actrow
[j
] == default_rule
)
457 default_rule
= -default_rule
;
462 /* If have no default rule, the default is an error.
463 So replace any action which says "error" with "use default". */
465 if (default_rule
== 0)
466 for (i
= 0; i
< ntokens
; i
++)
467 if (actrow
[i
] == SHRT_MIN
)
484 for (i
= 0; i
< ntokens
; i
++)
491 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
492 tos
[state
] = sp2
= XCALLOC (short, count
);
494 for (i
= 0; i
< ntokens
; i
++)
501 tally
[state
] = count
;
502 width
[state
] = sp1
[-1] - sp
[0] + 1;
506 /*------------------------------------------------------------------.
507 | Figure out the actions for the specified state, indexed by |
508 | lookahead token type. |
510 | The YYDEFACT table is output now. The detailed info is saved for |
511 | putting into YYTABLE later. |
512 `------------------------------------------------------------------*/
518 short *yydefact
= XCALLOC (short, nstates
);
520 actrow
= XCALLOC (short, ntokens
);
521 for (i
= 0; i
< nstates
; ++i
)
523 yydefact
[i
] = action_row (states
[i
]);
527 muscle_insert_short_table ("defact", yydefact
,
528 yydefact
[0], 1, nstates
);
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 tokens definition to OOUT. |
564 `---------------------------------------*/
567 token_definitions_output (FILE *out
)
571 for (i
= 0; i
< ntokens
; ++i
)
573 symbol_t
*symbol
= symbols
[i
];
574 int number
= symbol
->user_token_number
;
576 /* At this stage, if there are literal aliases, they are part of
577 SYMBOLS, so we should not find symbols which are the aliases
579 assert (number
!= USER_NUMBER_ALIAS
);
581 /* Skip error token. */
582 if (symbol
== errtoken
)
585 /* If this string has an alias, then it is necessarily the alias
586 which is to be output. */
588 symbol
= symbol
->alias
;
590 /* Don't output literal chars or strings (when defined only as a
591 string). Note that must be done after the alias resolution:
592 think about `%token 'f' "f"'. */
593 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
596 /* Don't #define nonliteral tokens whose names contain periods
597 or '$' (as does the default value of the EOF token). */
598 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
601 fprintf (out
, "%s[[[%s]], [%d]]",
602 first
? "" : ",\n", symbol
->tag
, number
);
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 muscle_insert_short_table ("defgoto", yydefgoto
,
697 yydefgoto
[0], 1, nsyms
- ntokens
);
703 /* The next few functions decide how to pack the actions and gotos
704 information into yytable. */
711 order
= XCALLOC (short, nvectors
);
714 for (i
= 0; i
< nvectors
; i
++)
720 int j
= nentries
- 1;
722 while (j
>= 0 && (width
[order
[j
]] < w
))
725 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
728 for (k
= nentries
- 1; k
> j
; k
--)
729 order
[k
+ 1] = order
[k
];
738 matching_state (int vector
)
740 int i
= order
[vector
];
745 if (i
>= (int) nstates
)
751 for (prev
= vector
- 1; prev
>= 0; prev
--)
757 if (width
[j
] != w
|| tally
[j
] != t
)
760 for (k
= 0; match
&& k
< t
; k
++)
761 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
773 pack_vector (int vector
)
775 int i
= order
[vector
];
779 short *from
= froms
[i
];
784 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
789 for (k
= 0; ok
&& k
< t
; k
++)
792 if (loc
> (int) table_size
)
799 for (k
= 0; ok
&& k
< vector
; k
++)
805 for (k
= 0; k
< t
; k
++)
809 check
[loc
] = from
[k
];
812 while (table
[lowzero
] != 0)
821 #define pack_vector_succeeded 0
822 assert (pack_vector_succeeded
);
834 base
= XCALLOC (short, nvectors
);
835 pos
= XCALLOC (short, nentries
);
836 table
= XCALLOC (short, table_size
);
837 check
= XCALLOC (short, table_size
);
842 for (i
= 0; i
< nvectors
; i
++)
845 for (i
= 0; i
< (int) table_size
; i
++)
848 for (i
= 0; i
< nentries
; i
++)
850 state
= matching_state (i
);
853 place
= pack_vector (i
);
858 base
[order
[i
]] = place
;
861 for (i
= 0; i
< nvectors
; i
++)
872 /* the following functions output yytable, yycheck
873 and the vectors whose elements index the portion starts */
879 muscle_insert_short_table ("pact", base
,
880 base
[0], 1, nstates
);
883 muscle_insert_short_table ("pgoto", base
,
884 base
[nstates
], nstates
+ 1, nvectors
);
892 muscle_insert_short_table ("table", table
,
893 table
[0], 1, high
+ 1);
901 muscle_insert_short_table ("check", check
,
902 check
[0], 1, high
+ 1);
906 /*-----------------------------------------------------------------.
907 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
909 `-----------------------------------------------------------------*/
912 output_actions (void)
915 nvectors
= nstates
+ nvars
;
917 froms
= XCALLOC (short *, nvectors
);
918 tos
= XCALLOC (short *, nvectors
);
919 tally
= XCALLOC (short, nvectors
);
920 width
= XCALLOC (short, nvectors
);
927 XFREE (goto_map
+ ntokens
);
939 for (i
= 0; i
< nstates
; ++i
)
941 free (states
[i
]->shifts
);
942 XFREE (states
[i
]->reductions
);
943 free (states
[i
]->errs
);
950 /*---------------------------.
951 | Call the skeleton parser. |
952 `---------------------------*/
955 output_skeleton (void)
957 /* Store the definition of all the muscles. */
958 const char *tempdir
= getenv ("TMPDIR");
959 char *tempfile
= NULL
;
964 tempdir
= DEFAULT_TMPDIR
;
965 tempfile
= xmalloc (strlen (tempdir
) + 11);
966 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
967 fd
= mkstemp (tempfile
);
969 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
971 out
= fdopen (fd
, "w");
973 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
975 /* There are no comments, especially not `#': we do want M4 expansion
976 after `#': think of CPP macros! */
977 fputs ("m4_changecom()\n", out
);
978 fputs ("m4_init()\n", out
);
980 fputs ("m4_define([b4_actions], \n[[", out
);
981 actions_output (out
);
982 fputs ("]])\n\n", out
);
984 fputs ("m4_define([b4_tokens], \n[", out
);
985 token_definitions_output (out
);
986 fputs ("])\n\n", out
);
988 muscles_m4_output (out
);
990 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
991 fputs ("m4_divert_push(0)dnl\n", out
);
994 /* Invoke m4 on the definition of the muscles, and the skeleton. */
996 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
997 const char *m4
= getenv ("M4");
1000 if (!bison_pkgdatadir
)
1001 bison_pkgdatadir
= PKGDATADIR
;
1004 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1005 m4
, bison_pkgdatadir
, tempfile
, skeleton
);
1006 skel_in
= readpipe (m4
,
1007 "-I", bison_pkgdatadir
,
1008 "m4sugar/m4sugar.m4",
1013 error (EXIT_FAILURE
, errno
, "cannot run m4");
1016 /* If `debugging', keep this file alive. */
1025 MUSCLE_INSERT_INT ("last", high
);
1026 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1027 MUSCLE_INSERT_INT ("pure", pure_parser
);
1028 MUSCLE_INSERT_INT ("nsym", nsyms
);
1029 MUSCLE_INSERT_INT ("debug", debug_flag
);
1030 MUSCLE_INSERT_INT ("final", final_state
);
1031 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1032 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1033 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1034 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1036 /* FIXME: This is wrong: the muscles should decide whether they hold
1037 a copy or not, but the situation is too obscure currently. */
1038 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1039 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1040 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1041 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
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
);
1049 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1051 /* Copy definitions in directive. */
1052 obstack_1grow (&pre_prologue_obstack
, 0);
1053 obstack_1grow (&post_prologue_obstack
, 0);
1054 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1055 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1057 /* Find the right skeleton file. */
1059 skeleton
= "bison.simple";
1061 /* Parse the skeleton file and output the needed parsers. */
1062 muscle_insert ("skeleton", skeleton
);
1066 /*----------------------------------------------------------.
1067 | Output the parsing tables and the parser code to ftable. |
1068 `----------------------------------------------------------*/
1073 obstack_init (&format_obstack
);
1082 /* Process the selected skeleton file. */
1085 obstack_free (&muscle_obstack
, NULL
);
1086 obstack_free (&format_obstack
, NULL
);
1087 obstack_free (&action_obstack
, NULL
);
1088 obstack_free (&pre_prologue_obstack
, NULL
);
1089 obstack_free (&post_prologue_obstack
, NULL
);