]> git.saurik.com Git - bison.git/blobdiff - src/output.c
* src/bison.simple (YYSTDERR): Remove, replace `stderr'.
[bison.git] / src / output.c
index 60b79790037936f19295230cd0d0481ad6e115d4..7b0e8f0c6ec7ce0a2aa206e57017a472adbfa58a 100644 (file)
 #include "symtab.h"
 #include "conflicts.h"
 #include "muscle_tab.h"
-
+#include "skeleton.h"
 
 static int nvectors;
 static int nentries;
@@ -125,7 +125,7 @@ static struct obstack format_obstack;
 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;
@@ -503,7 +503,7 @@ token_actions (void)
 | Output the actions to OOUT.  |
 `-----------------------------*/
 
-static void
+void
 actions_output (FILE *out, size_t *line)
 {
   int rule;
@@ -539,7 +539,7 @@ actions_output (FILE *out, size_t *line)
 | Output the guards to OOUT.  |
 `----------------------------*/
 
-static void
+void
 guards_output (FILE *out, size_t *line)
 {
   int rule;
@@ -571,7 +571,7 @@ guards_output (FILE *out, size_t *line)
 | Output the tokens definition to OOUT.  |
 `---------------------------------------*/
 
-static void
+void
 token_definitions_output (FILE *out, size_t *line)
 {
   int i;
@@ -961,87 +961,14 @@ output_actions (void)
 }
 
 \f
-/*------------------------------------------------------------.
-| Copy the parser code from SKEL_FILENAME into OOUT obstack.  |
-| and do the muscle substitution.                             |
-`------------------------------------------------------------*/
-
-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  |
-`----------------------------------------*/
+/*---------------------------.
+| Call the skeleton parser.  |
+`---------------------------*/
 
 static void
-output_master_parser (void)
+output_skeleton (void)
 {
-  FILE *parser = xfopen (parser_file_name, "w");
+  /* Find the right skeleton file.  */
   if (!skeleton)
     {
       if (semantic_parser)
@@ -1049,35 +976,10 @@ output_master_parser (void)
       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, 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
@@ -1091,7 +993,7 @@ prepare (void)
   MUSCLE_INSERT_INT ("final", final_state);
   MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
   MUSCLE_INSERT_INT ("error-verbose", error_verbose);
-  MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
+  MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
 
   MUSCLE_INSERT_INT ("nnts", nvars);
   MUSCLE_INSERT_INT ("nrules", nrules);
@@ -1101,7 +1003,6 @@ prepare (void)
   MUSCLE_INSERT_INT ("locations-flag", locations_flag);
 }
 
-
 /*-------------------------.
 | Output the header file.  |
 `-------------------------*/
@@ -1127,7 +1028,27 @@ yystype;\n\
 
   if (!pure_parser)
     fprintf (out, "\nextern YYSTYPE %slval;\n",
-            spec_name_prefix);
+            spec_name_prefix ? spec_name_prefix : "yy");
+
+  if (locations_flag)
+    {
+      fputs ("\n\n", out);
+      fprintf (out, "\
+#ifndef YYLTYPE\n\
+typedef struct yyltype\n\
+{\n\
+  int first_line;\n\
+  int first_column;\n\
+  int last_line;\n\
+  int last_column;\n\
+} yyltype;\n\
+# define YYLTYPE yyltype\n\
+#endif\n");
+      if (!pure_parser)
+       fprintf (out, "\nextern YYLTYPE %slloc;\n",
+                spec_name_prefix ? spec_name_prefix : "yy");
+    }
+
   if (semantic_parser)
     {
       int i;
@@ -1167,8 +1088,9 @@ output (void)
   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 ();