]> git.saurik.com Git - bison.git/blobdiff - src/output.c
package: bump to 2014
[bison.git] / src / output.c
index 76895d661471269e81fe757ffa4b10282b8c06f5..cb2cb8b49a65f583761940656d013d5e29a221c8 100644 (file)
@@ -1,6 +1,6 @@
 /* Output the generated parsing program for Bison.
 
 /* Output the generated parsing program for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software
+   Copyright (C) 1984, 1986, 1989, 1992, 2000-2014 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -23,7 +23,6 @@
 
 #include <concat-filename.h>
 #include <configmake.h>
 
 #include <concat-filename.h>
 #include <configmake.h>
-#include <error.h>
 #include <filename.h>
 #include <get-errno.h>
 #include <quotearg.h>
 #include <filename.h>
 #include <get-errno.h>
 #include <quotearg.h>
@@ -43,8 +42,6 @@
 #include "symtab.h"
 #include "tables.h"
 
 #include "symtab.h"
 #include "tables.h"
 
-# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
-
 static struct obstack format_obstack;
 
 
 static struct obstack format_obstack;
 
 
@@ -72,7 +69,7 @@ Name (char const *name,                                                 \
   int i;                                                                \
   int j = 1;                                                            \
                                                                         \
   int i;                                                                \
   int j = 1;                                                            \
                                                                         \
-  obstack_fgrow1 (&format_obstack, "%6d", first);                       \
+  obstack_printf (&format_obstack, "%6d", first);                       \
   for (i = begin; i < end; ++i)                                         \
     {                                                                   \
       obstack_1grow (&format_obstack, ',');                             \
   for (i = begin; i < end; ++i)                                         \
     {                                                                   \
       obstack_1grow (&format_obstack, ',');                             \
@@ -83,57 +80,63 @@ Name (char const *name,                                                 \
         }                                                               \
       else                                                              \
         ++j;                                                            \
         }                                                               \
       else                                                              \
         ++j;                                                            \
-      obstack_fgrow1 (&format_obstack, "%6d", table_data[i]);           \
+      obstack_printf (&format_obstack, "%6d", table_data[i]);           \
       if (table_data[i] < min)                                          \
         min = table_data[i];                                            \
       if (max < table_data[i])                                          \
         max = table_data[i];                                            \
     }                                                                   \
       if (table_data[i] < min)                                          \
         min = table_data[i];                                            \
       if (max < table_data[i])                                          \
         max = table_data[i];                                            \
     }                                                                   \
-  obstack_1grow (&format_obstack, 0);                                   \
-  muscle_insert (name, obstack_finish (&format_obstack));               \
+  muscle_insert (name, obstack_finish0 (&format_obstack));              \
                                                                         \
   lmin = min;                                                           \
   lmax = max;                                                           \
                                                                         \
   lmin = min;                                                           \
   lmax = max;                                                           \
-  /* Build `NAME_min' and `NAME_max' in the obstack. */                 \
-  obstack_fgrow1 (&format_obstack, "%s_min", name);                     \
-  obstack_1grow (&format_obstack, 0);                                   \
-  MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin);      \
-  obstack_fgrow1 (&format_obstack, "%s_max", name);                     \
-  obstack_1grow (&format_obstack, 0);                                   \
-  MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax);      \
+  /* Build 'NAME_min' and 'NAME_max' in the obstack. */                 \
+  obstack_printf (&format_obstack, "%s_min", name);                     \
+  MUSCLE_INSERT_LONG_INT (obstack_finish0 (&format_obstack), lmin);     \
+  obstack_printf (&format_obstack, "%s_max", name);                     \
+  MUSCLE_INSERT_LONG_INT (obstack_finish0 (&format_obstack), lmax);     \
 }
 
 }
 
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number)
-GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number)
-
+GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_unsigned_int_table, unsigned int)
+GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_int_table, int)
+GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_base_table, base_number)
+GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_rule_number_table, rule_number)
+GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_symbol_number_table, symbol_number)
+GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_state_number_table, state_number)
 
 
-/*--------------------------------------------------------------------.
-| Print to OUT a representation of STRING escaped both for C and M4.  |
-`--------------------------------------------------------------------*/
+/*----------------------------------------------------------------.
+| Print to OUT a representation of CP quoted and escaped for M4.  |
+`----------------------------------------------------------------*/
 
 static void
 
 static void
-escaped_output (FILE *out, char const *string)
+quoted_output (FILE *out, char const *cp)
 {
 {
-  char const *p;
   fprintf (out, "[[");
 
   fprintf (out, "[[");
 
-  for (p = quotearg_style (c_quoting_style, string); *p; p++)
-    switch (*p)
+  for (; *cp; cp++)
+    switch (*cp)
       {
       case '$': fputs ("$][", out); break;
       case '@': fputs ("@@",  out); break;
       case '[': fputs ("@{",  out); break;
       case ']': fputs ("@}",  out); break;
       {
       case '$': fputs ("$][", out); break;
       case '@': fputs ("@@",  out); break;
       case '[': fputs ("@{",  out); break;
       case ']': fputs ("@}",  out); break;
-      default: fputc (*p, out); break;
+      default:  fputc (*cp,   out); break;
       }
 
   fprintf (out, "]]");
 }
 
       }
 
   fprintf (out, "]]");
 }
 
+/*----------------------------------------------------------------.
+| Print to OUT a representation of STRING quoted and escaped both |
+| for C and M4.                                                   |
+`----------------------------------------------------------------*/
+
+static void
+string_output (FILE *out, char const *string)
+{
+  quoted_output (out, quotearg_style (c_quoting_style, string));
+}
+
 
 /*------------------------------------------------------------------.
 | Prepare the muscles related to the symbols: translate, tname, and |
 
 /*------------------------------------------------------------------.
 | Prepare the muscles related to the symbols: translate, tname, and |
@@ -143,7 +146,6 @@ escaped_output (FILE *out, char const *string)
 static void
 prepare_symbols (void)
 {
 static void
 prepare_symbols (void)
 {
-  MUSCLE_INSERT_BOOL ("token_table", token_table_flag);
   MUSCLE_INSERT_INT ("tokens_number", ntokens);
   MUSCLE_INSERT_INT ("nterms_number", nvars);
   MUSCLE_INSERT_INT ("symbols_number", nsyms);
   MUSCLE_INSERT_INT ("tokens_number", ntokens);
   MUSCLE_INSERT_INT ("nterms_number", nvars);
   MUSCLE_INSERT_INT ("symbols_number", nsyms);
@@ -178,7 +180,7 @@ prepare_symbols (void)
 
         if (i)
           obstack_1grow (&format_obstack, ' ');
 
         if (i)
           obstack_1grow (&format_obstack, ' ');
-        MUSCLE_OBSTACK_SGROW (&format_obstack, cp);
+        obstack_escape (&format_obstack, cp);
         free (cp);
         obstack_1grow (&format_obstack, ',');
         j += width;
         free (cp);
         obstack_1grow (&format_obstack, ',');
         j += width;
@@ -187,8 +189,7 @@ prepare_symbols (void)
     obstack_sgrow (&format_obstack, " ]b4_null[");
 
     /* Finish table and store. */
     obstack_sgrow (&format_obstack, " ]b4_null[");
 
     /* Finish table and store. */
-    obstack_1grow (&format_obstack, 0);
-    muscle_insert ("tname", obstack_finish (&format_obstack));
+    muscle_insert ("tname", obstack_finish0 (&format_obstack));
   }
 
   /* Output YYTOKNUM. */
   }
 
   /* Output YYTOKNUM. */
@@ -225,7 +226,7 @@ prepare_rules (void)
       /* LHS of the rule R. */
       r1[r] = rules[r].lhs->number;
       /* Length of rule R's RHS. */
       /* LHS of the rule R. */
       r1[r] = rules[r].lhs->number;
       /* Length of rule R's RHS. */
-      r2[r] = rule_rhs_length(&rules[r]);
+      r2[r] = rule_rhs_length (&rules[r]);
       /* Line where rule was defined. */
       rline[r] = rules[r].location.start.line;
       /* Dynamic precedence (GLR).  */
       /* Line where rule was defined. */
       rline[r] = rules[r].location.start.line;
       /* Dynamic precedence (GLR).  */
@@ -282,10 +283,10 @@ prepare_states (void)
 static int
 symbol_type_name_cmp (const symbol **lhs, const symbol **rhs)
 {
 static int
 symbol_type_name_cmp (const symbol **lhs, const symbol **rhs)
 {
-  int res = UNIQSTR_CMP((*lhs)->type_name, (*rhs)->type_name);
-  if (res)
-    return res;
-  return (*lhs)->number - (*rhs)->number;
+  int res = uniqstr_cmp ((*lhs)->type_name, (*rhs)->type_name);
+  if (!res)
+    res = (*lhs)->number - (*rhs)->number;
+  return res;
 }
 
 
 }
 
 
@@ -316,7 +317,7 @@ type_names_output (FILE *out)
   fputs ("m4_define([b4_type_names],\n[", out);
   for (i = 0; i < nsyms; /* nothing */)
     {
   fputs ("m4_define([b4_type_names],\n[", out);
   for (i = 0; i < nsyms; /* nothing */)
     {
-      // The index of the first symbol of the current type-name.
+      /* The index of the first symbol of the current type-name.  */
       int i0 = i;
       fputs (i ? ",\n[" : "[", out);
       for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i)
       int i0 = i;
       fputs (i ? ",\n[" : "[", out);
       for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i)
@@ -359,7 +360,7 @@ user_actions_output (FILE *out)
         fprintf (out, "b4_%scase(%d, [b4_syncline(%d, ",
                  rules[r].is_predicate ? "predicate_" : "",
                  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);
+        string_output (out, rules[r].action_location.start.file);
         fprintf (out, ")\n[    %s]])\n\n", rules[r].action);
       }
   fputs ("])\n\n", out);
         fprintf (out, ")\n[    %s]])\n\n", rules[r].action);
       }
   fputs ("])\n\n", out);
@@ -403,101 +404,74 @@ prepare_symbol_definitions (void)
       const char *key;
       const char *value;
 
       const char *key;
       const char *value;
 
-#define SET_KEY(Entry)                                                  \
-      obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", i, Entry);     \
-      obstack_1grow (&format_obstack, 0);                               \
-      key = obstack_finish (&format_obstack);
+#define SET_KEY(Entry)                                          \
+      obstack_printf (&format_obstack, "symbol(%d, %s)",        \
+                      i, Entry);                                \
+      key = obstack_finish0 (&format_obstack);
+
+#define SET_KEY2(Entry, Suffix)                                 \
+      obstack_printf (&format_obstack, "symbol(%d, %s_%s)",     \
+                      i, Entry, Suffix);                        \
+      key = obstack_finish0 (&format_obstack);
 
 
-      // Whether the symbol has an identifier.
+      /* Whether the symbol has an identifier.  */
       value = symbol_id_get (sym);
       value = symbol_id_get (sym);
-      SET_KEY("has_id");
+      SET_KEY ("has_id");
       MUSCLE_INSERT_INT (key, !!value);
 
       MUSCLE_INSERT_INT (key, !!value);
 
-      // Its identifier.
-      SET_KEY("id");
+      /* Its identifier.  */
+      SET_KEY ("id");
       MUSCLE_INSERT_STRING (key, value ? value : "");
 
       MUSCLE_INSERT_STRING (key, value ? value : "");
 
-      // Its tag.  Typically for documentation purpose.
-      SET_KEY("tag");
+      /* Its tag.  Typically for documentation purpose.  */
+      SET_KEY ("tag");
       MUSCLE_INSERT_STRING (key, sym->tag);
 
       MUSCLE_INSERT_STRING (key, sym->tag);
 
-      SET_KEY("user_number");
+      SET_KEY ("user_number");
       MUSCLE_INSERT_INT (key, sym->user_token_number);
 
       MUSCLE_INSERT_INT (key, sym->user_token_number);
 
-      SET_KEY("is_token");
+      SET_KEY ("is_token");
       MUSCLE_INSERT_INT (key,
                          i < ntokens && sym != errtoken && sym != undeftoken);
 
       MUSCLE_INSERT_INT (key,
                          i < ntokens && sym != errtoken && sym != undeftoken);
 
-      SET_KEY("number");
+      SET_KEY ("number");
       MUSCLE_INSERT_INT (key, sym->number);
 
       MUSCLE_INSERT_INT (key, sym->number);
 
-      SET_KEY("has_type");
+      SET_KEY ("has_type");
       MUSCLE_INSERT_INT (key, !!sym->type_name);
 
       MUSCLE_INSERT_INT (key, !!sym->type_name);
 
-      SET_KEY("type");
+      SET_KEY ("type");
       MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
 
       MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
 
-#define CODE_PROP(PropName)                                             \
-      do {                                                              \
-        code_props const *p = symbol_ ## PropName ## _get (sym);        \
-        SET_KEY("has_" #PropName);                                      \
-        MUSCLE_INSERT_INT (key, !!p->code);                             \
-                                                                        \
-        if (p->code)                                                    \
-          {                                                             \
-            SET_KEY(#PropName "_file");                                 \
-            MUSCLE_INSERT_STRING (key, p->location.start.file);         \
-                                                                        \
-            SET_KEY(#PropName "_line");                                 \
-            MUSCLE_INSERT_INT (key, p->location.start.line);            \
-                                                                        \
-            SET_KEY(#PropName);                                         \
-            MUSCLE_INSERT_STRING_RAW (key, p->code);                    \
-          }                                                             \
-      } while (0)
-
-      CODE_PROP(destructor);
-      CODE_PROP(printer);
-#undef CODE_PROP
+      {
+        int j;
+        for (j = 0; j < CODE_PROPS_SIZE; ++j)
+          {
+            /* "printer", not "%printer".  */
+            char const *pname = code_props_type_string (j) + 1;
+            code_props const *p = symbol_code_props_get (sym, j);
+            SET_KEY2 ("has", pname);
+            MUSCLE_INSERT_INT (key, !!p->code);
+
+            if (p->code)
+              {
+                SET_KEY2 (pname, "file");
+                MUSCLE_INSERT_STRING (key, p->location.start.file);
+
+                SET_KEY2 (pname, "line");
+                MUSCLE_INSERT_INT (key, p->location.start.line);
+
+                SET_KEY (pname);
+                MUSCLE_INSERT_STRING_RAW (key, p->code);
+              }
+          }
+      }
+#undef SET_KEY2
 #undef SET_KEY
     }
 }
 
 
 #undef SET_KEY
     }
 }
 
 
-/*--------------------------------------.
-| Output the tokens definition to OUT.  |
-`--------------------------------------*/
-
-static void
-token_definitions_output (FILE *out)
-{
-  int i;
-  char const *sep = "";
-
-  fputs ("m4_define([b4_tokens], \n[", out);
-  for (i = 0; i < ntokens; ++i)
-    {
-      symbol *sym = symbols[i];
-      int number = sym->user_token_number;
-      uniqstr id = symbol_id_get (sym);
-
-      /* At this stage, if there are literal string aliases, they are
-         part of SYMBOLS, so we should not find their aliased symbols
-         here.  */
-      aver (number != USER_NUMBER_HAS_STRING_ALIAS);
-
-      /* Skip error token and tokens without identifier.  */
-      if (sym != errtoken && id)
-        {
-          fprintf (out, "%s[[[%s]], %d]",
-                   sep, id, number);
-          sep = ",\n";
-        }
-    }
-  fputs ("])\n\n", out);
-}
-
-
 static void
 prepare_actions (void)
 {
 static void
 prepare_actions (void)
 {
@@ -556,10 +530,9 @@ muscles_output (FILE *out)
   fputs ("m4_init()\n", out);
   merger_output (out);
   symbol_numbers_output (out);
   fputs ("m4_init()\n", out);
   merger_output (out);
   symbol_numbers_output (out);
-  token_definitions_output (out);
   type_names_output (out);
   user_actions_output (out);
   type_names_output (out);
   user_actions_output (out);
-  // Must be last.
+  /* Must be last.  */
   muscles_m4_output (out);
 }
 \f
   muscles_m4_output (out);
 }
 \f
@@ -579,8 +552,8 @@ output_skeleton (void)
   char *m4sugar = xconcatenated_filename (datadir, "m4sugar/m4sugar.m4", NULL);
   char *m4bison = xconcatenated_filename (datadir, "bison.m4", NULL);
   char *skel = (IS_PATH_WITH_DIR (skeleton)
   char *m4sugar = xconcatenated_filename (datadir, "m4sugar/m4sugar.m4", NULL);
   char *m4bison = xconcatenated_filename (datadir, "bison.m4", NULL);
   char *skel = (IS_PATH_WITH_DIR (skeleton)
-               ? xstrdup (skeleton)
-               : xconcatenated_filename (datadir, skeleton, NULL));
+                ? xstrdup (skeleton)
+                : xconcatenated_filename (datadir, skeleton, NULL));
 
   /* Test whether m4sugar.m4 is readable, to check for proper
      installation.  A faulty installation can cause deadlock, so a
 
   /* Test whether m4sugar.m4 is readable, to check for proper
      installation.  A faulty installation can cause deadlock, so a
@@ -674,6 +647,7 @@ prepare (void)
   MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
   MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen);
   MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
   MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
   MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen);
+  MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag);
   MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag);
   MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
 
   MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag);
   MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
 
@@ -730,6 +704,11 @@ output (void)
   /* Process the selected skeleton file.  */
   output_skeleton ();
 
   /* Process the selected skeleton file.  */
   output_skeleton ();
 
+  /* If late errors were generated, destroy the generated source
+     files. */
+  if (complaint_status)
+    unlink_generated_sources ();
+
   obstack_free (&format_obstack, NULL);
 }
 
   obstack_free (&format_obstack, NULL);
 }