mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-16 15:53:03 +00:00
* src/output.c (output_master_parser): New.
(output_parser): Be more re-entrant.
This commit is contained in:
@@ -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>
|
2001-09-21 Marc Autret <autret_m@epita.fr>
|
||||||
|
|
||||||
* src/reader.c (copy_definition, parse_union_decl): Update and use
|
* src/reader.c (copy_definition, parse_union_decl): Update and use
|
||||||
|
|||||||
60
src/output.c
60
src/output.c
@@ -947,26 +947,20 @@ output_actions (void)
|
|||||||
output_check ();
|
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
|
static void
|
||||||
output_parser (void)
|
output_parser (const char *skel_filename, struct obstack *oout)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
FILE *fskel;
|
FILE *fskel;
|
||||||
size_t line;
|
size_t line;
|
||||||
|
|
||||||
/* Loop over lines in the standard parser file. */
|
fskel = xfopen (skel_filename, "r");
|
||||||
if (!skeleton)
|
|
||||||
{
|
|
||||||
if (semantic_parser)
|
|
||||||
skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
|
|
||||||
else
|
|
||||||
skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
|
|
||||||
}
|
|
||||||
fskel = xfopen (skeleton, "r");
|
|
||||||
|
|
||||||
/* New output code. */
|
/* New output code. */
|
||||||
line = 1;
|
line = 1;
|
||||||
@@ -977,7 +971,7 @@ output_parser (void)
|
|||||||
{
|
{
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
++line;
|
++line;
|
||||||
obstack_1grow (&table_obstack, c);
|
obstack_1grow (oout, c);
|
||||||
c = getc (fskel);
|
c = getc (fskel);
|
||||||
}
|
}
|
||||||
else if ((c = getc (fskel)) == '%')
|
else if ((c = getc (fskel)) == '%')
|
||||||
@@ -985,6 +979,7 @@ output_parser (void)
|
|||||||
/* Read the muscle. */
|
/* Read the muscle. */
|
||||||
const char *muscle_key = 0;
|
const char *muscle_key = 0;
|
||||||
const char *muscle_value = 0;
|
const char *muscle_value = 0;
|
||||||
|
|
||||||
while (isalnum (c = getc (fskel)) || c == '_')
|
while (isalnum (c = getc (fskel)) || c == '_')
|
||||||
obstack_1grow (&muscle_obstack, c);
|
obstack_1grow (&muscle_obstack, c);
|
||||||
obstack_1grow (&muscle_obstack, 0);
|
obstack_1grow (&muscle_obstack, 0);
|
||||||
@@ -993,29 +988,49 @@ output_parser (void)
|
|||||||
muscle_key = obstack_finish (&muscle_obstack);
|
muscle_key = obstack_finish (&muscle_obstack);
|
||||||
muscle_value = muscle_find (muscle_key);
|
muscle_value = muscle_find (muscle_key);
|
||||||
if (muscle_value)
|
if (muscle_value)
|
||||||
obstack_sgrow (&table_obstack, muscle_value);
|
obstack_sgrow (oout, muscle_value);
|
||||||
else if (!strcmp (muscle_key, "line"))
|
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"))
|
else if (!strcmp (muscle_key, "action"))
|
||||||
{
|
{
|
||||||
size_t size = obstack_object_size (&action_obstack);
|
size_t size = obstack_object_size (&action_obstack);
|
||||||
obstack_grow (&table_obstack,
|
obstack_grow (oout, obstack_base (&action_obstack), size);
|
||||||
obstack_finish (&action_obstack), size);
|
|
||||||
}
|
}
|
||||||
|
/* FIXME: Insert the code to recognize %%sub-skeleton for exemple. */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
obstack_sgrow (&table_obstack, "%%");
|
obstack_sgrow (oout, "%%");
|
||||||
obstack_sgrow (&table_obstack, muscle_key);
|
obstack_sgrow (oout, muscle_key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
obstack_1grow (&table_obstack, '%');
|
obstack_1grow (oout, '%');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End. */
|
/* End. */
|
||||||
xfclose (fskel);
|
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
|
static void
|
||||||
free_itemsets (void)
|
free_itemsets (void)
|
||||||
{
|
{
|
||||||
@@ -1103,7 +1118,8 @@ output (void)
|
|||||||
prepare ();
|
prepare ();
|
||||||
/* Copy definitions in directive. */
|
/* Copy definitions in directive. */
|
||||||
muscle_insert ("prologue", obstack_finish (&attrs_obstack));
|
muscle_insert ("prologue", obstack_finish (&attrs_obstack));
|
||||||
output_parser ();
|
|
||||||
|
output_master_parser ();
|
||||||
|
|
||||||
obstack_free (&muscle_obstack, 0);
|
obstack_free (&muscle_obstack, 0);
|
||||||
obstack_free (&output_obstack, 0);
|
obstack_free (&output_obstack, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user