]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
* src/reader.c (parse_union_decl): Push the caracters in
[bison.git] / src / reader.c
index 31af907d5415012f21eda6fa8c246a898e110e80..9bf54dfbbb167dc6b01fde46b6a502184a7147b9 100644 (file)
 #include "quote.h"
 #include "getargs.h"
 #include "files.h"
-#include "xalloc.h"
 #include "symtab.h"
+#include "options.h"
 #include "lex.h"
 #include "gram.h"
 #include "complain.h"
 #include "output.h"
 #include "reader.h"
 #include "conflicts.h"
-#include "macrotab.h"
+#include "muscle_tab.h"
 
 /* Number of slots allocated (but not necessarily used yet) in `rline'  */
 static int rline_allocated;
@@ -428,8 +428,11 @@ copy_definition (void)
 
 #if 0
   if (!no_lines_flag)
-    obstack_fgrow2 (&attrs_obstack, "#line %d %s\n",
-                   lineno, quotearg_style (c_quoting_style, infile));
+    {
+      obstack_fgrow2 (&attrs_obstack, muscle_find ("linef"),
+                     lineno, quotearg_style (c_quoting_style,
+                                             muscle_find("filename")));
+    }
 #endif
 
   after_percent = 0;
@@ -487,8 +490,8 @@ copy_definition (void)
 static void
 parse_token_decl (symbol_class what_is, symbol_class what_is_not)
 {
-  token_t token = 0;
-  char *typename = 0;
+  token_t token = tok_undef;
+  char *typename = NULL;
 
   /* The symbol being defined.  */
   struct bucket *symbol = NULL;
@@ -537,7 +540,6 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
              /* symbol and symval combined are only one symbol */
              nsyms--;
            }
-         translations = 1;
          symbol = NULL;
        }
       else if (token == tok_identifier)
@@ -562,7 +564,6 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
       else if (symbol && token == tok_number)
        {
          symbol->user_token_number = numval;
-         translations = 1;
        }
       else
        {
@@ -704,7 +705,6 @@ parse_assoc_decl (associativity assoc)
          if (prev == tok_identifier)
            {
              symval->user_token_number = numval;
-             translations = 1;
            }
          else
            {
@@ -731,9 +731,9 @@ token_buffer);
 
 
 /*--------------------------------------------------------------.
-| Copy the union declaration into ATTRS_OBSTACK (and fdefines), |
-| where it is made into the definition of YYSTYPE, the type of  |
-| elements of the parser value stack.                           |
+| Copy the union declaration into the stype muscle             |
+| (and fdefines),  where it is made into the definition of     |
+| YYSTYPE, the type of elements of the parser value stack.     |
 `--------------------------------------------------------------*/
 
 static void
@@ -741,19 +741,20 @@ parse_union_decl (void)
 {
   int c;
   int count = 0;
+  struct obstack union_obstack;
 
   if (typed)
     complain (_("multiple %s declarations"), "%union");
 
   typed = 1;
 
-  if (!no_lines_flag)
-    obstack_fgrow2 (&attrs_obstack, "\n#line %d %s\n",
-                   lineno, quotearg_style (c_quoting_style, infile));
-  else
+  /* FIXME: I'm worried: are you sure attrs_obstack is properly
+     filled?  */
+  if (no_lines_flag)
     obstack_1grow (&attrs_obstack, '\n');
 
-  obstack_sgrow (&attrs_obstack, "typedef union");
+  obstack_init (&union_obstack);
+  obstack_sgrow (&union_obstack, "union");
   if (defines_flag)
     obstack_sgrow (&defines_obstack, "typedef union");
 
@@ -761,9 +762,13 @@ parse_union_decl (void)
 
   while (c != EOF)
     {
-      obstack_1grow (&attrs_obstack, c);
-      if (defines_flag)
-       obstack_1grow (&defines_obstack, c);
+      /* If C contains '/', it is output by copy_comment ().  */
+      if (c != '/')
+       {
+         obstack_1grow (&union_obstack, c);
+         if (defines_flag)
+           obstack_1grow (&defines_obstack, c);
+       }
 
       switch (c)
        {
@@ -772,7 +777,7 @@ parse_union_decl (void)
          break;
 
        case '/':
-         copy_comment2 (finput, &defines_obstack, &attrs_obstack);
+         copy_comment2 (finput, &defines_obstack, &union_obstack);
          break;
 
        case '{':
@@ -785,19 +790,21 @@ parse_union_decl (void)
          count--;
          if (count <= 0)
            {
-             obstack_sgrow (&attrs_obstack, " YYSTYPE;\n");
              if (defines_flag)
                obstack_sgrow (&defines_obstack, " YYSTYPE;\n");
              /* JF don't choke on trailing semi */
              c = skip_white_space ();
              if (c != ';')
                ungetc (c, finput);
+             obstack_1grow (&union_obstack, 0);
+             muscle_insert ("stype", obstack_finish (&union_obstack));
              return;
            }
        }
 
       c = getc (finput);
     }
+
 }
 
 
@@ -847,7 +854,6 @@ parse_thong_decl (void)
   char *typename = 0;
   int usrtoknum;
 
-  translations = 1;
   token = lex ();              /* fetch typename or first token */
   if (token == tok_typename)
     {
@@ -899,14 +905,12 @@ parse_thong_decl (void)
   nsyms--;
 }
 
-/* FIXME. */
-
 static void
-parse_macro_decl (void)
+parse_muscle_decl (void)
 {
   int ch = ungetc (skip_white_space (), finput);
-  char* macro_key;
-  char* macro_value;
+  char* muscle_key;
+  char* muscle_value;
 
   /* Read key. */
   if (!isalpha (ch) && ch != '_')
@@ -915,10 +919,10 @@ parse_macro_decl (void)
       skip_to_char ('%');
       return;
     }
-  copy_identifier (finput, &macro_obstack);
-  obstack_1grow (&macro_obstack, 0);
-  macro_key = obstack_finish (&macro_obstack);
-  
+  copy_identifier (finput, &muscle_obstack);
+  obstack_1grow (&muscle_obstack, 0);
+  muscle_key = obstack_finish (&muscle_obstack);
+
   /* Read value. */
   ch = skip_white_space ();
   if (ch != '"')
@@ -933,12 +937,12 @@ parse_macro_decl (void)
       else
        fatal (_("Premature EOF after %s"), "\"");
     }
-  copy_string2 (finput, &macro_obstack, '"', 0);
-  obstack_1grow (&macro_obstack, 0);
-  macro_value = obstack_finish (&macro_obstack);
+  copy_string2 (finput, &muscle_obstack, '"', 0);
+  obstack_1grow (&muscle_obstack, 0);
+  muscle_value = obstack_finish (&muscle_obstack);
 
   /* Store the (key, value) pair in the environment. */
-  macro_insert (macro_key, macro_value);
+  muscle_insert (muscle_key, muscle_value);
 }
 
 
@@ -952,36 +956,6 @@ parse_skel_decl (void)
   /* Complete with parse_dquoted_param () on the CVS branch 1.29.  */
 }
 
-/*------------------------------------------.
-| Parse what comes after %header_extension. |
-`------------------------------------------*/
-
-static void
-parse_header_extension_decl (void)
-{
-  char buff[32];
-
-  if (header_extension)
-    complain (_("multiple %%header_extension declarations"));
-  fscanf (finput, "%s", buff);
-  header_extension = xstrdup (buff);
-}
-
-/*------------------------------------------.
-| Parse what comes after %source_extension. |
-`------------------------------------------*/
-
-static void
-parse_source_extension_decl (void)
-{
-  char buff[32];
-
-  if (src_extension)
-    complain (_("multiple %%source_extension declarations"));
-  fscanf (finput, "%s", buff);
-  src_extension = xstrdup (buff);
-}
-
 /*----------------------------------------------------------------.
 | Read from finput until `%%' is seen.  Discard the `%%'.  Handle |
 | any `%' declarations, and copy the contents of any `%{ ... %}'  |
@@ -1051,18 +1025,10 @@ read_declarations (void)
              parse_assoc_decl (non_assoc);
              break;
 
-           case tok_hdrext:
-             parse_header_extension_decl ();
-             break;
-
-           case tok_srcext:
-             parse_source_extension_decl ();
-             break;
-
            case tok_define:
-             parse_macro_decl ();
+             parse_muscle_decl ();
              break;
-             
+
            case tok_skel:
              parse_skel_decl ();
              break;
@@ -1105,14 +1071,13 @@ copy_action (symbol_list *rule, int stack_offset)
   if (semantic_parser)
     stack_offset = 0;
 
-  sprintf (buf, "\ncase %d:\n", nrules);
-  obstack_grow (&action_obstack, buf, strlen (buf));
+  obstack_fgrow1 (&action_obstack, "\ncase %d:\n", nrules);
 
   if (!no_lines_flag)
     {
-      sprintf (buf, "#line %d %s\n",
-              lineno, quotearg_style (c_quoting_style, infile));
-      obstack_grow (&action_obstack, buf, strlen (buf));
+      obstack_fgrow2 (&action_obstack, muscle_find ("linef"),
+                     lineno, quotearg_style (c_quoting_style,
+                                             muscle_find ("filename")));
     }
   obstack_1grow (&action_obstack, '{');
 
@@ -1198,8 +1163,9 @@ copy_guard (symbol_list *rule, int stack_offset)
 
   obstack_fgrow1 (&guard_obstack, "\ncase %d:\n", nrules);
   if (!no_lines_flag)
-    obstack_fgrow2 (&guard_obstack, "#line %d %s\n",
-                   lineno, quotearg_style (c_quoting_style, infile));
+    obstack_fgrow2 (&guard_obstack, muscle_find ("linef"),
+                   lineno, quotearg_style (c_quoting_style,
+                                           muscle_find ("filename")));
   obstack_1grow (&guard_obstack, '{');
 
   count = 0;
@@ -1666,21 +1632,21 @@ readgram (void)
 }
 
 /* At the end of the grammar file, some C source code must
-   be stored. It is going to be associated to the user_code
+   be stored. It is going to be associated to the epilogue
    directive.  */
 static void
 read_additionnal_code (void)
 {
   char c;
-  struct obstack uc_obstack;
-  
-  obstack_init (&uc_obstack);
+  struct obstack el_obstack;
+
+  obstack_init (&el_obstack);
 
   while ((c = getc (finput)) != EOF)
-    obstack_1grow (&uc_obstack, c);
-  
-  obstack_1grow (&uc_obstack, 0);
-  macro_insert ("user_code", obstack_finish (&uc_obstack));
+    obstack_1grow (&el_obstack, c);
+
+  obstack_1grow (&el_obstack, 0);
+  muscle_insert ("epilogue", obstack_finish (&el_obstack));
 }
 
 \f
@@ -1724,9 +1690,10 @@ output_token_defines (struct obstack *oout)
        continue;
 
       obstack_fgrow2 (oout, "# define\t%s\t%d\n",
-                     symbol,
-                     (translations ? bp->user_token_number : bp->value));
+                     symbol, bp->user_token_number);
       if (semantic_parser)
+       /* FIXME: This is certainly dead wrong, and should be just as
+          above. --akim.  */
        obstack_fgrow2 (oout, "# define\tT%s\t%d\n", symbol, bp->value);
     }
 }
@@ -1741,9 +1708,9 @@ output_token_defines (struct obstack *oout)
 static void
 packsymbols (void)
 {
-  bucket *bp;
+  bucket *bp = NULL;
   int tokno = 1;
-  int i;
+  int i, j;
   int last_user_token_number;
   static char DOLLAR[] = "$";
 
@@ -1807,7 +1774,7 @@ packsymbols (void)
 
       if (bp->class == token_sym)
        {
-         if (translations && !(bp->user_token_number))
+         if (!bp->user_token_number)
            bp->user_token_number = ++last_user_token_number;
          if (bp->user_token_number > max_user_token_number)
            max_user_token_number = bp->user_token_number;
@@ -1817,40 +1784,39 @@ packsymbols (void)
       user_toknums[bp->value] = bp->user_token_number;
       sprec[bp->value] = bp->prec;
       sassoc[bp->value] = bp->assoc;
-
     }
 
-  if (translations)
-    {
-      int j;
-
-      token_translations = XCALLOC (short, max_user_token_number + 1);
+  token_translations = XCALLOC (short, max_user_token_number + 1);
 
-      /* initialize all entries for literal tokens to 2, the internal
-         token number for $undefined., which represents all invalid
-         inputs.  */
-      for (j = 0; j <= max_user_token_number; j++)
-       token_translations[j] = 2;
+  /* initialize all entries for literal tokens to 2, the internal
+     token number for $undefined., which represents all invalid
+     inputs.  */
+  for (j = 0; j <= max_user_token_number; j++)
+    token_translations[j] = 2;
 
-      for (bp = firstsymbol; bp; bp = bp->next)
-       {
-         if (bp->value >= ntokens)
-           continue;           /* non-terminal */
-         if (bp->user_token_number == SALIAS)
-           continue;
-         if (token_translations[bp->user_token_number] != 2)
-           complain (_("tokens %s and %s both assigned number %d"),
-                     tags[token_translations[bp->user_token_number]],
-                     bp->tag, bp->user_token_number);
-         token_translations[bp->user_token_number] = bp->value;
-       }
+  for (bp = firstsymbol; bp; bp = bp->next)
+    {
+      if (bp->value >= ntokens)
+       continue;               /* non-terminal */
+      if (bp->user_token_number == SALIAS)
+       continue;
+      if (token_translations[bp->user_token_number] != 2)
+       complain (_("tokens %s and %s both assigned number %d"),
+                 tags[token_translations[bp->user_token_number]],
+                 bp->tag, bp->user_token_number);
+      token_translations[bp->user_token_number] = bp->value;
     }
 
   error_token_number = errtoken->value;
 
-  output_token_defines (&output_obstack);
-  obstack_1grow (&output_obstack, 0);
-  macro_insert ("tokendef", obstack_finish (&output_obstack));
+  {
+    struct obstack tokendefs;
+    obstack_init (&tokendefs);
+    output_token_defines (&tokendefs);
+    obstack_1grow (&tokendefs, 0);
+    muscle_insert ("tokendef", xstrdup (obstack_finish (&tokendefs)));
+    obstack_free (&tokendefs, NULL);
+  }
 
 #if 0
   if (!no_parser_flag)
@@ -1975,15 +1941,6 @@ reader (void)
   start_flag = 0;
   startval = NULL;             /* start symbol not specified yet. */
 
-#if 0
-  /* initially assume token number translation not needed.  */
-  translations = 0;
-#endif
-  /* Nowadays translations is always set to 1, since we give `error' a
-     user-token-number to satisfy the Posix demand for YYERRCODE==256.
-   */
-  translations = 1;
-
   nsyms = 1;
   nvars = 0;
   nrules = 0;
@@ -1999,11 +1956,11 @@ reader (void)
 
   grammar = NULL;
 
-  init_lex ();
+  lex_init ();
   lineno = 1;
 
-  /* Initialize the macro obstack.  */
-  obstack_init (&macro_obstack);
+  /* Initialize the muscle obstack.  */
+  obstack_init (&muscle_obstack);
 
   /* Initialize the symbol table.  */
   tabinit ();
@@ -2028,18 +1985,14 @@ reader (void)
   readgram ();
   /* Some C code is given at the end of the grammar file. */
   read_additionnal_code ();
+
   /* Now we know whether we need the line-number stack.  If we do,
-     write its type into the .tab.h file.  */
-#if 0
-  if (defines_flag)
-    reader_output_yylsp (&defines_obstack);
-#endif
+     write its type into the .tab.h file.
+     This is no longer need with header skeleton.  */
+
   /* Assign the symbols their symbol numbers.  Write #defines for the
      token symbols into FDEFINES if requested.  */
   packsymbols ();
   /* Convert the grammar into the format described in gram.h.  */
   packgram ();
-  /* Free the symbol table data structure since symbols are now all
-     referred to by symbol number.  */
-  free_symtab ();
 }