bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FYI: [MAIN] prepare_skel.patch


From: marc-alexandre autret
Subject: FYI: [MAIN] prepare_skel.patch
Date: Sat, 22 Sep 2001 14:15:37 +0000 (GMT)

Hi,

Here,is a patch to prepare the multiple skeleton
output support.


Index: ChangeLog
===================================================================
RCS file: /cvsroot/bison/bison/ChangeLog,v
retrieving revision 1.217
diff -u -r1.217 ChangeLog
--- ChangeLog   2001/09/21 16:25:19     1.217
+++ ChangeLog   2001/09/22 12:15:55
@@ -1,3 +1,8 @@
+2001-09-22  Marc Autret  <address@hidden>
+
+       * src/output.c (output_master_parser): New.
+       (output_parser): Be more re-entrant.
+
 2001-09-21  Marc Autret  <address@hidden>
 
        * src/reader.c (copy_definition, parse_union_decl): Update and use
Index: src/output.c
===================================================================
RCS file: /cvsroot/bison/bison/src/output.c,v
retrieving revision 1.57
diff -u -r1.57 output.c
--- src/output.c        2001/09/18 21:32:53     1.57
+++ src/output.c        2001/09/22 12:15:56
@@ -947,26 +947,20 @@
   output_check ();
 }
 
-/*------------------------------------------.
-| Copy the parser code into TABLE_OBSTACK.  |
-`------------------------------------------*/
+
+/*------------------------------------------------------------.
+| 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 @@
        {
          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 @@
          /* 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,30 +988,50 @@
          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)
 {
   core *cp, *cptmp;
@@ -1103,7 +1118,8 @@
   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);


-- 
Autret Marc (address@hidden)
Eleve Ingenieur en Informatique.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]