1 /* Output the generated parsing program for Bison.
3 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
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>
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_fgrow1 (&format_obstack, "%6d", first); \
74 for (i = begin; i < end; ++i) \
76 obstack_1grow (&format_obstack, ','); \
79 obstack_sgrow (&format_obstack, "\n "); \
84 obstack_fgrow1 (&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_fgrow1 (&format_obstack, "%s_min", name); \
97 obstack_1grow (&format_obstack, 0); \
98 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \
99 obstack_fgrow1 (&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_state_number_table
, state_number
)
112 /*--------------------------------------------------------------------.
113 | Print to OUT a representation of STRING escaped both for C and M4. |
114 `--------------------------------------------------------------------*/
117 escaped_output (FILE *out
, char const *string
)
122 for (p
= quotearg_style (c_quoting_style
, string
); *p
; p
++)
125 case '$': fputs ("$][", out
); break;
126 case '@': fputs ("@@", out
); break;
127 case '[': fputs ("@{", out
); break;
128 case ']': fputs ("@}", out
); break;
129 default: fputc (*p
, out
); break;
136 /*------------------------------------------------------------------.
137 | Prepare the muscles related to the symbols: translate, tname, and |
139 `------------------------------------------------------------------*/
142 prepare_symbols (void)
144 MUSCLE_INSERT_BOOL ("token_table", token_table_flag
);
145 MUSCLE_INSERT_INT ("tokens_number", ntokens
);
146 MUSCLE_INSERT_INT ("nterms_number", nvars
);
147 MUSCLE_INSERT_INT ("symbols_number", nsyms
);
148 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
149 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
151 muscle_insert_symbol_number_table ("translate",
153 token_translations
[0],
154 1, max_user_token_number
+ 1);
156 /* tname -- token names. */
159 /* We assume that the table will be output starting at column 2. */
161 struct quoting_options
*qo
= clone_quoting_options (0);
162 set_quoting_style (qo
, c_quoting_style
);
163 set_quoting_flags (qo
, QA_SPLIT_TRIGRAPHS
);
164 for (i
= 0; i
< nsyms
; i
++)
166 char *cp
= quotearg_alloc (symbols
[i
]->tag
, -1, qo
);
167 /* Width of the next token, including the two quotes, the
168 comma and the space. */
169 int width
= strlen (cp
) + 2;
173 obstack_sgrow (&format_obstack
, "\n ");
178 obstack_1grow (&format_obstack
, ' ');
179 MUSCLE_OBSTACK_SGROW (&format_obstack
, cp
);
181 obstack_1grow (&format_obstack
, ',');
185 obstack_sgrow (&format_obstack
, " ]b4_null[");
187 /* Finish table and store. */
188 obstack_1grow (&format_obstack
, 0);
189 muscle_insert ("tname", obstack_finish (&format_obstack
));
192 /* Output YYTOKNUM. */
195 int *values
= xnmalloc (ntokens
, sizeof *values
);
196 for (i
= 0; i
< ntokens
; ++i
)
197 values
[i
] = symbols
[i
]->user_token_number
;
198 muscle_insert_int_table ("toknum", values
,
199 values
[0], 1, ntokens
);
205 /*----------------------------------------------------------------.
206 | Prepare the muscles related to the rules: r1, r2, rline, dprec, |
207 | merger, immediate. |
208 `----------------------------------------------------------------*/
213 unsigned int *rline
= xnmalloc (nrules
, sizeof *rline
);
214 symbol_number
*r1
= xnmalloc (nrules
, sizeof *r1
);
215 unsigned int *r2
= xnmalloc (nrules
, sizeof *r2
);
216 int *dprec
= xnmalloc (nrules
, sizeof *dprec
);
217 int *merger
= xnmalloc (nrules
, sizeof *merger
);
218 int *immediate
= xnmalloc (nrules
, sizeof *immediate
);
221 for (r
= 0; r
< nrules
; ++r
)
223 /* LHS of the rule R. */
224 r1
[r
] = rules
[r
].lhs
->number
;
225 /* Length of rule R's RHS. */
226 r2
[r
] = rule_rhs_length(&rules
[r
]);
227 /* Line where rule was defined. */
228 rline
[r
] = rules
[r
].location
.start
.line
;
229 /* Dynamic precedence (GLR). */
230 dprec
[r
] = rules
[r
].dprec
;
231 /* Merger-function index (GLR). */
232 merger
[r
] = rules
[r
].merger
;
233 /* Immediate reduction flags (GLR). */
234 immediate
[r
] = rules
[r
].is_predicate
;
237 muscle_insert_unsigned_int_table ("rline", rline
, 0, 0, nrules
);
238 muscle_insert_symbol_number_table ("r1", r1
, 0, 0, nrules
);
239 muscle_insert_unsigned_int_table ("r2", r2
, 0, 0, nrules
);
240 muscle_insert_int_table ("dprec", dprec
, 0, 0, nrules
);
241 muscle_insert_int_table ("merger", merger
, 0, 0, nrules
);
242 muscle_insert_int_table ("immediate", immediate
, 0, 0, nrules
);
244 MUSCLE_INSERT_INT ("rules_number", nrules
);
245 MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context
);
254 /*--------------------------------------------.
255 | Prepare the muscles related to the states. |
256 `--------------------------------------------*/
259 prepare_states (void)
262 symbol_number
*values
= xnmalloc (nstates
, sizeof *values
);
263 for (i
= 0; i
< nstates
; ++i
)
264 values
[i
] = states
[i
]->accessing_symbol
;
265 muscle_insert_symbol_number_table ("stos", values
,
269 MUSCLE_INSERT_INT ("last", high
);
270 MUSCLE_INSERT_INT ("final_state_number", final_state
->number
);
271 MUSCLE_INSERT_INT ("states_number", nstates
);
275 /*-------------------------------------------------------.
276 | Compare two symbols by type-name, and then by number. |
277 `-------------------------------------------------------*/
280 symbol_type_name_cmp (const symbol
**lhs
, const symbol
**rhs
)
282 int res
= UNIQSTR_CMP((*lhs
)->type_name
, (*rhs
)->type_name
);
285 return (*lhs
)->number
- (*rhs
)->number
;
289 /*----------------------------------------------------------------.
290 | Return a (malloc'ed) table of the symbols sorted by type-name. |
291 `----------------------------------------------------------------*/
294 symbols_by_type_name (void)
296 typedef int (*qcmp_type
) (const void *, const void *);
297 symbol
**res
= xmemdup (symbols
, nsyms
* sizeof *res
);
298 qsort (res
, nsyms
, sizeof *res
, (qcmp_type
) &symbol_type_name_cmp
);
303 /*------------------------------------------------------------------.
304 | Define b4_type_names, which is a list of (lists of the numbers of |
305 | symbols with same type-name). |
306 `------------------------------------------------------------------*/
309 type_names_output (FILE *out
)
312 symbol
**syms
= symbols_by_type_name ();
313 fputs ("m4_define([b4_type_names],\n[", out
);
314 for (i
= 0; i
< nsyms
; /* nothing */)
316 // The index of the first symbol of the current type-name.
318 fputs (i
? ",\n[" : "[", out
);
319 for (; i
< nsyms
&& syms
[i
]->type_name
== syms
[i0
]->type_name
; ++i
)
320 fprintf (out
, "%s%d", i
!= i0
? ", " : "", syms
[i
]->number
);
323 fputs ("])\n\n", out
);
328 /*-------------------------------------.
329 | The list of all the symbol numbers. |
330 `-------------------------------------*/
333 symbol_numbers_output (FILE *out
)
336 fputs ("m4_define([b4_symbol_numbers],\n[", out
);
337 for (i
= 0; i
< nsyms
; ++i
)
338 fprintf (out
, "%s[%d]", i
? ", " : "", i
);
339 fputs ("])\n\n", out
);
343 /*---------------------------------.
344 | Output the user actions to OUT. |
345 `---------------------------------*/
348 user_actions_output (FILE *out
)
352 fputs ("m4_define([b4_actions], \n[", out
);
353 for (r
= 0; r
< nrules
; ++r
)
356 fprintf (out
, "b4_%scase(%d, [b4_syncline(%d, ",
357 rules
[r
].is_predicate
? "predicate_" : "",
358 r
+ 1, rules
[r
].action_location
.start
.line
);
359 escaped_output (out
, rules
[r
].action_location
.start
.file
);
360 fprintf (out
, ")\n[ %s]])\n\n", rules
[r
].action
);
362 fputs ("])\n\n", out
);
365 /*------------------------------------.
366 | Output the merge functions to OUT. |
367 `------------------------------------*/
370 merger_output (FILE *out
)
375 fputs ("m4_define([b4_mergers], \n[[", out
);
376 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
378 if (p
->type
[0] == '\0')
379 fprintf (out
, " case %d: *yy0 = %s (*yy0, *yy1); break;\n",
382 fprintf (out
, " case %d: yy0->%s = %s (*yy0, *yy1); break;\n",
383 n
, p
->type
, p
->name
);
385 fputs ("]])\n\n", out
);
389 /*---------------------------------------------.
390 | Prepare the muscles for symbol definitions. |
391 `---------------------------------------------*/
394 prepare_symbol_definitions (void)
397 for (i
= 0; i
< nsyms
; ++i
)
399 symbol
*sym
= symbols
[i
];
403 #define SET_KEY(Entry) \
404 obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", i, Entry); \
405 obstack_1grow (&format_obstack, 0); \
406 key = obstack_finish (&format_obstack);
408 // Whether the symbol has an identifier.
409 value
= symbol_id_get (sym
);
411 MUSCLE_INSERT_INT (key
, !!value
);
415 MUSCLE_INSERT_STRING (key
, value
? value
: "");
417 // Its tag. Typically for documentation purpose.
419 MUSCLE_INSERT_STRING (key
, sym
->tag
);
421 SET_KEY("user_number");
422 MUSCLE_INSERT_INT (key
, sym
->user_token_number
);
425 MUSCLE_INSERT_INT (key
,
426 i
< ntokens
&& sym
!= errtoken
&& sym
!= undeftoken
);
429 MUSCLE_INSERT_INT (key
, sym
->number
);
432 MUSCLE_INSERT_INT (key
, !!sym
->type_name
);
435 MUSCLE_INSERT_STRING (key
, sym
->type_name
? sym
->type_name
: "");
437 #define CODE_PROP(PropName) \
439 code_props const *p = symbol_ ## PropName ## _get (sym); \
440 SET_KEY("has_" #PropName); \
441 MUSCLE_INSERT_INT (key, !!p->code); \
445 SET_KEY(#PropName "_file"); \
446 MUSCLE_INSERT_STRING (key, p->location.start.file); \
448 SET_KEY(#PropName "_line"); \
449 MUSCLE_INSERT_INT (key, p->location.start.line); \
451 SET_KEY(#PropName); \
452 MUSCLE_INSERT_STRING_RAW (key, p->code); \
456 CODE_PROP(destructor
);
464 /*--------------------------------------.
465 | Output the tokens definition to OUT. |
466 `--------------------------------------*/
469 token_definitions_output (FILE *out
)
472 char const *sep
= "";
474 fputs ("m4_define([b4_tokens], \n[", out
);
475 for (i
= 0; i
< ntokens
; ++i
)
477 symbol
*sym
= symbols
[i
];
478 int number
= sym
->user_token_number
;
479 uniqstr id
= symbol_id_get (sym
);
481 /* At this stage, if there are literal string aliases, they are
482 part of SYMBOLS, so we should not find their aliased symbols
484 aver (number
!= USER_NUMBER_HAS_STRING_ALIAS
);
486 /* Skip error token and tokens without identifier. */
487 if (sym
!= errtoken
&& id
)
489 fprintf (out
, "%s[[[%s]], %d]",
494 fputs ("])\n\n", out
);
499 prepare_actions (void)
501 /* Figure out the actions for the specified state, indexed by
502 lookahead token type. */
504 muscle_insert_rule_number_table ("defact", yydefact
,
505 yydefact
[0], 1, nstates
);
507 /* Figure out what to do after reducing with each rule, depending on
508 the saved state from before the beginning of parsing the data
509 that matched this rule. */
510 muscle_insert_state_number_table ("defgoto", yydefgoto
,
511 yydefgoto
[0], 1, nsyms
- ntokens
);
515 muscle_insert_base_table ("pact", base
,
516 base
[0], 1, nstates
);
517 MUSCLE_INSERT_INT ("pact_ninf", base_ninf
);
520 muscle_insert_base_table ("pgoto", base
,
521 base
[nstates
], nstates
+ 1, nvectors
);
523 muscle_insert_base_table ("table", table
,
524 table
[0], 1, high
+ 1);
525 MUSCLE_INSERT_INT ("table_ninf", table_ninf
);
527 muscle_insert_base_table ("check", check
,
528 check
[0], 1, high
+ 1);
530 /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus
531 YYPACT) so that in states with unresolved conflicts, the default
532 reduction is not used in the conflicted entries, so that there is
533 a place to put a conflict pointer.
535 This means that YYCONFLP and YYCONFL are nonsense for a non-GLR
536 parser, so we could avoid accidents by not writing them out in
537 that case. Nevertheless, it seems even better to be able to use
538 the GLR skeletons even without the non-deterministic tables. */
539 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
,
540 conflict_table
[0], 1, high
+ 1);
541 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
,
542 0, 1, conflict_list_cnt
);
546 /*--------------------------------------------.
547 | Output the definitions of all the muscles. |
548 `--------------------------------------------*/
551 muscles_output (FILE *out
)
553 fputs ("m4_init()\n", out
);
555 symbol_numbers_output (out
);
556 token_definitions_output (out
);
557 type_names_output (out
);
558 user_actions_output (out
);
560 muscles_m4_output (out
);
563 /*---------------------------.
564 | Call the skeleton parser. |
565 `---------------------------*/
568 output_skeleton (void)
572 char const *argv
[10];
575 /* Compute the names of the package data dir and skeleton files. */
576 char const m4sugar
[] = "m4sugar/m4sugar.m4";
577 char const m4bison
[] = "bison.m4";
582 char const *m4
= (p
= getenv ("M4")) ? p
: M4
;
583 char const *pkgdatadir
= compute_pkgdatadir ();
584 size_t skeleton_size
= strlen (skeleton
) + 1;
585 size_t pkgdatadirlen
= strlen (pkgdatadir
);
586 while (pkgdatadirlen
&& pkgdatadir
[pkgdatadirlen
- 1] == '/')
588 full_skeleton
= xmalloc (pkgdatadirlen
+ 1
589 + (skeleton_size
< sizeof m4sugar
590 ? sizeof m4sugar
: skeleton_size
));
591 strncpy (full_skeleton
, pkgdatadir
, pkgdatadirlen
);
592 full_skeleton
[pkgdatadirlen
] = '/';
593 strcpy (full_skeleton
+ pkgdatadirlen
+ 1, m4sugar
);
594 full_m4sugar
= xstrdup (full_skeleton
);
595 strcpy (full_skeleton
+ pkgdatadirlen
+ 1, m4bison
);
596 full_m4bison
= xstrdup (full_skeleton
);
597 if (strchr (skeleton
, '/'))
598 strcpy (full_skeleton
, skeleton
);
600 strcpy (full_skeleton
+ pkgdatadirlen
+ 1, skeleton
);
602 /* Test whether m4sugar.m4 is readable, to check for proper
603 installation. A faulty installation can cause deadlock, so a
604 cheap sanity check is worthwhile. */
605 xfclose (xfopen (full_m4sugar
, "r"));
607 /* Create an m4 subprocess connected to us via two pipes. */
609 if (trace_flag
& trace_tools
)
610 fprintf (stderr
, "running: %s %s - %s %s\n",
611 m4
, full_m4sugar
, full_m4bison
, full_skeleton
);
613 /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a
614 position-dependent manner. Keep it as the first argument so that all
617 See the thread starting at
618 <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
624 /* When POSIXLY_CORRECT is set, GNU M4 1.6 and later disable GNU
625 extensions, which Bison's skeletons depend on. With older M4,
626 it has no effect. M4 1.4.12 added a -g/--gnu command-line
627 option to make it explicit that a program wants GNU M4
628 extensions even when POSIXLY_CORRECT is set.
630 See the thread starting at
631 <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
634 argv
[i
++] = M4_GNU_OPTION
;
637 argv
[i
++] = pkgdatadir
;
638 if (trace_flag
& trace_m4
)
640 argv
[i
++] = full_m4sugar
;
642 argv
[i
++] = full_m4bison
;
643 argv
[i
++] = full_skeleton
;
645 aver (i
<= ARRAY_CARDINALITY (argv
));
648 /* The ugly cast is because gnulib gets the const-ness wrong. */
649 pid
= create_pipe_bidi ("m4", m4
, (char **)(void*)argv
, false, true,
653 free (full_skeleton
);
655 if (trace_flag
& trace_muscles
)
656 muscles_output (stderr
);
658 FILE *out
= fdopen (filter_fd
[1], "w");
660 error (EXIT_FAILURE
, get_errno (),
662 muscles_output (out
);
666 /* Read and process m4's output. */
667 timevar_push (TV_M4
);
668 in
= fdopen (filter_fd
[0], "r");
670 error (EXIT_FAILURE
, get_errno (),
673 /* scan_skel should have read all of M4's output. Otherwise, when we
674 close the pipe, we risk letting M4 report a broken-pipe to the
678 wait_subprocess (pid
, "m4", false, false, true, true, NULL
);
685 /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented
687 char const *use_push_for_pull_env
= getenv ("BISON_USE_PUSH_FOR_PULL");
688 bool use_push_for_pull_flag
= false;
689 if (use_push_for_pull_env
!= NULL
690 && use_push_for_pull_env
[0] != '\0'
691 && 0 != strcmp (use_push_for_pull_env
, "0"))
692 use_push_for_pull_flag
= true;
695 MUSCLE_INSERT_BOOL ("defines_flag", defines_flag
);
696 MUSCLE_INSERT_BOOL ("glr_flag", glr_parser
);
697 MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser
);
698 MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag
);
699 MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen
);
700 MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag
);
701 MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag
);
704 if (spec_name_prefix
)
705 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
707 MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext
);
709 #define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
711 DEFINE (parser_file_name
);
712 DEFINE (spec_defines_file
);
713 DEFINE (spec_file_prefix
);
714 DEFINE (spec_graph_file
);
715 DEFINE (spec_name_prefix
);
716 DEFINE (spec_outfile
);
717 DEFINE (spec_verbose_file
);
720 /* Find the right skeleton file, and add muscles about the skeletons. */
722 MUSCLE_INSERT_C_STRING ("skeleton", skeleton
);
724 skeleton
= language
->skeleton
;
726 /* About the skeletons. */
728 /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs
729 would never be expanded. Hopefully no one has M4-special characters in
730 his Bison installation path. */
731 MUSCLE_INSERT_STRING_RAW ("pkgdatadir", compute_pkgdatadir ());
736 /*----------------------------------------------------------.
737 | Output the parsing tables and the parser code to ftable. |
738 `----------------------------------------------------------*/
743 obstack_init (&format_obstack
);
749 prepare_symbol_definitions ();
753 /* Process the selected skeleton file. */
756 obstack_free (&format_obstack
, NULL
);
760 compute_pkgdatadir (void)
762 char const *pkgdatadir
= getenv ("BISON_PKGDATADIR");
763 return pkgdatadir
? pkgdatadir
: PKGDATADIR
;