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 | Create a function NAME which Format the FIRST and then |
138 | TABLE_DATA[BEGIN..END[ (of TYPE) into OOUT, and return the number |
139 | of bits needed for its longuest value. |
140 `------------------------------------------------------------------*/
143 #define GENERATE_OUTPUT_TABLE(Name, Type) \
145 static inline long int \
146 Name (struct obstack *oout, \
152 long int max = first; \
156 obstack_fgrow1 (oout, "%6d", first); \
157 for (i = begin; i < end; ++i) \
159 obstack_1grow (oout, ','); \
162 obstack_sgrow (oout, "\n "); \
167 obstack_fgrow1 (oout, "%6d", table_data[i]); \
168 if (table_data[i] > max) \
169 max = table_data[i]; \
171 obstack_1grow (oout, 0); \
176 GENERATE_OUTPUT_TABLE(output_int_table
, int)
177 GENERATE_OUTPUT_TABLE(output_short_table
, short)
178 GENERATE_OUTPUT_TABLE(output_token_number_table
, token_number_t
)
179 GENERATE_OUTPUT_TABLE(output_item_number_table
, item_number_t
)
182 /*-----------------------------------------------------------------.
183 | Prepare the muscles related to the tokens: translate, tname, and |
185 `-----------------------------------------------------------------*/
188 prepare_tokens (void)
190 long int max
= output_token_number_table (&format_obstack
,
192 0, 1, max_user_token_number
+ 1);
193 muscle_insert ("translate", obstack_finish (&format_obstack
));
194 MUSCLE_INSERT_LONG_INT ("token_number_max", max
);
195 XFREE (token_translations
);
200 for (i
= 0; i
< nsyms
; i
++)
202 /* Be sure not to use twice the same quotearg slot. */
204 quotearg_n_style (1, c_quoting_style
,
205 quotearg_style (escape_quoting_style
,
207 /* Width of the next token, including the two quotes, the coma
209 int strsize
= strlen (cp
) + 2;
211 if (j
+ strsize
> 75)
213 obstack_sgrow (&format_obstack
, "\n ");
217 obstack_sgrow (&format_obstack
, cp
);
218 obstack_sgrow (&format_obstack
, ", ");
221 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
223 obstack_sgrow (&format_obstack
, "0");
225 /* Finish table and store. */
226 obstack_1grow (&format_obstack
, 0);
227 muscle_insert ("tname", obstack_finish (&format_obstack
));
230 /* Output YYTOKNUM. */
233 short *values
= XCALLOC (short, ntokens
+ 1);
234 for (i
= 0; i
< ntokens
+ 1; ++i
)
235 values
[i
] = symbols
[i
]->user_token_number
;
236 output_short_table (&format_obstack
, values
,
238 muscle_insert ("toknum", obstack_finish (&format_obstack
));
244 /*-------------------------------------------------------------.
245 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
247 `-------------------------------------------------------------*/
256 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
257 short *prhs
= XMALLOC (short, nrules
+ 1);
258 token_number_t
*r1
= XMALLOC (token_number_t
, nrules
+ 1);
259 short *r2
= XMALLOC (short, nrules
+ 1);
260 short *rline
= XMALLOC (short, nrules
+ 1);
262 for (r
= 1; r
< nrules
+ 1; ++r
)
264 /* Index of rule R in RHS. */
266 /* RHS of the rule R. */
267 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
269 /* LHS of the rule R. */
270 r1
[r
] = rules
[r
].lhs
->number
;
271 /* Length of rule R's RHS. */
273 /* Separator in RHS. */
275 /* Line where rule was defined. */
276 rline
[r
] = rules
[r
].line
;
278 assert (i
== nritems
);
280 max
= output_int_table (&format_obstack
, rhs
, ritem
[0], 1, nritems
);
281 muscle_insert ("rhs", obstack_finish (&format_obstack
));
282 MUSCLE_INSERT_LONG_INT ("rhs_number_max", max
);
284 output_short_table (&format_obstack
, prhs
, 0, 1, nrules
+ 1);
285 muscle_insert ("prhs", obstack_finish (&format_obstack
));
287 output_short_table (&format_obstack
, rline
, 0, 1, nrules
+ 1);
288 muscle_insert ("rline", obstack_finish (&format_obstack
));
290 output_token_number_table (&format_obstack
, r1
, 0, 1, nrules
+ 1);
291 muscle_insert ("r1", obstack_finish (&format_obstack
));
293 output_short_table (&format_obstack
, r2
, 0, 1, nrules
+ 1);
294 muscle_insert ("r2", obstack_finish (&format_obstack
));
301 /*--------------------------------------------.
302 | Prepare the muscles related to the states. |
303 `--------------------------------------------*/
306 prepare_states (void)
309 token_number_t
*values
=
310 (token_number_t
*) alloca (sizeof (token_number_t
) * nstates
);
311 for (i
= 0; i
< nstates
; ++i
)
312 values
[i
] = states
[i
]->accessing_symbol
;
313 output_token_number_table (&format_obstack
, values
,
315 muscle_insert ("stos", obstack_finish (&format_obstack
));
319 /*------------------------------------------------------------------.
320 | Decide what to do for each type of token if seen as the lookahead |
321 | token in specified state. The value returned is used as the |
322 | default action (yydefact) for the state. In addition, actrow is |
323 | filled with what to do for each kind of token, index by symbol |
324 | number, with zero meaning do the default action. The value |
325 | SHRT_MIN, a very negative number, means this situation is an |
326 | error. The parser recognizes this value specially. |
328 | This is where conflicts are resolved. The loop over lookahead |
329 | rules considered lower-numbered rules last, and the last rule |
330 | considered that likes a token gets to handle it. |
331 `------------------------------------------------------------------*/
334 action_row (state_t
*state
)
337 int default_rule
= 0;
338 reductions
*redp
= state
->reductions
;
339 shifts
*shiftp
= state
->shifts
;
340 errs
*errp
= state
->errs
;
341 /* set nonzero to inhibit having any default reduction */
344 for (i
= 0; i
< ntokens
; i
++)
347 if (redp
->nreds
>= 1)
350 /* loop over all the rules available here which require
352 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
353 /* and find each token which the rule finds acceptable
355 for (j
= 0; j
< ntokens
; j
++)
356 /* and record this rule as the rule to use if that
358 if (bitset_test (LA
[state
->lookaheadsp
+ i
], j
))
359 actrow
[j
] = -LArule
[state
->lookaheadsp
+ i
]->number
;
362 /* Now see which tokens are allowed for shifts in this state. For
363 them, record the shift as the thing to do. So shift is preferred
365 for (i
= 0; i
< shiftp
->nshifts
; i
++)
367 token_number_t symbol
;
368 int shift_state
= shiftp
->shifts
[i
];
372 symbol
= states
[shift_state
]->accessing_symbol
;
377 actrow
[symbol
] = shift_state
;
379 /* Do not use any default reduction if there is a shift for
381 if (symbol
== errtoken
->number
)
385 /* See which tokens are an explicit error in this state (due to
386 %nonassoc). For them, record SHRT_MIN as the action. */
387 for (i
= 0; i
< errp
->nerrs
; i
++)
389 int symbol
= errp
->errs
[i
];
390 actrow
[symbol
] = SHRT_MIN
;
393 /* Now find the most common reduction and make it the default action
396 if (redp
->nreds
>= 1 && !nodefault
)
398 if (state
->consistent
)
399 default_rule
= redp
->rules
[0];
403 for (i
= 0; i
< state
->nlookaheads
; i
++)
406 int rule
= -LArule
[state
->lookaheadsp
+ i
]->number
;
409 for (j
= 0; j
< ntokens
; j
++)
410 if (actrow
[j
] == rule
)
420 /* actions which match the default are replaced with zero,
421 which means "use the default" */
426 for (j
= 0; j
< ntokens
; j
++)
427 if (actrow
[j
] == default_rule
)
430 default_rule
= -default_rule
;
435 /* If have no default rule, the default is an error.
436 So replace any action which says "error" with "use default". */
438 if (default_rule
== 0)
439 for (i
= 0; i
< ntokens
; i
++)
440 if (actrow
[i
] == SHRT_MIN
)
457 for (i
= 0; i
< ntokens
; i
++)
464 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
465 tos
[state
] = sp2
= XCALLOC (short, count
);
467 for (i
= 0; i
< ntokens
; i
++)
474 tally
[state
] = count
;
475 width
[state
] = sp1
[-1] - sp
[0] + 1;
479 /*------------------------------------------------------------------.
480 | Figure out the actions for the specified state, indexed by |
481 | lookahead token type. |
483 | The YYDEFACT table is output now. The detailed info is saved for |
484 | putting into YYTABLE later. |
485 `------------------------------------------------------------------*/
491 short *yydefact
= XCALLOC (short, nstates
);
493 actrow
= XCALLOC (short, ntokens
);
494 for (i
= 0; i
< nstates
; ++i
)
496 yydefact
[i
] = action_row (states
[i
]);
500 output_short_table (&format_obstack
, yydefact
,
501 yydefact
[0], 1, nstates
);
502 muscle_insert ("defact", obstack_finish (&format_obstack
));
509 /*-----------------------------.
510 | Output the actions to OOUT. |
511 `-----------------------------*/
514 actions_output (FILE *out
)
517 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
518 if (rules
[rule
].action
)
520 fprintf (out
, " case %d:\n", rule
);
523 fprintf (out
, muscle_find ("linef"),
524 rules
[rule
].action_line
,
525 quotearg_style (c_quoting_style
,
526 muscle_find ("filename")));
527 /* As a Bison extension, add the ending semicolon. Since some
528 Yacc don't do that, help people using bison as a Yacc
529 finding their missing semicolons. */
530 fprintf (out
, "{ %s%s }\n break;\n\n",
532 yacc_flag
? ";" : "");
537 /*----------------------------.
538 | Output the guards to OOUT. |
539 `----------------------------*/
542 guards_output (FILE *out
)
545 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
546 if (rules
[rule
].guard
)
548 fprintf (out
, " case %d:\n", rule
);
551 fprintf (out
, muscle_find ("linef"),
552 rules
[rule
].guard_line
,
553 quotearg_style (c_quoting_style
,
554 muscle_find ("filename")));
555 fprintf (out
, "{ %s; }\n break;\n\n",
561 /*---------------------------------------.
562 | Output the tokens definition to OOUT. |
563 `---------------------------------------*/
566 token_definitions_output (FILE *out
)
570 for (i
= 0; i
< ntokens
; ++i
)
572 symbol_t
*symbol
= symbols
[i
];
573 int number
= symbol
->user_token_number
;
575 if (number
== SALIAS
)
577 /* Skip error token. */
578 if (symbol
== errtoken
)
580 if (symbol
->tag
[0] == '\'')
581 continue; /* skip literal character */
582 if (symbol
->tag
[0] == '\"')
584 /* use literal string only if given a symbol with an alias */
586 symbol
= symbol
->alias
;
591 /* Don't #define nonliteral tokens whose names contain periods
592 or '$' (as does the default value of the EOF token). */
593 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
596 fprintf (out
, "%s [[[%s]], [%d]]",
597 first
? "" : ",\n", symbol
->tag
, number
);
599 /* FIXME: This is probably wrong, and should be just as
601 fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->number
);
608 save_column (int symbol
, int default_state
)
615 int symno
= symbol
- ntokens
+ nstates
;
617 short begin
= goto_map
[symbol
];
618 short end
= goto_map
[symbol
+ 1];
621 for (i
= begin
; i
< end
; i
++)
622 if (to_state
[i
] != default_state
)
628 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
629 tos
[symno
] = sp2
= XCALLOC (short, count
);
631 for (i
= begin
; i
< end
; i
++)
632 if (to_state
[i
] != default_state
)
634 *sp1
++ = from_state
[i
];
635 *sp2
++ = to_state
[i
];
638 tally
[symno
] = count
;
639 width
[symno
] = sp1
[-1] - sp
[0] + 1;
643 default_goto (int symbol
)
646 size_t m
= goto_map
[symbol
];
647 size_t n
= goto_map
[symbol
+ 1];
648 int default_state
= -1;
654 for (i
= 0; i
< nstates
; i
++)
657 for (i
= m
; i
< n
; i
++)
658 state_count
[to_state
[i
]]++;
660 for (i
= 0; i
< nstates
; i
++)
661 if (state_count
[i
] > max
)
663 max
= state_count
[i
];
667 return default_state
;
671 /*-------------------------------------------------------------------.
672 | Figure out what to do after reducing with each rule, depending on |
673 | the saved state from before the beginning of parsing the data that |
674 | matched this rule. |
676 | The YYDEFGOTO table is output now. The detailed info is saved for |
677 | putting into YYTABLE later. |
678 `-------------------------------------------------------------------*/
684 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
686 state_count
= XCALLOC (short, nstates
);
687 for (i
= ntokens
; i
< nsyms
; ++i
)
689 int default_state
= default_goto (i
);
690 save_column (i
, default_state
);
691 yydefgoto
[i
- ntokens
] = default_state
;
694 output_short_table (&format_obstack
, yydefgoto
,
695 yydefgoto
[0], 1, nsyms
- ntokens
);
696 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
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
])
771 /* FIXME: For the time being, best approximation... */
772 #define MAXTABLE SHRT_MAX
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_short_table (&format_obstack
, base
,
882 base
[0], 1, nstates
);
883 muscle_insert ("pact", obstack_finish (&format_obstack
));
886 output_short_table (&format_obstack
, base
,
887 base
[nstates
], nstates
+ 1, nvectors
);
888 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
897 output_short_table (&format_obstack
, table
,
898 table
[0], 1, high
+ 1);
899 muscle_insert ("table", obstack_finish (&format_obstack
));
907 output_short_table (&format_obstack
, check
,
908 check
[0], 1, high
+ 1);
909 muscle_insert ("check", obstack_finish (&format_obstack
));
913 /*-----------------------------------------------------------------.
914 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
916 `-----------------------------------------------------------------*/
919 output_actions (void)
922 nvectors
= nstates
+ nvars
;
924 froms
= XCALLOC (short *, nvectors
);
925 tos
= XCALLOC (short *, nvectors
);
926 tally
= XCALLOC (short, nvectors
);
927 width
= XCALLOC (short, nvectors
);
934 XFREE (goto_map
+ ntokens
);
946 for (i
= 0; i
< nstates
; ++i
)
948 free (states
[i
]->shifts
);
949 XFREE (states
[i
]->reductions
);
950 free (states
[i
]->errs
);
957 /*---------------------------.
958 | Call the skeleton parser. |
959 `---------------------------*/
962 output_skeleton (void)
964 /* Store the definition of all the muscles. */
965 const char *tempdir
= getenv ("TMPDIR");
966 char *tempfile
= NULL
;
971 tempdir
= DEFAULT_TMPDIR
;
972 tempfile
= xmalloc (strlen (tempdir
) + 11);
973 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
974 fd
= mkstemp (tempfile
);
976 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
978 out
= fdopen (fd
, "w");
980 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
982 /* There are no comments, especially not `#': we do want M4 expansion
983 after `#': think of CPP macros! */
984 fputs ("m4_changecom()\n", out
);
985 fputs ("m4_init()\n", out
);
987 fputs ("m4_define([b4_actions], \n[[", out
);
988 actions_output (out
);
989 fputs ("]])\n\n", out
);
991 fputs ("m4_define([b4_guards], \n[[", out
);
993 fputs ("]])\n\n", out
);
995 fputs ("m4_define([b4_tokens], \n[", out
);
996 token_definitions_output (out
);
997 fputs ("])\n\n", out
);
999 muscles_m4_output (out
);
1001 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1002 fputs ("m4_divert_push(0)dnl\n", out
);
1005 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1007 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1008 const char *m4
= getenv ("M4");
1011 if (!bison_pkgdatadir
)
1012 bison_pkgdatadir
= PKGDATADIR
;
1015 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1016 m4
, bison_pkgdatadir
, tempfile
, skeleton
);
1017 skel_in
= readpipe (m4
,
1018 "-I", bison_pkgdatadir
,
1019 "m4sugar/m4sugar.m4",
1024 error (EXIT_FAILURE
, errno
, "cannot run m4");
1027 /* If `debugging', keep this file alive. */
1036 MUSCLE_INSERT_INT ("last", high
);
1037 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1038 MUSCLE_INSERT_INT ("pure", pure_parser
);
1039 MUSCLE_INSERT_INT ("nsym", nsyms
);
1040 MUSCLE_INSERT_INT ("debug", debug_flag
);
1041 MUSCLE_INSERT_INT ("final", final_state
);
1042 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1043 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1044 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1045 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1047 /* FIXME: This is wrong: the muscles should decide whether they hold
1048 a copy or not, but the situation is too obscure currently. */
1049 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1050 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1051 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1052 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1054 MUSCLE_INSERT_INT ("nnts", nvars
);
1055 MUSCLE_INSERT_INT ("nrules", nrules
);
1056 MUSCLE_INSERT_INT ("nstates", nstates
);
1057 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1059 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1060 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1062 /* Copy definitions in directive. */
1063 obstack_1grow (&attrs_obstack
, 0);
1064 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1066 /* Find the right skeleton file. */
1069 if (semantic_parser
)
1070 skeleton
= "bison.hairy";
1072 skeleton
= "bison.simple";
1075 /* Parse the skeleton file and output the needed parsers. */
1076 muscle_insert ("skeleton", skeleton
);
1080 /*----------------------------------------------------------.
1081 | Output the parsing tables and the parser code to ftable. |
1082 `----------------------------------------------------------*/
1087 obstack_init (&format_obstack
);
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
);