#include "symtab.h"
#include "conflicts.h"
#include "muscle_tab.h"
-
+#include "skeleton.h"
static int nvectors;
static int nentries;
int error_verbose = 0;
/* Returns the number of lines of S. */
-static size_t
+size_t
get_lines_number (const char *s)
{
size_t lines = 0;
| Output the actions to OOUT. |
`-----------------------------*/
-static void
+void
actions_output (FILE *out, size_t *line)
{
int rule;
| Output the guards to OOUT. |
`----------------------------*/
-static void
+void
guards_output (FILE *out, size_t *line)
{
int rule;
| Output the tokens definition to OOUT. |
`---------------------------------------*/
-static void
+void
token_definitions_output (FILE *out, size_t *line)
{
int i;
}
\f
-/*------------------------------------------------------------.
-| 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)
+output_skeleton (void)
{
- 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");
+ /* Find the right skeleton file. */
if (!skeleton)
{
if (semantic_parser)
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);
-}
-
-/* FIXME. */
-
-#define MUSCLE_INSERT_INT(Key, Value) \
-{ \
- obstack_fgrow1 (&muscle_obstack, "%d", Value); \
- obstack_1grow (&muscle_obstack, 0); \
- muscle_insert (Key, obstack_finish (&muscle_obstack)); \
-}
-
-#define MUSCLE_INSERT_STRING(Key, Value) \
-{ \
- obstack_sgrow (&muscle_obstack, Value); \
- obstack_1grow (&muscle_obstack, 0); \
- muscle_insert (Key, obstack_finish (&muscle_obstack)); \
-}
-
-#define MUSCLE_INSERT_PREFIX(Key, Value) \
-{ \
- obstack_fgrow2 (&muscle_obstack, "%s%s", \
- spec_name_prefix ? spec_name_prefix : "yy", Value); \
- obstack_1grow (&muscle_obstack, 0); \
- muscle_insert (Key, obstack_finish (&muscle_obstack)); \
+ /* Parse the skeleton file and output the needed parsers. */
+ muscle_insert ("skeleton", skeleton);
+ process_skeleton (skeleton);
}
static void
MUSCLE_INSERT_INT ("error-verbose", error_verbose);
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
+ /* FIXME: This is wrong: the muscles should decide whether they hold
+ a copy or not, but the situation is too obscure currently. */
+ MUSCLE_INSERT_STRING ("output-infix", output_infix ? output_infix : "");
+ MUSCLE_INSERT_STRING ("output-prefix", short_base_name);
+
MUSCLE_INSERT_INT ("nnts", nvars);
MUSCLE_INSERT_INT ("nrules", nrules);
MUSCLE_INSERT_INT ("nstates", nstates);
MUSCLE_INSERT_INT ("locations-flag", locations_flag);
}
-
/*-------------------------.
| Output the header file. |
`-------------------------*/
obstack_1grow (&attrs_obstack, 0);
muscle_insert ("prologue", obstack_finish (&attrs_obstack));
- /* Output the parser. */
- output_master_parser ();
+ /* Process the selected skeleton file. */
+ output_skeleton ();
+
/* Output the header if needed. */
if (defines_flag)
header_output ();