[Top][All Lists]
[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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- FYI: [MAIN] prepare_skel.patch,
marc-alexandre autret <=