1 /* Output the generated parsing program for Bison.
3 Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software
6 This file is part of Bison, the GNU Compiler Compiler.
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include <configmake.h>
26 #include <get-errno.h>
28 #include <spawn-pipe.h>
30 #include <wait-process.h>
36 #include "muscle-tab.h"
39 #include "scan-code.h" /* max_left_semantic_context */
40 #include "scan-skel.h"
44 # define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
46 static struct obstack format_obstack
;
49 /*-------------------------------------------------------------------.
50 | Create a function NAME which associates to the muscle NAME the |
51 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
52 | TYPE), and to the muscle NAME_max, the max value of the |
54 `-------------------------------------------------------------------*/
57 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
60 Name (char const *name, \
73 obstack_printf (&format_obstack, "%6d", first); \
74 for (i = begin; i < end; ++i) \
76 obstack_1grow (&format_obstack, ','); \
79 obstack_sgrow (&format_obstack, "\n "); \
84 obstack_printf (&format_obstack, "%6d", table_data[i]); \
85 if (table_data[i] < min) \
86 min = table_data[i]; \
87 if (max < table_data[i]) \
88 max = table_data[i]; \
90 obstack_1grow (&format_obstack, 0); \
91 muscle_insert (name, obstack_finish (&format_obstack)); \
95 /* Build `NAME_min' and `NAME_max' in the obstack. */ \
96 obstack_printf (&format_obstack, "%s_min", name); \
97 obstack_1grow (&format_obstack, 0); \
98 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \
99 obstack_printf (&format_obstack, "%s_max", name); \
100 obstack_1grow (&format_obstack, 0); \
101 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax); \
104 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int)
105 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table
, int)
106 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table
, base_number
)
107 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table
, rule_number
)
108 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table
, symbol_number
)
109 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number
)
110 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table
, state_number
)
113 /*----------------------------------------------------------------.
114 | Print to OUT a representation of CP quoted and escaped for M4. |
115 `----------------------------------------------------------------*/
118 quoted_output (FILE *out
, char const *cp
)
125 case '$': fputs ("$][", out
); break;
126 case '@': fputs ("@@", out
); break;
127 case '[': fputs ("@{", out
); break;
128 case ']': fputs ("@}", out
); break;
129 default: fputc (*cp
, out
); break;
135 /*----------------------------------------------------------------.
136 | Print to OUT a representation of STRING quoted and escaped both |
138 `----------------------------------------------------------------*/
141 string_output (FILE *out
, char const *string
)
143 quoted_output (out
, quotearg_style (c_quoting_style
, string
));
147 /*------------------------------------------------------------------.
148 | Prepare the muscles related to the symbols: translate, tname, and |
150 `------------------------------------------------------------------*/
153 prepare_symbols (void)
155 MUSCLE_INSERT_INT ("tokens_number", ntokens
);
156 MUSCLE_INSERT_INT ("nterms_number", nvars
);
157 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
158 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
160 muscle_insert_symbol_number_table ("translate",
162 token_translations
[0],
163 1, max_user_token_number
+ 1);
165 /* tname -- token names. */
168 /* We assume that the table will be output starting at column 2. */
170 struct quoting_options
*qo
= clone_quoting_options (0);
171 set_quoting_style (qo
, c_quoting_style
);
172 set_quoting_flags (qo
, QA_SPLIT_TRIGRAPHS
);
173 for (i
= 0; i
< nsyms
; i
++)
175 char *cp
= quotearg_alloc (symbols
[i
]->tag
, -1, qo
);
176 /* Width of the next token, including the two quotes, the
177 comma and the space. */
178 int width
= strlen (cp
) + 2;
182 obstack_sgrow (&format_obstack
, "\n ");
187 obstack_1grow (&format_obstack
, ' ');
188 obstack_escape (&format_obstack
, cp
);
190 obstack_1grow (&format_obstack
, ',');
194 obstack_sgrow (&format_obstack
, " ]b4_null[");
196 /* Finish table and store. */
197 obstack_1grow (&format_obstack
, 0);
198 muscle_insert ("tname", obstack_finish (&format_obstack
));
201 /* Output YYTOKNUM. */
204 int *values
= xnmalloc (ntokens
, sizeof *values
);
205 for (i
= 0; i
< ntokens
; ++i
)
206 values
[i
] = symbols
[i
]->user_token_number
;
207 muscle_insert_int_table ("toknum", values
,
208 values
[0], 1, ntokens
);
214 /*-------------------------------------------------------------.
215 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
216 | rline, dprec, merger. |
217 `-------------------------------------------------------------*/
224 item_number
*rhs
= xnmalloc (nritems
, sizeof *rhs
);
225 unsigned int *prhs
= xnmalloc (nrules
, sizeof *prhs
);
226 unsigned int *rline
= xnmalloc (nrules
, sizeof *rline
);
227 symbol_number
*r1
= xnmalloc (nrules
, sizeof *r1
);
228 unsigned int *r2
= xnmalloc (nrules
, sizeof *r2
);
229 int *dprec
= xnmalloc (nrules
, sizeof *dprec
);
230 int *merger
= xnmalloc (nrules
, sizeof *merger
);
232 for (r
= 0; r
< nrules
; ++r
)
234 item_number
*rhsp
= NULL
;
235 /* Index of rule R in RHS. */
237 /* RHS of the rule R. */
238 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
240 /* LHS of the rule R. */
241 r1
[r
] = rules
[r
].lhs
->number
;
242 /* Length of rule R's RHS. */
244 /* Separator in RHS. */
246 /* Line where rule was defined. */
247 rline
[r
] = rules
[r
].location
.start
.line
;
248 /* Dynamic precedence (GLR). */
249 dprec
[r
] = rules
[r
].dprec
;
250 /* Merger-function index (GLR). */
251 merger
[r
] = rules
[r
].merger
;
255 muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
);
256 muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 0, nrules
);
257 muscle_insert_unsigned_int_table ("rline", rline
, 0, 0, nrules
);
258 muscle_insert_symbol_number_table ("r1", r1
, 0, 0, nrules
);
259 muscle_insert_unsigned_int_table ("r2", r2
, 0, 0, nrules
);
260 muscle_insert_int_table ("dprec", dprec
, 0, 0, nrules
);
261 muscle_insert_int_table ("merger", merger
, 0, 0, nrules
);
263 MUSCLE_INSERT_INT ("rules_number", nrules
);
264 MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context
);
275 /*--------------------------------------------.
276 | Prepare the muscles related to the states. |
277 `--------------------------------------------*/
280 prepare_states (void)
283 symbol_number
*values
= xnmalloc (nstates
, sizeof *values
);
284 for (i
= 0; i
< nstates
; ++i
)
285 values
[i
] = states
[i
]->accessing_symbol
;
286 muscle_insert_symbol_number_table ("stos", values
,
290 MUSCLE_INSERT_INT ("last", high
);
291 MUSCLE_INSERT_INT ("final_state_number", final_state
->number
);
292 MUSCLE_INSERT_INT ("states_number", nstates
);
297 /*---------------------------------.
298 | Output the user actions to OUT. |
299 `---------------------------------*/
302 user_actions_output (FILE *out
)
306 fputs ("m4_define([b4_actions], \n[", out
);
307 for (r
= 0; r
< nrules
; ++r
)
310 fprintf (out
, "b4_case(%d, [b4_syncline(%d, ", r
+ 1,
311 rules
[r
].action_location
.start
.line
);
312 string_output (out
, rules
[r
].action_location
.start
.file
);
313 fprintf (out
, ")\n[ %s]])\n\n", rules
[r
].action
);
315 fputs ("])\n\n", out
);
318 /*--------------------------------------.
319 | Output the merge functions to OUT. |
320 `--------------------------------------*/
323 merger_output (FILE *out
)
328 fputs ("m4_define([b4_mergers], \n[[", out
);
329 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
331 if (p
->type
[0] == '\0')
332 fprintf (out
, " case %d: *yy0 = %s (*yy0, *yy1); break;\n",
335 fprintf (out
, " case %d: yy0->%s = %s (*yy0, *yy1); break;\n",
336 n
, p
->type
, p
->name
);
338 fputs ("]])\n\n", out
);
341 /*--------------------------------------.
342 | Output the tokens definition to OUT. |
343 `--------------------------------------*/
346 token_definitions_output (FILE *out
)
349 char const *sep
= "";
351 fputs ("m4_define([b4_tokens], \n[", out
);
352 for (i
= 0; i
< ntokens
; ++i
)
354 symbol
*sym
= symbols
[i
];
355 int number
= sym
->user_token_number
;
357 /* At this stage, if there are literal string aliases, they are
358 part of SYMBOLS, so we should not find their aliased symbols
360 aver (number
!= USER_NUMBER_HAS_STRING_ALIAS
);
362 /* Skip error token. */
366 /* If this string has an alias, then it is necessarily the alias
367 which is to be output. */
371 /* Don't output literal chars or strings (when defined only as a
372 string). Note that must be done after the alias resolution:
373 think about `%token 'f' "f"'. */
374 if (sym
->tag
[0] == '\'' || sym
->tag
[0] == '\"')
377 /* Don't #define nonliteral tokens whose names contain periods,
378 dashes or '$' (as does the default value of the EOF token). */
379 if (mbschr (sym
->tag
, '.')
380 || mbschr (sym
->tag
, '-')
381 || mbschr (sym
->tag
, '$'))
384 fprintf (out
, "%s[[[%s]], %d]",
385 sep
, sym
->tag
, number
);
388 fputs ("])\n\n", out
);
392 /*---------------------------------------------------.
393 | Output the symbol destructors or printers to OUT. |
394 `---------------------------------------------------*/
397 symbol_code_props_output (FILE *out
, char const *what
,
398 code_props
const *(*get
)(symbol
const *))
401 char const *sep
= "";
403 fputs ("m4_define([b4_symbol_", out
);
405 fputs ("], \n[", out
);
406 for (i
= 0; i
< nsyms
; ++i
)
408 symbol
*sym
= symbols
[i
];
409 char const *code
= (*get
) (sym
)->code
;
412 location loc
= (*get
) (sym
)->location
;
414 Symbol-name, Symbol-number,
415 code, optional typename. */
416 fprintf (out
, "%s[", sep
);
418 string_output (out
, loc
.start
.file
);
419 fprintf (out
, ", %d, ", loc
.start
.line
);
420 quoted_output (out
, sym
->tag
);
421 fprintf (out
, ", %d, [[%s]]", sym
->number
, code
);
425 quoted_output (out
, sym
->type_name
);
430 fputs ("])\n\n", out
);
435 prepare_actions (void)
437 /* Figure out the actions for the specified state, indexed by
438 lookahead token type. */
440 muscle_insert_rule_number_table ("defact", yydefact
,
441 yydefact
[0], 1, nstates
);
443 /* Figure out what to do after reducing with each rule, depending on
444 the saved state from before the beginning of parsing the data
445 that matched this rule. */
446 muscle_insert_state_number_table ("defgoto", yydefgoto
,
447 yydefgoto
[0], 1, nsyms
- ntokens
);
451 muscle_insert_base_table ("pact", base
,
452 base
[0], 1, nstates
);
453 MUSCLE_INSERT_INT ("pact_ninf", base_ninf
);
456 muscle_insert_base_table ("pgoto", base
,
457 base
[nstates
], nstates
+ 1, nvectors
);
459 muscle_insert_base_table ("table", table
,
460 table
[0], 1, high
+ 1);
461 MUSCLE_INSERT_INT ("table_ninf", table_ninf
);
463 muscle_insert_base_table ("check", check
,
464 check
[0], 1, high
+ 1);
466 /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus
467 YYPACT) so that in states with unresolved conflicts, the default
468 reduction is not used in the conflicted entries, so that there is
469 a place to put a conflict pointer.
471 This means that YYCONFLP and YYCONFL are nonsense for a non-GLR
472 parser, so we could avoid accidents by not writing them out in
473 that case. Nevertheless, it seems even better to be able to use
474 the GLR skeletons even without the non-deterministic tables. */
475 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
,
476 conflict_table
[0], 1, high
+ 1);
477 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
,
478 0, 1, conflict_list_cnt
);
481 /*--------------------------------------------.
482 | Output the definitions of all the muscles. |
483 `--------------------------------------------*/
486 muscles_output (FILE *out
)
488 fputs ("m4_init()\n", out
);
490 user_actions_output (out
);
492 token_definitions_output (out
);
493 symbol_code_props_output (out
, "destructors", &symbol_destructor_get
);
494 symbol_code_props_output (out
, "printers", &symbol_printer_get
);
496 muscles_m4_output (out
);
499 /*---------------------------.
500 | Call the skeleton parser. |
501 `---------------------------*/
504 output_skeleton (void)
508 char const *argv
[10];
511 /* Compute the names of the package data dir and skeleton files. */
512 char const m4sugar
[] = "m4sugar/m4sugar.m4";
513 char const m4bison
[] = "bison.m4";
518 char const *m4
= (p
= getenv ("M4")) ? p
: M4
;
519 char const *pkgdatadir
= compute_pkgdatadir ();
520 size_t skeleton_size
= strlen (skeleton
) + 1;
521 size_t pkgdatadirlen
= strlen (pkgdatadir
);
522 while (pkgdatadirlen
&& pkgdatadir
[pkgdatadirlen
- 1] == '/')
524 full_skeleton
= xmalloc (pkgdatadirlen
+ 1
525 + (skeleton_size
< sizeof m4sugar
526 ? sizeof m4sugar
: skeleton_size
));
527 memcpy (full_skeleton
, pkgdatadir
, pkgdatadirlen
);
528 full_skeleton
[pkgdatadirlen
] = '/';
529 strcpy (full_skeleton
+ pkgdatadirlen
+ 1, m4sugar
);
530 full_m4sugar
= xstrdup (full_skeleton
);
531 strcpy (full_skeleton
+ pkgdatadirlen
+ 1, m4bison
);
532 full_m4bison
= xstrdup (full_skeleton
);
533 if (mbschr (skeleton
, '/'))
534 strcpy (full_skeleton
, skeleton
);
536 strcpy (full_skeleton
+ pkgdatadirlen
+ 1, skeleton
);
538 /* Test whether m4sugar.m4 is readable, to check for proper
539 installation. A faulty installation can cause deadlock, so a
540 cheap sanity check is worthwhile. */
541 xfclose (xfopen (full_m4sugar
, "r"));
543 /* Create an m4 subprocess connected to us via two pipes. */
545 if (trace_flag
& trace_tools
)
546 fprintf (stderr
, "running: %s %s - %s %s\n",
547 m4
, full_m4sugar
, full_m4bison
, full_skeleton
);
549 /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a
550 position-dependent manner. Keep it as the first argument so that all
553 See the thread starting at
554 <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
560 /* When POSIXLY_CORRECT is set, GNU M4 1.6 and later disable GNU
561 extensions, which Bison's skeletons depend on. With older M4,
562 it has no effect. M4 1.4.12 added a -g/--gnu command-line
563 option to make it explicit that a program wants GNU M4
564 extensions even when POSIXLY_CORRECT is set.
566 See the thread starting at
567 <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
570 argv
[i
++] = M4_GNU_OPTION
;
573 argv
[i
++] = pkgdatadir
;
574 if (trace_flag
& trace_m4
)
576 argv
[i
++] = full_m4sugar
;
578 argv
[i
++] = full_m4bison
;
579 argv
[i
++] = full_skeleton
;
581 aver (i
<= ARRAY_CARDINALITY (argv
));
584 /* The ugly cast is because gnulib gets the const-ness wrong. */
585 pid
= create_pipe_bidi ("m4", m4
, (char **)(void*)argv
, false, true,
589 free (full_skeleton
);
591 if (trace_flag
& trace_muscles
)
592 muscles_output (stderr
);
594 FILE *out
= fdopen (filter_fd
[1], "w");
596 error (EXIT_FAILURE
, get_errno (),
598 muscles_output (out
);
602 /* Read and process m4's output. */
603 timevar_push (TV_M4
);
604 in
= fdopen (filter_fd
[0], "r");
606 error (EXIT_FAILURE
, get_errno (),
609 /* scan_skel should have read all of M4's output. Otherwise, when we
610 close the pipe, we risk letting M4 report a broken-pipe to the
614 wait_subprocess (pid
, "m4", false, false, true, true, NULL
);
621 /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented
623 char const *use_push_for_pull_env
= getenv ("BISON_USE_PUSH_FOR_PULL");
624 bool use_push_for_pull_flag
= false;
625 if (use_push_for_pull_env
!= NULL
626 && use_push_for_pull_env
[0] != '\0'
627 && 0 != strcmp (use_push_for_pull_env
, "0"))
628 use_push_for_pull_flag
= true;
631 MUSCLE_INSERT_BOOL ("debug_flag", debug
);
632 MUSCLE_INSERT_BOOL ("defines_flag", defines_flag
);
633 MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose
);
634 MUSCLE_INSERT_BOOL ("glr_flag", glr_parser
);
635 MUSCLE_INSERT_BOOL ("locations_flag", locations_flag
);
636 MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser
);
637 MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag
);
638 MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen
);
639 MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag
);
640 MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag
);
641 MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag
);
644 if (spec_name_prefix
)
645 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
647 MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext
);
649 #define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
651 DEFINE (parser_file_name
);
652 DEFINE (spec_defines_file
);
653 DEFINE (spec_file_prefix
);
654 DEFINE (spec_graph_file
);
655 DEFINE (spec_name_prefix
);
656 DEFINE (spec_outfile
);
657 DEFINE (spec_verbose_file
);
660 /* Find the right skeleton file, and add muscles about the skeletons. */
662 MUSCLE_INSERT_C_STRING ("skeleton", skeleton
);
664 skeleton
= language
->skeleton
;
666 /* About the skeletons. */
668 /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs
669 would never be expanded. Hopefully no one has M4-special characters in
670 his Bison installation path. */
671 MUSCLE_INSERT_STRING_RAW ("pkgdatadir", compute_pkgdatadir ());
676 /*----------------------------------------------------------.
677 | Output the parsing tables and the parser code to ftable. |
678 `----------------------------------------------------------*/
683 obstack_init (&format_obstack
);
692 /* Process the selected skeleton file. */
695 obstack_free (&format_obstack
, NULL
);
699 compute_pkgdatadir (void)
701 char const *pkgdatadir
= getenv ("BISON_PKGDATADIR");
702 return pkgdatadir
? pkgdatadir
: PKGDATADIR
;