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 static struct obstack format_obstack
;
137 int error_verbose
= 0;
140 /*----------------------------------------------------------------.
141 | If TABLE (and CHECK) appear to be small to be addressed at |
142 | DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
143 | the desired size is at least DESIRED + 1. |
144 `----------------------------------------------------------------*/
147 table_grow (size_t desired
)
149 size_t old_size
= table_size
;
151 while (table_size
<= desired
)
155 fprintf (stderr
, "growing table and check from: %d to %d\n",
156 old_size
, table_size
);
158 table
= XREALLOC (table
, short, table_size
);
159 check
= XREALLOC (check
, short, table_size
);
161 for (/* Nothing. */; old_size
< table_size
; ++old_size
)
164 check
[old_size
] = -1;
169 /*-------------------------------------------------------------------.
170 | Create a function NAME which associates to the muscle NAME the |
171 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
172 | TYPE), and to the muscle NAME_max, the max value of the |
174 `-------------------------------------------------------------------*/
177 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
180 Name (const char *name, \
190 obstack_fgrow1 (&format_obstack, "%6d", first); \
191 for (i = begin; i < end; ++i) \
193 obstack_1grow (&format_obstack, ','); \
196 obstack_sgrow (&format_obstack, "\n "); \
201 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
202 if (table_data[i] > max) \
203 max = table_data[i]; \
205 obstack_1grow (&format_obstack, 0); \
206 muscle_insert (name, obstack_finish (&format_obstack)); \
208 /* Build `NAME_max' in the obstack. */ \
209 obstack_fgrow1 (&format_obstack, "%s_max", name); \
210 obstack_1grow (&format_obstack, 0); \
211 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
215 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int)
216 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table
, short)
217 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table
, symbol_number_t
)
218 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number_t
)
221 /*-----------------------------------------------------------------.
222 | Prepare the muscles related to the tokens: translate, tname, and |
224 `-----------------------------------------------------------------*/
227 prepare_tokens (void)
229 muscle_insert_symbol_number_table ("translate",
231 0, 1, max_user_token_number
+ 1);
236 for (i
= 0; i
< nsyms
; i
++)
238 /* Be sure not to use twice the same QUOTEARG slot:
239 SYMBOL_TAG_GET uses slot 0. */
241 quotearg_n_style (1, c_quoting_style
,
242 symbol_tag_get (symbols
[i
]));
243 /* Width of the next token, including the two quotes, the coma
245 int strsize
= strlen (cp
) + 2;
247 if (j
+ strsize
> 75)
249 obstack_sgrow (&format_obstack
, "\n ");
253 obstack_sgrow (&format_obstack
, cp
);
254 obstack_sgrow (&format_obstack
, ", ");
257 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
259 obstack_sgrow (&format_obstack
, "0");
261 /* Finish table and store. */
262 obstack_1grow (&format_obstack
, 0);
263 muscle_insert ("tname", obstack_finish (&format_obstack
));
266 /* Output YYTOKNUM. */
269 short *values
= XCALLOC (short, ntokens
+ 1);
270 for (i
= 0; i
< ntokens
+ 1; ++i
)
271 values
[i
] = symbols
[i
]->user_token_number
;
272 muscle_insert_short_table ("toknum", values
,
279 /*-------------------------------------------------------------.
280 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
282 `-------------------------------------------------------------*/
289 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
290 unsigned int *prhs
= XMALLOC (unsigned int, nrules
+ 1);
291 unsigned int *rline
= XMALLOC (unsigned int, nrules
+ 1);
292 symbol_number_t
*r1
= XMALLOC (symbol_number_t
, nrules
+ 1);
293 unsigned int *r2
= XMALLOC (unsigned int, nrules
+ 1);
295 for (r
= 1; r
< nrules
+ 1; ++r
)
298 /* Index of rule R in RHS. */
300 /* RHS of the rule R. */
301 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
303 /* LHS of the rule R. */
304 r1
[r
] = rules
[r
].lhs
->number
;
305 /* Length of rule R's RHS. */
307 /* Separator in RHS. */
309 /* Line where rule was defined. */
310 rline
[r
] = rules
[r
].location
.first_line
;
312 assert (i
== nritems
);
314 muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
);
315 muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 1, nrules
+ 1);
316 muscle_insert_unsigned_int_table ("rline", rline
, 0, 1, nrules
+ 1);
317 muscle_insert_symbol_number_table ("r1", r1
, 0, 1, nrules
+ 1);
318 muscle_insert_unsigned_int_table ("r2", r2
, 0, 1, nrules
+ 1);
327 /*--------------------------------------------.
328 | Prepare the muscles related to the states. |
329 `--------------------------------------------*/
332 prepare_states (void)
335 symbol_number_t
*values
=
336 (symbol_number_t
*) alloca (sizeof (symbol_number_t
) * nstates
);
337 for (i
= 0; i
< nstates
; ++i
)
338 values
[i
] = states
[i
]->accessing_symbol
;
339 muscle_insert_symbol_number_table ("stos", values
,
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 (state
->lookaheads
[i
], j
))
384 actrow
[j
] = -state
->lookaheads_rule
[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
++)
392 symbol_number_t symbol
;
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
= -state
->lookaheads_rule
[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 muscle_insert_short_table ("defact", yydefact
,
526 yydefact
[0], 1, nstates
);
532 /*-----------------------------.
533 | Output the actions to OOUT. |
534 `-----------------------------*/
537 actions_output (FILE *out
)
541 fputs ("m4_define([b4_actions], \n[[", 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_location
.first_line
,
550 quotearg_style (c_quoting_style
,
551 muscle_find ("filename")));
552 fprintf (out
, " %s\n break;\n\n",
555 fputs ("]])\n\n", out
);
559 /*---------------------------------------.
560 | Output the tokens definition to OOUT. |
561 `---------------------------------------*/
564 token_definitions_output (FILE *out
)
569 fputs ("m4_define([b4_tokens], \n[", out
);
570 for (i
= 0; i
< ntokens
; ++i
)
572 symbol_t
*symbol
= symbols
[i
];
573 int number
= symbol
->user_token_number
;
575 /* At this stage, if there are literal aliases, they are part of
576 SYMBOLS, so we should not find symbols which are the aliases
578 assert (number
!= USER_NUMBER_ALIAS
);
580 /* Skip error token. */
581 if (symbol
== errtoken
)
584 /* If this string has an alias, then it is necessarily the alias
585 which is to be output. */
587 symbol
= symbol
->alias
;
589 /* Don't output literal chars or strings (when defined only as a
590 string). Note that must be done after the alias resolution:
591 think about `%token 'f' "f"'. */
592 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
595 /* Don't #define nonliteral tokens whose names contain periods
596 or '$' (as does the default value of the EOF token). */
597 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
600 fprintf (out
, "%s[[[%s]], [%d]]",
601 first
? "" : ",\n", symbol
->tag
, number
);
605 fputs ("])\n\n", out
);
609 /*----------------------------------------.
610 | Output the symbol destructors to OOUT. |
611 `----------------------------------------*/
614 symbol_destructors_output (FILE *out
)
619 fputs ("m4_define([b4_symbol_destructors], \n[", out
);
620 for (i
= 0; i
< nsyms
; ++i
)
621 if (symbols
[i
]->destructor
)
623 symbol_t
*symbol
= symbols
[i
];
626 Symbol-name, Symbol-number,
627 destructor, typename. */
628 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
630 infile
, symbol
->destructor_location
.first_line
,
631 symbol_tag_get (symbol
),
638 fputs ("])\n\n", out
);
642 /*-------------------------------------.
643 | Output the symbol printers to OOUT. |
644 `-------------------------------------*/
647 symbol_printers_output (FILE *out
)
652 fputs ("m4_define([b4_symbol_printers], \n[", out
);
653 for (i
= 0; i
< nsyms
; ++i
)
654 if (symbols
[i
]->destructor
)
656 symbol_t
*symbol
= symbols
[i
];
659 Symbol-name, Symbol-number,
660 destructor, typename. */
661 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
663 infile
, symbol
->printer_location
.first_line
,
664 symbol_tag_get (symbol
),
671 fputs ("])\n\n", out
);
676 save_column (int symbol
, int default_state
)
683 int symno
= symbol
- ntokens
+ nstates
;
685 short begin
= goto_map
[symbol
];
686 short end
= goto_map
[symbol
+ 1];
689 for (i
= begin
; i
< end
; i
++)
690 if (to_state
[i
] != default_state
)
696 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
697 tos
[symno
] = sp2
= XCALLOC (short, count
);
699 for (i
= begin
; i
< end
; i
++)
700 if (to_state
[i
] != default_state
)
702 *sp1
++ = from_state
[i
];
703 *sp2
++ = to_state
[i
];
706 tally
[symno
] = count
;
707 width
[symno
] = sp1
[-1] - sp
[0] + 1;
711 default_goto (int symbol
)
714 size_t m
= goto_map
[symbol
];
715 size_t n
= goto_map
[symbol
+ 1];
716 int default_state
= -1;
722 for (i
= 0; i
< nstates
; i
++)
725 for (i
= m
; i
< n
; i
++)
726 state_count
[to_state
[i
]]++;
728 for (i
= 0; i
< nstates
; i
++)
729 if (state_count
[i
] > max
)
731 max
= state_count
[i
];
735 return default_state
;
739 /*-------------------------------------------------------------------.
740 | Figure out what to do after reducing with each rule, depending on |
741 | the saved state from before the beginning of parsing the data that |
742 | matched this rule. |
744 | The YYDEFGOTO table is output now. The detailed info is saved for |
745 | putting into YYTABLE later. |
746 `-------------------------------------------------------------------*/
752 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
754 state_count
= XCALLOC (short, nstates
);
755 for (i
= ntokens
; i
< nsyms
; ++i
)
757 int default_state
= default_goto (i
);
758 save_column (i
, default_state
);
759 yydefgoto
[i
- ntokens
] = default_state
;
762 muscle_insert_short_table ("defgoto", yydefgoto
,
763 yydefgoto
[0], 1, nsyms
- ntokens
);
769 /* The next few functions decide how to pack the actions and gotos
770 information into yytable. */
777 order
= XCALLOC (short, nvectors
);
780 for (i
= 0; i
< nvectors
; i
++)
786 int j
= nentries
- 1;
788 while (j
>= 0 && (width
[order
[j
]] < w
))
791 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
794 for (k
= nentries
- 1; k
> j
; k
--)
795 order
[k
+ 1] = order
[k
];
804 matching_state (int vector
)
806 int i
= order
[vector
];
811 if (i
>= (int) nstates
)
817 for (prev
= vector
- 1; prev
>= 0; prev
--)
823 if (width
[j
] != w
|| tally
[j
] != t
)
826 for (k
= 0; match
&& k
< t
; k
++)
827 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
839 pack_vector (int vector
)
841 int i
= order
[vector
];
845 short *from
= froms
[i
];
850 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
855 for (k
= 0; ok
&& k
< t
; k
++)
858 if (loc
> (int) table_size
)
865 for (k
= 0; ok
&& k
< vector
; k
++)
871 for (k
= 0; k
< t
; k
++)
875 check
[loc
] = from
[k
];
878 while (table
[lowzero
] != 0)
887 #define pack_vector_succeeded 0
888 assert (pack_vector_succeeded
);
900 base
= XCALLOC (short, nvectors
);
901 pos
= XCALLOC (short, nentries
);
902 table
= XCALLOC (short, table_size
);
903 check
= XCALLOC (short, table_size
);
908 for (i
= 0; i
< nvectors
; i
++)
911 for (i
= 0; i
< (int) table_size
; i
++)
914 for (i
= 0; i
< nentries
; i
++)
916 state
= matching_state (i
);
919 place
= pack_vector (i
);
924 base
[order
[i
]] = place
;
927 for (i
= 0; i
< nvectors
; i
++)
938 /* the following functions output yytable, yycheck
939 and the vectors whose elements index the portion starts */
945 muscle_insert_short_table ("pact", base
,
946 base
[0], 1, nstates
);
949 muscle_insert_short_table ("pgoto", base
,
950 base
[nstates
], nstates
+ 1, nvectors
);
958 muscle_insert_short_table ("table", table
,
959 table
[0], 1, high
+ 1);
967 muscle_insert_short_table ("check", check
,
968 check
[0], 1, high
+ 1);
972 /*-----------------------------------------------------------------.
973 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
975 `-----------------------------------------------------------------*/
978 output_actions (void)
981 nvectors
= nstates
+ nvars
;
983 froms
= XCALLOC (short *, nvectors
);
984 tos
= XCALLOC (short *, nvectors
);
985 tally
= XCALLOC (short, nvectors
);
986 width
= XCALLOC (short, nvectors
);
993 XFREE (goto_map
+ ntokens
);
1005 for (i
= 0; i
< nstates
; ++i
)
1007 free (states
[i
]->shifts
);
1008 XFREE (states
[i
]->reductions
);
1009 free (states
[i
]->errs
);
1016 /*----------------------.
1017 | Run our backend, M4. |
1018 `----------------------*/
1021 m4_invoke (const char *definitions
)
1023 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1024 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1025 const char *m4
= getenv ("M4");
1027 char *full_skeleton
;
1031 if (!bison_pkgdatadir
)
1032 bison_pkgdatadir
= PKGDATADIR
;
1033 pkg_data_len
= strlen (bison_pkgdatadir
);
1034 full_skeleton
= XMALLOC (char, pkg_data_len
+ strlen (skeleton
) + 2);
1035 if (bison_pkgdatadir
[pkg_data_len
-1] == '/')
1036 sprintf (full_skeleton
, "%s%s", bison_pkgdatadir
, skeleton
);
1038 sprintf (full_skeleton
, "%s/%s", bison_pkgdatadir
, skeleton
);
1041 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1042 m4
, bison_pkgdatadir
, definitions
, full_skeleton
);
1043 skel_in
= readpipe (m4
,
1044 "-I", bison_pkgdatadir
,
1045 "m4sugar/m4sugar.m4",
1049 XFREE (full_skeleton
);
1051 error (EXIT_FAILURE
, errno
, "cannot run m4");
1056 /*---------------------------.
1057 | Call the skeleton parser. |
1058 `---------------------------*/
1061 output_skeleton (void)
1063 /* Store the definition of all the muscles. */
1064 const char *tempdir
= getenv ("TMPDIR");
1065 char *tempfile
= NULL
;
1069 if (tempdir
== NULL
)
1070 tempdir
= DEFAULT_TMPDIR
;
1071 tempfile
= xmalloc (strlen (tempdir
) + 11);
1072 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
1073 fd
= mkstemp (tempfile
);
1075 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1077 out
= fdopen (fd
, "w");
1079 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1081 /* There are no comments, especially not `#': we do want M4 expansion
1082 after `#': think of CPP macros! */
1083 fputs ("m4_changecom()\n", out
);
1084 fputs ("m4_init()\n", out
);
1086 actions_output (out
);
1087 token_definitions_output (out
);
1088 symbol_destructors_output (out
);
1089 symbol_printers_output (out
);
1091 muscles_m4_output (out
);
1093 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1094 fputs ("m4_divert_push(0)dnl\n", out
);
1097 m4_invoke (tempfile
);
1099 /* If `debugging', keep this file alive. */
1109 MUSCLE_INSERT_INT ("last", high
);
1110 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1111 MUSCLE_INSERT_INT ("pure", pure_parser
);
1112 MUSCLE_INSERT_INT ("nsym", nsyms
);
1113 MUSCLE_INSERT_INT ("debug", debug_flag
);
1114 MUSCLE_INSERT_INT ("final", final_state
);
1115 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1116 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1117 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1118 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1120 /* FIXME: This is wrong: the muscles should decide whether they hold
1121 a copy or not, but the situation is too obscure currently. */
1122 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1123 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1124 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1125 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1127 MUSCLE_INSERT_INT ("nnts", nvars
);
1128 MUSCLE_INSERT_INT ("nrules", nrules
);
1129 MUSCLE_INSERT_INT ("nstates", nstates
);
1130 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1132 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1133 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1135 /* Copy definitions in directive. */
1136 obstack_1grow (&pre_prologue_obstack
, 0);
1137 obstack_1grow (&post_prologue_obstack
, 0);
1138 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1139 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1141 /* Find the right skeleton file. */
1143 skeleton
= "bison.simple";
1145 /* Parse the skeleton file and output the needed parsers. */
1146 muscle_insert ("skeleton", skeleton
);
1150 /*----------------------------------------------------------.
1151 | Output the parsing tables and the parser code to ftable. |
1152 `----------------------------------------------------------*/
1157 obstack_init (&format_obstack
);
1166 /* Process the selected skeleton file. */
1169 obstack_free (&format_obstack
, NULL
);
1170 obstack_free (&pre_prologue_obstack
, NULL
);
1171 obstack_free (&post_prologue_obstack
, NULL
);