]> git.saurik.com Git - bison.git/blobdiff - src/output.c
Attach actions to rules, instead of pre-outputting them to
[bison.git] / src / output.c
index cf5c05939acaeefa44055d980cd4a4d43f8f71fd..7c2d0136721a335b2fc56eb116ff92a3453f55d7 100644 (file)
@@ -198,11 +198,6 @@ output_gram (void)
 
     XFREE (yyrhs);
   }
-
-#if 0
-  if (!semantic_parser && !no_parser_flag)
-    obstack_sgrow (&table_obstack, "\n#endif\n");
-#endif
 }
 
 
@@ -239,22 +234,14 @@ output_rule_data (void)
 
   j = 0;
   for (i = 0; i < nsyms; i++)
-    /* this used to be i<=nsyms, but that output a final "" symbol
-       almost by accident */
     {
+      /* Be sure not to use twice the same quotearg slot. */
+      const char *cp =
+       quotearg_n_style (1, c_quoting_style,
+                         quotearg_style (escape_quoting_style, tags[i]));
       /* Width of the next token, including the two quotes, the coma
         and the space.  */
-      int strsize = 4;
-      char *p;
-
-      for (p = tags[i]; p && *p; p++)
-       if (*p == '"' || *p == '\\' || *p == '\n' || *p == '\t'
-           || *p == '\b')
-         strsize += 2;
-       else if (*p < 040 || *p >= 0177)
-         strsize += 4;
-       else
-         strsize++;
+      int strsize = strlen (cp) + 2;
 
       if (j + strsize > 75)
        {
@@ -262,24 +249,8 @@ output_rule_data (void)
          j = 2;
        }
 
-      obstack_1grow (&output_obstack, '\"');
-      for (p = tags[i]; p && *p; p++)
-       {
-         if (*p == '"' || *p == '\\')
-           obstack_fgrow1 (&output_obstack, "\\%c", *p);
-         else if (*p == '\n')
-           obstack_sgrow (&output_obstack, "\\n");
-         else if (*p == '\t')
-           obstack_sgrow (&output_obstack, "\\t");
-         else if (*p == '\b')
-           obstack_sgrow (&output_obstack, "\\b");
-         else if (*p < 040 || *p >= 0177)
-           obstack_fgrow1 (&output_obstack, "\\%03o", *p);
-         else
-           obstack_1grow (&output_obstack, *p);
-       }
-
-      obstack_sgrow (&output_obstack, "\", ");
+      obstack_sgrow (&output_obstack, cp);
+      obstack_sgrow (&output_obstack, ", ");
       j += strsize;
     }
   /* add a NULL entry to list of tokens */
@@ -314,8 +285,6 @@ output_rule_data (void)
                     0, 1, nrules + 1);
   muscle_insert ("r2", obstack_finish (&output_obstack));
   XFREE (short_tab);
-
-  XFREE (rule_table + 1);
 }
 
 /*------------------------------------------------------------------.
@@ -541,6 +510,34 @@ token_actions (void)
 }
 
 
+/*-----------------------------.
+| Output the actions to OOUT.  |
+`-----------------------------*/
+
+static void
+actions_output (struct obstack *oout)
+{
+  int rule;
+  for (rule = 1; rule < nrules + 1; ++rule)
+    if (rule_table[rule].action)
+      {
+       obstack_fgrow1 (oout, "  case %d:\n", rule);
+
+       if (!no_lines_flag)
+         obstack_fgrow2 (oout, muscle_find ("linef"),
+                         rule_table[rule].action_line,
+                         quotearg_style (c_quoting_style,
+                                         muscle_find ("filename")));
+       obstack_1grow (oout, '{');
+       obstack_sgrow (oout, rule_table[rule].action);
+       /* As a Bison extension, add the ending semicolon.  Since some
+          Yacc don't do that, help people using bison as a Yacc
+          finding their missing semicolons.  */
+       obstack_fgrow1 (oout, "%s}\n    break;\n\n", yacc_flag ? ";" : "");
+      }
+}
+
+
 static void
 save_column (int symbol, int default_state)
 {
@@ -960,12 +957,12 @@ output_parser (const char *skel_filename, struct obstack *oout)
          /* Output the right value, or see if it's something special.  */
          muscle_key = obstack_finish (&muscle_obstack);
          muscle_value = muscle_find (muscle_key);
-         if (muscle_value)
-           obstack_sgrow (oout, muscle_value);
+         if (!strcmp (muscle_key, "actions"))
+           actions_output (oout);
          else if (!strcmp (muscle_key, "line"))
            obstack_fgrow1 (oout, "%d", line + 1);
-         else if (!strcmp (muscle_key, "input-line"))
-           obstack_fgrow1 (oout, "%d", lineno);
+         else if (muscle_value)
+           obstack_sgrow (oout, muscle_value);
          else
            {
              obstack_sgrow (oout, "%%");
@@ -1034,6 +1031,7 @@ prepare (void)
   MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
   MUSCLE_INSERT_INT ("ntbase", ntokens);
   MUSCLE_INSERT_INT ("error-verbose", error_verbose);
+  MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
 
   MUSCLE_INSERT_INT ("nnts", nvars);
   MUSCLE_INSERT_INT ("nrules", nrules);
@@ -1041,13 +1039,6 @@ prepare (void)
   MUSCLE_INSERT_INT ("ntokens", ntokens);
 
   MUSCLE_INSERT_INT ("locations-flag", locations_flag);
-
-  /* We need to save the actions in the muscle %%action.  */
-  obstack_1grow (&action_obstack, 0);
-  muscle_insert ("action", obstack_finish (&action_obstack));
-
-  if (spec_name_prefix)
-    MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
 }
 
 /*----------------------------------------------------------.
@@ -1069,9 +1060,6 @@ output (void)
   XFREE (user_toknums);
   output_actions ();
 
-#if 0
-  if (!no_parser_flag) */
-#endif
   prepare ();
   /* Copy definitions in directive.  */
   obstack_1grow (&attrs_obstack, 0);
@@ -1079,6 +1067,7 @@ output (void)
 
   output_master_parser ();
 
+  free (rule_table + 1);
   obstack_free (&muscle_obstack, 0);
   obstack_free (&output_obstack, 0);
   obstack_free (&action_obstack, 0);