/* Output the generated parsing program for Bison.
Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
- 2005, 2006 Free Software Foundation, Inc.
+ 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
}
-/*---------------------------------------.
-| Output the symbol destructors to OUT. |
-`---------------------------------------*/
+/*---------------------------------------------------.
+| Output the symbol destructors or printers to OUT. |
+`---------------------------------------------------*/
static void
-symbol_destructors_output (FILE *out)
+symbol_code_props_output (FILE *out, char const *what,
+ code_props const *(*get)(symbol const *))
{
int i;
char const *sep = "";
- fputs ("m4_define([b4_symbol_destructors], \n[", out);
+ fputs ("m4_define([b4_symbol_", out);
+ fputs (what, out);
+ fputs ("], \n[", out);
for (i = 0; i < nsyms; ++i)
- if (symbol_destructor_get (symbols[i]))
- {
- symbol *sym = symbols[i];
-
- /* Filename, lineno,
- Symbol-name, Symbol-number,
- destructor, optional typename. */
- fprintf (out, "%s[", sep);
- sep = ",\n";
- escaped_output (out, symbol_destructor_location_get (sym).start.file);
- fprintf (out, ", %d, ",
- symbol_destructor_location_get (sym).start.line);
- escaped_output (out, sym->tag);
- fprintf (out, ", %d, [[%s]]", sym->number,
- symbol_destructor_get (sym));
- if (sym->type_name)
- fprintf (out, ", [[%s]]", sym->type_name);
- fputc (']', out);
- }
- fputs ("])\n\n", out);
-}
-
-
-/*------------------------------------.
-| Output the symbol printers to OUT. |
-`------------------------------------*/
-
-static void
-symbol_printers_output (FILE *out)
-{
- int i;
- char const *sep = "";
-
- fputs ("m4_define([b4_symbol_printers], \n[", out);
- for (i = 0; i < nsyms; ++i)
- if (symbol_printer_get (symbols[i]))
- {
- symbol *sym = symbols[i];
-
- /* Filename, lineno,
- Symbol-name, Symbol-number,
- printer, optional typename. */
- fprintf (out, "%s[", sep);
- sep = ",\n";
- escaped_output (out, symbol_printer_location_get (sym).start.file);
- fprintf (out, ", %d, ", symbol_printer_location_get (sym).start.line);
- escaped_output (out, sym->tag);
- fprintf (out, ", %d, [[%s]]", sym->number, symbol_printer_get (sym));
- if (sym->type_name)
- fprintf (out, ", [[%s]]", sym->type_name);
- fputc (']', out);
- }
+ {
+ symbol *sym = symbols[i];
+ char const *code = (*get) (sym)->code;
+ if (code)
+ {
+ location loc = (*get) (sym)->location;
+ /* Filename, lineno,
+ Symbol-name, Symbol-number,
+ code, optional typename. */
+ fprintf (out, "%s[", sep);
+ sep = ",\n";
+ escaped_output (out, loc.start.file);
+ fprintf (out, ", %d, ", loc.start.line);
+ escaped_output (out, sym->tag);
+ fprintf (out, ", %d, [[%s]]", sym->number, code);
+ if (sym->type_name)
+ fprintf (out, ", [[%s]]", sym->type_name);
+ fputc (']', out);
+ }
+ }
fputs ("])\n\n", out);
}
full_skeleton = xmalloc (pkgdatadirlen + 1
+ (skeleton_size < sizeof m4sugar
? sizeof m4sugar : skeleton_size));
- strcpy (full_skeleton, pkgdatadir);
+ strncpy (full_skeleton, pkgdatadir, pkgdatadirlen);
full_skeleton[pkgdatadirlen] = '/';
strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar);
full_m4sugar = xstrdup (full_skeleton);
strcpy (full_skeleton + pkgdatadirlen + 1, m4bison);
full_m4bison = xstrdup (full_skeleton);
- strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
+ if (strchr (skeleton, '/'))
+ strcpy (full_skeleton, skeleton);
+ else
+ strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
xfclose (xfopen (full_m4sugar, "r"));
/* Create an m4 subprocess connected to us via two pipes. */
user_actions_output (out);
merger_output (out);
token_definitions_output (out);
- symbol_destructors_output (out);
- symbol_printers_output (out);
+ symbol_code_props_output (out, "destructors", &symbol_destructor_get);
+ symbol_code_props_output (out, "printers", &symbol_printer_get);
muscles_m4_output (out);
-
- fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
- fputs ("m4_divert_push(0)dnl\n", out);
xfclose (out);
/* Read and process m4's output. */
static void
prepare (void)
{
+ /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented
+ for the user. */
+ char const *use_push_for_pull_env = getenv ("BISON_USE_PUSH_FOR_PULL");
+ bool use_push_for_pull_flag = false;
+ if (use_push_for_pull_env != NULL
+ && use_push_for_pull_env[0] != '\0'
+ && 0 != strcmp (use_push_for_pull_env, "0"))
+ use_push_for_pull_flag = true;
+
/* Flags. */
MUSCLE_INSERT_BOOL ("debug_flag", debug_flag);
MUSCLE_INSERT_BOOL ("defines_flag", defines_flag);
MUSCLE_INSERT_BOOL ("glr_flag", glr_parser);
MUSCLE_INSERT_BOOL ("locations_flag", locations_flag);
MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
+ MUSCLE_INSERT_BOOL ("pull_flag", pull_parser);
MUSCLE_INSERT_BOOL ("pure_flag", pure_parser);
MUSCLE_INSERT_BOOL ("push_flag", push_parser);
MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen);
+ MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag);
MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
/* File names. */
DEFINE (spec_verbose_file);
#undef DEFINE
- /* User Code. */
- obstack_1grow (&pre_prologue_obstack, 0);
- obstack_1grow (&post_prologue_obstack, 0);
- muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
- muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
-
- /* Find the right skeleton file. */
- if (!skeleton)
- {
- if (glr_parser || nondeterministic_parser)
- skeleton = "glr.c";
- else
- skeleton = "yacc.c";
- }
+ /* Find the right skeleton file, and add muscles about the skeletons. */
+ if (skeleton)
+ MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
+ else
+ skeleton = language->skeleton;
- /* About the skeletons. */
+ /* About the skeletons. */
{
char const *pkgdatadir = getenv ("BISON_PKGDATADIR");
/* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs
his Bison installation path. */
MUSCLE_INSERT_STRING_RAW ("pkgdatadir",
pkgdatadir ? pkgdatadir : PKGDATADIR);
- MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
}
}
output_skeleton ();
obstack_free (&format_obstack, NULL);
- obstack_free (&pre_prologue_obstack, NULL);
- obstack_free (&post_prologue_obstack, NULL);
}