]> git.saurik.com Git - bison.git/commitdiff
* src/output.c (output_master_parser): New.
authorMarc Autret <autret_m@epita.fr>
Sat, 22 Sep 2001 12:18:16 +0000 (12:18 +0000)
committerMarc Autret <autret_m@epita.fr>
Sat, 22 Sep 2001 12:18:16 +0000 (12:18 +0000)
(output_parser): Be more re-entrant.

ChangeLog
src/output.c

index d6e609f7d3014933abfbf1636e7fecc2cc814a34..801d76e8ffb7e345dd90e93d1ef5d4851086b89a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-09-22  Marc Autret  <autret_m@epita.fr>
+
+       * src/output.c (output_master_parser): New.
+       (output_parser): Be more re-entrant.
+
 2001-09-21  Marc Autret  <autret_m@epita.fr>
 
        * src/reader.c (copy_definition, parse_union_decl): Update and use
index fbb78d282f2b747c3a3f4cae515ce278c431f2cc..bf1da13b3292635fbb6e15632d4d40e8f16840da 100644 (file)
@@ -947,26 +947,20 @@ output_actions (void)
   output_check ();
 }
 
-/*------------------------------------------.
-| Copy the parser code into TABLE_OBSTACK.  |
-`------------------------------------------*/
+\f
+/*------------------------------------------------------------.
+| Copy the parser code from SKEL_FILENAME into OOUT obstack.  |
+| and do the muscle substitution.                             |
+`------------------------------------------------------------*/
 
 static void
-output_parser (void)
+output_parser (const char *skel_filename, struct obstack *oout)
 {
   int c;
   FILE *fskel;
   size_t line;
 
-  /* Loop over lines in the standard parser file.  */
-  if (!skeleton)
-    {
-      if (semantic_parser)
-       skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
-      else
-       skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
-    }
-  fskel = xfopen (skeleton, "r");
+  fskel = xfopen (skel_filename, "r");
 
   /* New output code.  */
   line = 1;
@@ -977,7 +971,7 @@ output_parser (void)
        {
          if (c == '\n')
            ++line;
-         obstack_1grow (&table_obstack, c);
+         obstack_1grow (oout, c);
          c = getc (fskel);
        }
       else if ((c = getc (fskel)) == '%')
@@ -985,6 +979,7 @@ output_parser (void)
          /* Read the muscle.  */
          const char *muscle_key = 0;
          const char *muscle_value = 0;
+
          while (isalnum (c = getc (fskel)) || c == '_')
            obstack_1grow (&muscle_obstack, c);
          obstack_1grow (&muscle_obstack, 0);
@@ -993,29 +988,49 @@ output_parser (void)
          muscle_key = obstack_finish (&muscle_obstack);
          muscle_value = muscle_find (muscle_key);
          if (muscle_value)
-           obstack_sgrow (&table_obstack, muscle_value);
+           obstack_sgrow (oout, muscle_value);
          else if (!strcmp (muscle_key, "line"))
-           obstack_fgrow1 (&table_obstack, "%d", line + 1);
+           obstack_fgrow1 (oout, "%d", line + 1);
          else if (!strcmp (muscle_key, "action"))
            {
              size_t size = obstack_object_size (&action_obstack);
-             obstack_grow (&table_obstack, 
-                           obstack_finish (&action_obstack), size);
+             obstack_grow (oout, obstack_base (&action_obstack), size);
            }
+         /* FIXME: Insert the code to recognize %%sub-skeleton for exemple.  */
          else
            {
-             obstack_sgrow (&table_obstack, "%%");
-             obstack_sgrow (&table_obstack, muscle_key);
+             obstack_sgrow (oout, "%%");
+             obstack_sgrow (oout, muscle_key);
            }
        }
       else
-       obstack_1grow (&table_obstack, '%');
+       obstack_1grow (oout, '%');
     }
 
   /* End.  */
   xfclose (fskel);
 }
 
+/*----------------------------------------.
+| Prepare the master parser to be output  |
+`----------------------------------------*/
+
+static void
+output_master_parser (void)
+{
+  if (!skeleton)
+    {
+      if (semantic_parser)
+       skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
+      else
+       skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
+    }
+  
+  obstack_finish (&action_obstack);
+  output_parser (skeleton, &table_obstack);
+}
+
+
 static void
 free_itemsets (void)
 {
@@ -1103,7 +1118,8 @@ output (void)
   prepare ();
   /* Copy definitions in directive.  */
   muscle_insert ("prologue", obstack_finish (&attrs_obstack));
-  output_parser ();
+
+  output_master_parser ();
 
   obstack_free (&muscle_obstack, 0);
   obstack_free (&output_obstack, 0);