* src/skeleton.h: New.

* src/output.c (output_parser, output_master_parser): Remove, dead
code.
* src/output.h (get_lines_number, actions_output, guards_output)
(token_definitions_output): Prototype them.
* src/parse-skel.y: Add the license notice.
Include output.h and skeleton.h.
(process_skeleton): Returns void, and takes a single parameter.
* src/scan-skel.l: Add the license notice.
Include skeleton.h.
Don't use %option yylineno: it seems that then Flex imagines
REJECT has been used, and therefore it won't reallocate its
buffers (which makes no other sense to me than a bug).  It results
in warnings for `unused: yy_flex_realloc'.
to guess if the generated parsers should have '.tab' in their
* src/Makefile.am (bison_SOURCES): Add scan-skel.l and
This commit is contained in:
Akim Demaille
2001-12-30 21:05:12 +00:00
parent 9b3add5beb
commit 1239777d4f
15 changed files with 168 additions and 167 deletions

View File

@@ -101,7 +101,7 @@
#include "symtab.h"
#include "conflicts.h"
#include "muscle_tab.h"
#include "skeleton.h"
static int nvectors;
static int nentries;
@@ -961,111 +961,12 @@ output_actions (void)
}
/*------------------------------------------------------------.
| Copy the parser code from SKEL_FILENAME into OOUT obstack. |
| and do the muscle substitution. |
`------------------------------------------------------------*/
/*---------------------------.
| Call the skeleton parser. |
`---------------------------*/
static void
output_parser (const char *skel_filename, FILE *out)
{
int c;
FILE *fskel;
size_t output_line;
size_t skeleton_line;
fskel = xfopen (skel_filename, "r");
/* New output code. */
output_line = 1;
skeleton_line = 1;
c = getc (fskel);
while (c != EOF)
{
if (c != '%')
{
if (c == '\n')
{
++output_line;
++skeleton_line;
}
putc (c, out);
c = getc (fskel);
}
else if ((c = getc (fskel)) == '%')
{
/* 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);
/* Output the right value, or see if it's something special. */
muscle_key = obstack_finish (&muscle_obstack);
muscle_value = muscle_find (muscle_key);
if (!strcmp (muscle_key, "actions"))
actions_output (out, &output_line);
else if (!strcmp (muscle_key, "guards"))
guards_output (out, &output_line);
else if (!strcmp (muscle_key, "line"))
fprintf (out, "%d", output_line);
else if (!strcmp (muscle_key, "tokendef"))
token_definitions_output (out, &output_line);
else if (!strcmp (muscle_key, "skeleton-line"))
fprintf (out, "%d", skeleton_line);
else if (muscle_value)
{
fputs (muscle_value, out);
output_line += get_lines_number (muscle_value);
}
else
{
fputs ("%%", out);
fputs (muscle_key, out);
}
}
else
putc ('%', out);
}
/* End. */
xfclose (fskel);
}
/*----------------------------------------.
| Prepare the master parser to be output |
`----------------------------------------*/
static void
output_master_parser (void)
{
FILE *parser = xfopen (parser_file_name, "w");
/* FIXME: Remove the two following lines. */
printf ("Test: %s\n", infile);
printf ("Test: %s\n", parser_file_name);
if (!skeleton)
{
if (semantic_parser)
skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
else
skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
}
muscle_insert ("skeleton", skeleton);
muscle_insert ("parser-file-name", parser_file_name);
output_parser (skeleton, parser);
xfclose (parser);
}
/* Call the skeleton parser. */
static
void
output_skeleton ()
output_skeleton (void)
{
/* Find the right skeleton file. */
if (!skeleton)
@@ -1078,7 +979,7 @@ output_skeleton ()
/* Parse the skeleton file and output the needed parsers. */
muscle_insert ("skeleton", skeleton);
process_skeleton (infile, skeleton);
process_skeleton (skeleton);
}
static void
@@ -1190,10 +1091,6 @@ output (void)
/* Process the selected skeleton file. */
output_skeleton ();
/* Output the parser. */
#if 0
output_master_parser ();
#endif
/* Output the header if needed. */
if (defines_flag)
header_output ();