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 Format the FIRST and then |
172 | TABLE_DATA[BEGIN..END[ (of TYPE) into OOUT, and return the number |
173 | of bits needed for its longuest value. |
174 `------------------------------------------------------------------*/
177 #define GENERATE_OUTPUT_TABLE(Name, Type) \
179 static inline long int \
180 Name (struct obstack *oout, \
186 long int max = first; \
190 obstack_fgrow1 (oout, "%6d", first); \
191 for (i = begin; i < end; ++i) \
193 obstack_1grow (oout, ','); \
196 obstack_sgrow (oout, "\n "); \
201 obstack_fgrow1 (oout, "%6d", table_data[i]); \
202 if (table_data[i] > max) \
203 max = table_data[i]; \
205 obstack_1grow (oout, 0); \
210 GENERATE_OUTPUT_TABLE(output_int_table
, int)
211 GENERATE_OUTPUT_TABLE(output_unsigned_int_table
, unsigned int)
212 GENERATE_OUTPUT_TABLE(output_short_table
, short)
213 GENERATE_OUTPUT_TABLE(output_token_number_table
, token_number_t
)
214 GENERATE_OUTPUT_TABLE(output_item_number_table
, item_number_t
)
217 /*-----------------------------------------------------------------.
218 | Prepare the muscles related to the tokens: translate, tname, and |
220 `-----------------------------------------------------------------*/
223 prepare_tokens (void)
225 long int max
= output_token_number_table (&format_obstack
,
227 0, 1, max_user_token_number
+ 1);
228 muscle_insert ("translate", obstack_finish (&format_obstack
));
229 MUSCLE_INSERT_LONG_INT ("token_number_max", max
);
230 XFREE (token_translations
);
235 for (i
= 0; i
< nsyms
; i
++)
237 /* Be sure not to use twice the same quotearg slot. */
239 quotearg_n_style (1, c_quoting_style
,
240 quotearg_style (escape_quoting_style
,
242 /* Width of the next token, including the two quotes, the coma
244 int strsize
= strlen (cp
) + 2;
246 if (j
+ strsize
> 75)
248 obstack_sgrow (&format_obstack
, "\n ");
252 obstack_sgrow (&format_obstack
, cp
);
253 obstack_sgrow (&format_obstack
, ", ");
256 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
258 obstack_sgrow (&format_obstack
, "0");
260 /* Finish table and store. */
261 obstack_1grow (&format_obstack
, 0);
262 muscle_insert ("tname", obstack_finish (&format_obstack
));
265 /* Output YYTOKNUM. */
268 short *values
= XCALLOC (short, ntokens
+ 1);
269 for (i
= 0; i
< ntokens
+ 1; ++i
)
270 values
[i
] = symbols
[i
]->user_token_number
;
271 output_short_table (&format_obstack
, values
,
273 muscle_insert ("toknum", obstack_finish (&format_obstack
));
279 /*-------------------------------------------------------------.
280 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
282 `-------------------------------------------------------------*/
290 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
291 unsigned int *prhs
= XMALLOC (unsigned int, nrules
+ 1);
292 unsigned int *rline
= XMALLOC (unsigned int, nrules
+ 1);
293 token_number_t
*r1
= XMALLOC (token_number_t
, nrules
+ 1);
294 unsigned int *r2
= XMALLOC (unsigned int, nrules
+ 1);
296 for (r
= 1; r
< nrules
+ 1; ++r
)
299 /* Index of rule R in RHS. */
301 /* RHS of the rule R. */
302 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
304 /* LHS of the rule R. */
305 r1
[r
] = rules
[r
].lhs
->number
;
306 /* Length of rule R's RHS. */
308 /* Separator in RHS. */
310 /* Line where rule was defined. */
311 rline
[r
] = rules
[r
].line
;
313 assert (i
== nritems
);
315 max
= output_item_number_table (&format_obstack
, rhs
, ritem
[0], 1, nritems
);
316 muscle_insert ("rhs", obstack_finish (&format_obstack
));
317 MUSCLE_INSERT_LONG_INT ("rhs_max", max
);
319 max
= output_unsigned_int_table (&format_obstack
, prhs
, 0, 1, nrules
+ 1);
320 muscle_insert ("prhs", obstack_finish (&format_obstack
));
321 MUSCLE_INSERT_LONG_INT ("prhs_max", max
);
323 max
= output_unsigned_int_table (&format_obstack
, rline
, 0, 1, nrules
+ 1);
324 muscle_insert ("rline", obstack_finish (&format_obstack
));
325 MUSCLE_INSERT_LONG_INT ("rline_max", max
);
327 output_token_number_table (&format_obstack
, r1
, 0, 1, nrules
+ 1);
328 muscle_insert ("r1", obstack_finish (&format_obstack
));
330 max
= output_unsigned_int_table (&format_obstack
, r2
, 0, 1, nrules
+ 1);
331 muscle_insert ("r2", obstack_finish (&format_obstack
));
332 MUSCLE_INSERT_LONG_INT ("r2_max", max
);
341 /*--------------------------------------------.
342 | Prepare the muscles related to the states. |
343 `--------------------------------------------*/
346 prepare_states (void)
349 token_number_t
*values
=
350 (token_number_t
*) alloca (sizeof (token_number_t
) * nstates
);
351 for (i
= 0; i
< nstates
; ++i
)
352 values
[i
] = states
[i
]->accessing_symbol
;
353 output_token_number_table (&format_obstack
, values
,
355 muscle_insert ("stos", obstack_finish (&format_obstack
));
359 /*------------------------------------------------------------------.
360 | Decide what to do for each type of token if seen as the lookahead |
361 | token in specified state. The value returned is used as the |
362 | default action (yydefact) for the state. In addition, actrow is |
363 | filled with what to do for each kind of token, index by symbol |
364 | number, with zero meaning do the default action. The value |
365 | SHRT_MIN, a very negative number, means this situation is an |
366 | error. The parser recognizes this value specially. |
368 | This is where conflicts are resolved. The loop over lookahead |
369 | rules considered lower-numbered rules last, and the last rule |
370 | considered that likes a token gets to handle it. |
371 `------------------------------------------------------------------*/
374 action_row (state_t
*state
)
377 int default_rule
= 0;
378 reductions
*redp
= state
->reductions
;
379 shifts
*shiftp
= state
->shifts
;
380 errs
*errp
= state
->errs
;
381 /* set nonzero to inhibit having any default reduction */
384 for (i
= 0; i
< ntokens
; i
++)
387 if (redp
->nreds
>= 1)
390 /* loop over all the rules available here which require
392 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
393 /* and find each token which the rule finds acceptable
395 for (j
= 0; j
< ntokens
; j
++)
396 /* and record this rule as the rule to use if that
398 if (bitset_test (LA
[state
->lookaheadsp
+ i
], j
))
399 actrow
[j
] = -LArule
[state
->lookaheadsp
+ i
]->number
;
402 /* Now see which tokens are allowed for shifts in this state. For
403 them, record the shift as the thing to do. So shift is preferred
405 for (i
= 0; i
< shiftp
->nshifts
; i
++)
407 token_number_t symbol
;
408 int shift_state
= shiftp
->shifts
[i
];
412 symbol
= states
[shift_state
]->accessing_symbol
;
417 actrow
[symbol
] = shift_state
;
419 /* Do not use any default reduction if there is a shift for
421 if (symbol
== errtoken
->number
)
425 /* See which tokens are an explicit error in this state (due to
426 %nonassoc). For them, record SHRT_MIN as the action. */
427 for (i
= 0; i
< errp
->nerrs
; i
++)
429 int symbol
= errp
->errs
[i
];
430 actrow
[symbol
] = SHRT_MIN
;
433 /* Now find the most common reduction and make it the default action
436 if (redp
->nreds
>= 1 && !nodefault
)
438 if (state
->consistent
)
439 default_rule
= redp
->rules
[0];
443 for (i
= 0; i
< state
->nlookaheads
; i
++)
446 int rule
= -LArule
[state
->lookaheadsp
+ i
]->number
;
449 for (j
= 0; j
< ntokens
; j
++)
450 if (actrow
[j
] == rule
)
460 /* actions which match the default are replaced with zero,
461 which means "use the default" */
466 for (j
= 0; j
< ntokens
; j
++)
467 if (actrow
[j
] == default_rule
)
470 default_rule
= -default_rule
;
475 /* If have no default rule, the default is an error.
476 So replace any action which says "error" with "use default". */
478 if (default_rule
== 0)
479 for (i
= 0; i
< ntokens
; i
++)
480 if (actrow
[i
] == SHRT_MIN
)
497 for (i
= 0; i
< ntokens
; i
++)
504 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
505 tos
[state
] = sp2
= XCALLOC (short, count
);
507 for (i
= 0; i
< ntokens
; i
++)
514 tally
[state
] = count
;
515 width
[state
] = sp1
[-1] - sp
[0] + 1;
519 /*------------------------------------------------------------------.
520 | Figure out the actions for the specified state, indexed by |
521 | lookahead token type. |
523 | The YYDEFACT table is output now. The detailed info is saved for |
524 | putting into YYTABLE later. |
525 `------------------------------------------------------------------*/
531 short *yydefact
= XCALLOC (short, nstates
);
533 actrow
= XCALLOC (short, ntokens
);
534 for (i
= 0; i
< nstates
; ++i
)
536 yydefact
[i
] = action_row (states
[i
]);
540 output_short_table (&format_obstack
, yydefact
,
541 yydefact
[0], 1, nstates
);
542 muscle_insert ("defact", obstack_finish (&format_obstack
));
549 /*-----------------------------.
550 | Output the actions to OOUT. |
551 `-----------------------------*/
554 actions_output (FILE *out
)
557 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
558 if (rules
[rule
].action
)
560 fprintf (out
, " case %d:\n", rule
);
563 fprintf (out
, muscle_find ("linef"),
564 rules
[rule
].action_line
,
565 quotearg_style (c_quoting_style
,
566 muscle_find ("filename")));
567 /* As a Bison extension, add the ending semicolon. Since some
568 Yacc don't do that, help people using bison as a Yacc
569 finding their missing semicolons. */
570 fprintf (out
, "{ %s%s }\n break;\n\n",
572 yacc_flag
? ";" : "");
577 /*---------------------------------------.
578 | Output the tokens definition to OOUT. |
579 `---------------------------------------*/
582 token_definitions_output (FILE *out
)
586 for (i
= 0; i
< ntokens
; ++i
)
588 symbol_t
*symbol
= symbols
[i
];
589 int number
= symbol
->user_token_number
;
591 /* At this stage, if there are literal aliases, they are part of
592 SYMBOLS, so we should not find symbols which are the aliases
594 assert (number
!= USER_NUMBER_ALIAS
);
596 /* Skip error token. */
597 if (symbol
== errtoken
)
600 /* If this string has an alias, then it is necessarily the alias
601 which is to be output. */
603 symbol
= symbol
->alias
;
605 /* Don't output literal chars or strings (when defined only as a
606 string). Note that must be done after the alias resolution:
607 think about `%token 'f' "f"'. */
608 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
611 /* Don't #define nonliteral tokens whose names contain periods
612 or '$' (as does the default value of the EOF token). */
613 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
616 fprintf (out
, "%s[[[%s]], [%d]]",
617 first
? "" : ",\n", symbol
->tag
, number
);
625 save_column (int symbol
, int default_state
)
632 int symno
= symbol
- ntokens
+ nstates
;
634 short begin
= goto_map
[symbol
];
635 short end
= goto_map
[symbol
+ 1];
638 for (i
= begin
; i
< end
; i
++)
639 if (to_state
[i
] != default_state
)
645 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
646 tos
[symno
] = sp2
= XCALLOC (short, count
);
648 for (i
= begin
; i
< end
; i
++)
649 if (to_state
[i
] != default_state
)
651 *sp1
++ = from_state
[i
];
652 *sp2
++ = to_state
[i
];
655 tally
[symno
] = count
;
656 width
[symno
] = sp1
[-1] - sp
[0] + 1;
660 default_goto (int symbol
)
663 size_t m
= goto_map
[symbol
];
664 size_t n
= goto_map
[symbol
+ 1];
665 int default_state
= -1;
671 for (i
= 0; i
< nstates
; i
++)
674 for (i
= m
; i
< n
; i
++)
675 state_count
[to_state
[i
]]++;
677 for (i
= 0; i
< nstates
; i
++)
678 if (state_count
[i
] > max
)
680 max
= state_count
[i
];
684 return default_state
;
688 /*-------------------------------------------------------------------.
689 | Figure out what to do after reducing with each rule, depending on |
690 | the saved state from before the beginning of parsing the data that |
691 | matched this rule. |
693 | The YYDEFGOTO table is output now. The detailed info is saved for |
694 | putting into YYTABLE later. |
695 `-------------------------------------------------------------------*/
701 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
703 state_count
= XCALLOC (short, nstates
);
704 for (i
= ntokens
; i
< nsyms
; ++i
)
706 int default_state
= default_goto (i
);
707 save_column (i
, default_state
);
708 yydefgoto
[i
- ntokens
] = default_state
;
711 output_short_table (&format_obstack
, yydefgoto
,
712 yydefgoto
[0], 1, nsyms
- ntokens
);
713 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
720 /* The next few functions decide how to pack the actions and gotos
721 information into yytable. */
728 order
= XCALLOC (short, nvectors
);
731 for (i
= 0; i
< nvectors
; i
++)
737 int j
= nentries
- 1;
739 while (j
>= 0 && (width
[order
[j
]] < w
))
742 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
745 for (k
= nentries
- 1; k
> j
; k
--)
746 order
[k
+ 1] = order
[k
];
755 matching_state (int vector
)
757 int i
= order
[vector
];
762 if (i
>= (int) nstates
)
768 for (prev
= vector
- 1; prev
>= 0; prev
--)
774 if (width
[j
] != w
|| tally
[j
] != t
)
777 for (k
= 0; match
&& k
< t
; k
++)
778 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
790 pack_vector (int vector
)
792 int i
= order
[vector
];
796 short *from
= froms
[i
];
801 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
806 for (k
= 0; ok
&& k
< t
; k
++)
809 if (loc
> (int) table_size
)
816 for (k
= 0; ok
&& k
< vector
; k
++)
822 for (k
= 0; k
< t
; k
++)
826 check
[loc
] = from
[k
];
829 while (table
[lowzero
] != 0)
838 #define pack_vector_succeeded 0
839 assert (pack_vector_succeeded
);
851 base
= XCALLOC (short, nvectors
);
852 pos
= XCALLOC (short, nentries
);
853 table
= XCALLOC (short, table_size
);
854 check
= XCALLOC (short, table_size
);
859 for (i
= 0; i
< nvectors
; i
++)
862 for (i
= 0; i
< (int) table_size
; i
++)
865 for (i
= 0; i
< nentries
; i
++)
867 state
= matching_state (i
);
870 place
= pack_vector (i
);
875 base
[order
[i
]] = place
;
878 for (i
= 0; i
< nvectors
; i
++)
889 /* the following functions output yytable, yycheck
890 and the vectors whose elements index the portion starts */
896 output_short_table (&format_obstack
, base
,
897 base
[0], 1, nstates
);
898 muscle_insert ("pact", obstack_finish (&format_obstack
));
901 output_short_table (&format_obstack
, base
,
902 base
[nstates
], nstates
+ 1, nvectors
);
903 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
912 output_short_table (&format_obstack
, table
,
913 table
[0], 1, high
+ 1);
914 muscle_insert ("table", obstack_finish (&format_obstack
));
922 output_short_table (&format_obstack
, check
,
923 check
[0], 1, high
+ 1);
924 muscle_insert ("check", obstack_finish (&format_obstack
));
928 /*-----------------------------------------------------------------.
929 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
931 `-----------------------------------------------------------------*/
934 output_actions (void)
937 nvectors
= nstates
+ nvars
;
939 froms
= XCALLOC (short *, nvectors
);
940 tos
= XCALLOC (short *, nvectors
);
941 tally
= XCALLOC (short, nvectors
);
942 width
= XCALLOC (short, nvectors
);
949 XFREE (goto_map
+ ntokens
);
961 for (i
= 0; i
< nstates
; ++i
)
963 free (states
[i
]->shifts
);
964 XFREE (states
[i
]->reductions
);
965 free (states
[i
]->errs
);
972 /*---------------------------.
973 | Call the skeleton parser. |
974 `---------------------------*/
977 output_skeleton (void)
979 /* Store the definition of all the muscles. */
980 const char *tempdir
= getenv ("TMPDIR");
981 char *tempfile
= NULL
;
986 tempdir
= DEFAULT_TMPDIR
;
987 tempfile
= xmalloc (strlen (tempdir
) + 11);
988 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
989 fd
= mkstemp (tempfile
);
991 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
993 out
= fdopen (fd
, "w");
995 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
997 /* There are no comments, especially not `#': we do want M4 expansion
998 after `#': think of CPP macros! */
999 fputs ("m4_changecom()\n", out
);
1000 fputs ("m4_init()\n", out
);
1002 fputs ("m4_define([b4_actions], \n[[", out
);
1003 actions_output (out
);
1004 fputs ("]])\n\n", out
);
1006 fputs ("m4_define([b4_tokens], \n[", out
);
1007 token_definitions_output (out
);
1008 fputs ("])\n\n", out
);
1010 muscles_m4_output (out
);
1012 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1013 fputs ("m4_divert_push(0)dnl\n", out
);
1016 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1018 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1019 const char *m4
= getenv ("M4");
1022 if (!bison_pkgdatadir
)
1023 bison_pkgdatadir
= PKGDATADIR
;
1026 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1027 m4
, bison_pkgdatadir
, tempfile
, skeleton
);
1028 skel_in
= readpipe (m4
,
1029 "-I", bison_pkgdatadir
,
1030 "m4sugar/m4sugar.m4",
1035 error (EXIT_FAILURE
, errno
, "cannot run m4");
1038 /* If `debugging', keep this file alive. */
1047 MUSCLE_INSERT_INT ("last", high
);
1048 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1049 MUSCLE_INSERT_INT ("pure", pure_parser
);
1050 MUSCLE_INSERT_INT ("nsym", nsyms
);
1051 MUSCLE_INSERT_INT ("debug", debug_flag
);
1052 MUSCLE_INSERT_INT ("final", final_state
);
1053 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1054 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1055 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1056 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1058 /* FIXME: This is wrong: the muscles should decide whether they hold
1059 a copy or not, but the situation is too obscure currently. */
1060 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1061 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1062 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1063 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1065 MUSCLE_INSERT_INT ("nnts", nvars
);
1066 MUSCLE_INSERT_INT ("nrules", nrules
);
1067 MUSCLE_INSERT_INT ("nstates", nstates
);
1068 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1070 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1071 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1073 /* Copy definitions in directive. */
1074 obstack_1grow (&pre_prologue_obstack
, 0);
1075 obstack_1grow (&post_prologue_obstack
, 0);
1076 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1077 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1079 /* Find the right skeleton file. */
1081 skeleton
= "bison.simple";
1083 /* Parse the skeleton file and output the needed parsers. */
1084 muscle_insert ("skeleton", skeleton
);
1088 /*----------------------------------------------------------.
1089 | Output the parsing tables and the parser code to ftable. |
1090 `----------------------------------------------------------*/
1095 obstack_init (&format_obstack
);
1104 /* Process the selected skeleton file. */
1107 obstack_free (&muscle_obstack
, NULL
);
1108 obstack_free (&format_obstack
, NULL
);
1109 obstack_free (&action_obstack
, NULL
);
1110 obstack_free (&pre_prologue_obstack
, NULL
);
1111 obstack_free (&post_prologue_obstack
, NULL
);