]> git.saurik.com Git - bison.git/blobdiff - src/output.c
(prepare_rules, token_definitions_output): Use abort rather than assert.
[bison.git] / src / output.c
index 430164737fc14c2e6bf1f9b051ecbaed5315cba6..da0d78525921b66fc73819d7cfce265fbb28e9f7 100644 (file)
@@ -1,4 +1,4 @@
-/* Output the generated parsing program for bison,
+/* Output the generated parsing program for Bison.
    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
@@ -107,6 +107,30 @@ GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
 
 
 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
 
 
+/*----------------------------------------------------------------------.
+| Print to OUT a representation of FILENAME escaped both for C and M4.  |
+`----------------------------------------------------------------------*/
+
+static void
+escaped_file_name_output (FILE *out, char const *filename)
+{
+  char const *p;
+  fprintf (out, "[[");
+
+  for (p = quotearg_style (c_quoting_style, filename); *p; p++)
+    switch (*p)
+      {
+      case '$': fputs ("$][", out); break;
+      case '@': fputs ("@@",  out); break;
+      case '[': fputs ("@{",  out); break;
+      case ']': fputs ("@}",  out); break;
+      default: fputc (*p, out); break;
+      }
+
+  fprintf (out, "]]");
+}
+
+
 /*------------------------------------------------------------------.
 | Prepare the muscles related to the symbols: translate, tname, and |
 | toknum.                                                           |
 /*------------------------------------------------------------------.
 | Prepare the muscles related to the symbols: translate, tname, and |
 | toknum.                                                           |
@@ -146,14 +170,7 @@ prepare_symbols (void)
            j = 2;
          }
 
            j = 2;
          }
 
-       for (; *cp; cp++)
-         switch (*cp)
-           {
-           case '[': obstack_sgrow (&format_obstack, "@<:@"); break;
-           case ']': obstack_sgrow (&format_obstack, "@:>@"); break;
-           default: obstack_1grow (&format_obstack, *cp); break;
-           }
-
+       MUSCLE_OBSTACK_SGROW (&format_obstack, cp);
        obstack_sgrow (&format_obstack, ", ");
        j += strsize;
       }
        obstack_sgrow (&format_obstack, ", ");
        j += strsize;
       }
@@ -181,7 +198,7 @@ prepare_symbols (void)
 
 /*-------------------------------------------------------------.
 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
 
 /*-------------------------------------------------------------.
 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
-| rline, dprec, merger                                         |
+| rline, dprec, merger.                                        |
 `-------------------------------------------------------------*/
 
 static void
 `-------------------------------------------------------------*/
 
 static void
@@ -213,12 +230,13 @@ prepare_rules (void)
       rhs[i++] = -1;
       /* Line where rule was defined. */
       rline[r] = rules[r].location.first_line;
       rhs[i++] = -1;
       /* Line where rule was defined. */
       rline[r] = rules[r].location.first_line;
-      /* Dynamic precedence (GLR) */
+      /* Dynamic precedence (GLR) */
       dprec[r] = rules[r].dprec;
       dprec[r] = rules[r].dprec;
-      /* Merger-function index (GLR) */
+      /* Merger-function index (GLR) */
       merger[r] = rules[r].merger;
     }
       merger[r] = rules[r].merger;
     }
-  assert (i == nritems);
+  if (i != nritems)
+    abort ();
 
   muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
   muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules);
 
   muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
   muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules);
@@ -276,11 +294,10 @@ user_actions_output (FILE *out)
       {
        fprintf (out, "  case %d:\n", r + 1);
 
       {
        fprintf (out, "  case %d:\n", r + 1);
 
-       if (!no_lines_flag)
-         fprintf (out, muscle_find ("linef"),
-                  rules[r].action_location.first_line,
-                  quotearg_style (c_quoting_style,
-                                  muscle_find ("filename")));
+       fprintf (out, "]b4_syncline([[%d]], ",
+                rules[r].action_location.first_line);
+       escaped_file_name_output (out, rules[r].action_location.file);
+       fprintf (out, ")[\n");
        fprintf (out, "    %s\n    break;\n\n",
                 rules[r].action);
       }
        fprintf (out, "    %s\n    break;\n\n",
                 rules[r].action);
       }
@@ -329,7 +346,8 @@ token_definitions_output (FILE *out)
       /* At this stage, if there are literal aliases, they are part of
         SYMBOLS, so we should not find symbols which are the aliases
         here.  */
       /* At this stage, if there are literal aliases, they are part of
         SYMBOLS, so we should not find symbols which are the aliases
         here.  */
-      assert (number != USER_NUMBER_ALIAS);
+      if (number == USER_NUMBER_ALIAS)
+       abort ();
 
       /* Skip error token.  */
       if (symbol == errtoken)
 
       /* Skip error token.  */
       if (symbol == errtoken)
@@ -379,9 +397,11 @@ symbol_destructors_output (FILE *out)
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           destructor, typename. */
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           destructor, typename. */
-       fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
-                first ? "" : ",\n",
-                infile, symbol->destructor_location.first_line,
+       fprintf (out, "%s[",
+                first ? "" : ",\n");
+       escaped_file_name_output (out, symbol->destructor_location.file);
+       fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
+                symbol->destructor_location.first_line,
                 symbol->tag,
                 symbol->number,
                 symbol->destructor,
                 symbol->tag,
                 symbol->number,
                 symbol->destructor,
@@ -412,9 +432,11 @@ symbol_printers_output (FILE *out)
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           printer, typename. */
        /* Filename, lineno,
           Symbol-name, Symbol-number,
           printer, typename. */
-       fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
-                first ? "" : ",\n",
-                infile, symbol->printer_location.first_line,
+       fprintf (out, "%s[",
+                first ? "" : ",\n");
+       escaped_file_name_output (out, symbol->printer_location.file);
+       fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
+                symbol->printer_location.first_line,
                 symbol->tag,
                 symbol->number,
                 symbol->printer,
                 symbol->tag,
                 symbol->number,
                 symbol->printer,
@@ -506,10 +528,7 @@ output_skeleton (void)
   strcpy (full_path, pkgdatadir);
   full_path[pkgdatadirlen] = '/';
   strcpy (full_path + pkgdatadirlen + 1, m4sugar);
   strcpy (full_path, pkgdatadir);
   full_path[pkgdatadirlen] = '/';
   strcpy (full_path + pkgdatadirlen + 1, m4sugar);
-  in = fopen (full_path, "r");
-  if (! in)
-    error (EXIT_FAILURE, errno, "%s", full_path);
-  xfclose (in);
+  xfclose (xfopen (full_path, "r"));
   strcpy (full_path + pkgdatadirlen + 1, skeleton);
 
   /* Create an m4 subprocess connected to us via two pipes.  */
   strcpy (full_path + pkgdatadirlen + 1, skeleton);
 
   /* Create an m4 subprocess connected to us via two pipes.  */
@@ -564,19 +583,15 @@ static void
 prepare (void)
 {
   /* Flags. */
 prepare (void)
 {
   /* Flags. */
-  MUSCLE_INSERT_INT ("locations_flag", locations_flag);
+  MUSCLE_INSERT_INT ("debug", debug_flag);
   MUSCLE_INSERT_INT ("defines_flag", defines_flag);
   MUSCLE_INSERT_INT ("error_verbose", error_verbose);
   MUSCLE_INSERT_INT ("defines_flag", defines_flag);
   MUSCLE_INSERT_INT ("error_verbose", error_verbose);
+  MUSCLE_INSERT_INT ("locations_flag", locations_flag);
   MUSCLE_INSERT_INT ("pure", pure_parser);
   MUSCLE_INSERT_INT ("pure", pure_parser);
-  MUSCLE_INSERT_INT ("debug", debug_flag);
+  MUSCLE_INSERT_INT ("synclines_flag", !no_lines_flag);
 
 
-  /* FIXME: This is wrong: the muscles should decide whether they hold
-     a copy or not, but the situation is too obscure currently.  */
+  /* File names.  */
   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
-  MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
-  MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
-  MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
-  MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
 
   /* User Code.  */
   obstack_1grow (&pre_prologue_obstack, 0);
 
   /* User Code.  */
   obstack_1grow (&pre_prologue_obstack, 0);
@@ -594,7 +609,7 @@ prepare (void)
     }
 
   /* Parse the skeleton file and output the needed parsers.  */
     }
 
   /* Parse the skeleton file and output the needed parsers.  */
-  MUSCLE_INSERT_STRING ("skeleton", skeleton);
+  MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
 }
 
 
 }