X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d8911864c25f5521b28fcf9e17e88436c17c59bd..ca2a6d1587f421a6c58b9f80cc8d6b983c9a62dc:/src/output.c?ds=sidebyside diff --git a/src/output.c b/src/output.c index f739f0e9..6b29e5c0 100644 --- a/src/output.c +++ b/src/output.c @@ -1,7 +1,7 @@ /* Output the generated parsing program for Bison. Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -24,9 +24,10 @@ #include #include #include +#include #include -#include #include +#include #include "complain.h" #include "files.h" @@ -40,6 +41,7 @@ #include "symtab.h" #include "tables.h" +# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) static struct obstack format_obstack; @@ -202,7 +204,7 @@ prepare_symbols (void) /*----------------------------------------------------------------. | Prepare the muscles related to the rules: r1, r2, rline, dprec, | -| merger. | +| merger, immediate. | `----------------------------------------------------------------*/ static void @@ -213,6 +215,7 @@ prepare_rules (void) unsigned int *r2 = xnmalloc (nrules, sizeof *r2); int *dprec = xnmalloc (nrules, sizeof *dprec); int *merger = xnmalloc (nrules, sizeof *merger); + int *immediate = xnmalloc (nrules, sizeof *immediate); rule_number r; for (r = 0; r < nrules; ++r) @@ -227,6 +230,8 @@ prepare_rules (void) dprec[r] = rules[r].dprec; /* Merger-function index (GLR). */ merger[r] = rules[r].merger; + /* Immediate reduction flags (GLR). */ + immediate[r] = rules[r].is_predicate; } muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules); @@ -234,6 +239,7 @@ prepare_rules (void) muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules); muscle_insert_int_table ("dprec", dprec, 0, 0, nrules); muscle_insert_int_table ("merger", merger, 0, 0, nrules); + muscle_insert_int_table ("immediate", immediate, 0, 0, nrules); MUSCLE_INSERT_INT ("rules_number", nrules); MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context); @@ -347,8 +353,9 @@ user_actions_output (FILE *out) for (r = 0; r < nrules; ++r) if (rules[r].action) { - fprintf (out, "b4_case(%d, [b4_syncline(%d, ", r + 1, - rules[r].action_location.start.line); + fprintf (out, "b4_%scase(%d, [b4_syncline(%d, ", + rules[r].is_predicate ? "predicate_" : "", + r + 1, rules[r].action_location.start.line); escaped_output (out, rules[r].action_location.start.file); fprintf (out, ")\n[ %s]])\n\n", rules[r].action); } @@ -635,10 +642,12 @@ output_skeleton (void) argv[i++] = full_m4bison; argv[i++] = full_skeleton; argv[i++] = NULL; + aver (i <= ARRAY_CARDINALITY (argv)); } - init_subpipe (); - pid = create_subpipe (argv, filter_fd); + /* The ugly cast is because gnulib gets the const-ness wrong. */ + pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true, + true, filter_fd); free (full_m4sugar); free (full_m4bison); free (full_skeleton); @@ -646,7 +655,7 @@ output_skeleton (void) if (trace_flag & trace_muscles) muscles_output (stderr); { - FILE *out = fdopen (filter_fd[0], "w"); + FILE *out = fdopen (filter_fd[1], "w"); if (! out) error (EXIT_FAILURE, get_errno (), "fdopen"); @@ -656,14 +665,17 @@ output_skeleton (void) /* Read and process m4's output. */ timevar_push (TV_M4); - end_of_output_subpipe (pid, filter_fd); - in = fdopen (filter_fd[1], "r"); + in = fdopen (filter_fd[0], "r"); if (! in) error (EXIT_FAILURE, get_errno (), "fdopen"); scan_skel (in); + /* scan_skel should have read all of M4's output. Otherwise, when we + close the pipe, we risk letting M4 report a broken-pipe to the + Bison user. */ + aver (feof (in)); xfclose (in); - reap_subpipe (pid, m4); + wait_subprocess (pid, "m4", false, false, true, true, NULL); timevar_pop (TV_M4); }