]> git.saurik.com Git - bison.git/blobdiff - src/reader.c
(add_param): New function.
[bison.git] / src / reader.c
index ea6d27c5384856b6aff09e66b4e1c86149bf3ada..02d98b364c1480acea69645bac74127ddf57fb9c 100644 (file)
@@ -1,4 +1,4 @@
-/* Input parser for bison
+/* Input parser for Bison
    Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
@@ -69,13 +69,10 @@ prologue_augment (const char *prologue, location_t location)
   struct obstack *oout =
     !typed ? &pre_prologue_obstack : &post_prologue_obstack;
 
-  if (!no_lines_flag)
-    {
-      obstack_fgrow2 (oout, muscle_find ("linef"),
-                     location.first_line,
-                     quotearg_style (c_quoting_style,
-                                     muscle_find ("filename")));
-    }
+  obstack_fgrow1 (oout, "]b4_syncline([[%d]], [[",
+                 location.first_line);
+  MUSCLE_OBSTACK_SGROW (oout, quotearg_style (c_quoting_style, location.file));
+  obstack_sgrow (oout, "]])[\n");
   obstack_sgrow (oout, prologue);
 }
 
@@ -87,32 +84,32 @@ prologue_augment (const char *prologue, location_t location)
 `----------------------*/
 
 void
-epilogue_set (const char *epilogue, location_t location)
+epilogue_augment (const char *epilogue, location_t location)
 {
-  if (!no_lines_flag)
-    {
-      obstack_fgrow2 (&muscle_obstack, muscle_find ("linef"),
-                     location.first_line,
-                     quotearg_style (c_quoting_style,
-                                     muscle_find ("filename")));
-    }
+  char *extension = NULL;
+  obstack_fgrow1 (&muscle_obstack, "]b4_syncline([[%d]], [[",
+                 location.first_line);
+  MUSCLE_OBSTACK_SGROW (&muscle_obstack,
+                       quotearg_style (c_quoting_style, location.file));
+  obstack_sgrow (&muscle_obstack, "]])[\n");
   obstack_sgrow (&muscle_obstack, epilogue);
   obstack_1grow (&muscle_obstack, 0);
-  muscle_insert ("epilogue", obstack_finish (&muscle_obstack));
+  extension = obstack_finish (&muscle_obstack);
+  muscle_grow ("epilogue", extension, "");
+  obstack_free (&muscle_obstack, extension);
 }
 
 
 \f
 
- /*-------------------------------------------------------------------.
+/*-------------------------------------------------------------------.
 | Return the merger index for a merging function named NAME, whose   |
 | arguments have type TYPE.  Records the function, if new, in        |
-| merger_list.                                                      |
+| MERGER_LIST.                                                      |
 `-------------------------------------------------------------------*/
 
 static int
-get_merge_function (const char* name, const char* type,
-                   location_t loc)
+get_merge_function (struniq_t name, struniq_t type, location_t loc)
 {
   merger_list *syms;
   merger_list head;
@@ -122,23 +119,23 @@ get_merge_function (const char* name, const char* type,
     return 0;
 
   if (type == NULL)
-    type = "";
+    type = struniq_new ("");
 
   head.next = merge_functions;
   for (syms = &head, n = 1; syms->next != NULL; syms = syms->next, n += 1)
-    if (strcmp (name, syms->next->name) == 0)
+    if (STRUNIQ_EQ (name, syms->next->name))
       break;
   if (syms->next == NULL)
     {
       syms->next = XMALLOC (merger_list, 1);
-      syms->next->name = xstrdup (name);
-      syms->next->type = xstrdup (type);
+      syms->next->name = struniq_new (name);
+      syms->next->type = struniq_new (type);
       syms->next->next = NULL;
       merge_functions = head.next;
     }
-  else if (strcmp (type, syms->next->type) != 0)
-    warn_at (loc, _("result type clash (`%s' `%s') on merge function %s"),
-            type, syms->next->type, name);
+  else if (!STRUNIQ_EQ (type, syms->next->type))
+    warn_at (loc, _("result type clash on merge function %s: <%s> != <%s>"),
+            name, type, syms->next->type);
   return n;
 }
 
@@ -262,9 +259,9 @@ grammar_current_rule_check (void)
   if (first_rhs)
     {
       const char *rhs_type = first_rhs->type_name ? first_rhs->type_name : "";
-      if (strcmp (lhs_type, rhs_type))
+      if (!STRUNIQ_EQ (lhs_type, rhs_type))
        complain_at (current_rule->location,
-                    _("type clash (`%s' `%s') on default action"),
+                    _("type clash on default action: <%s> != <%s>"),
                     lhs_type, rhs_type);
     }
   /* Warn if there is no default for $$ but we need one.  */
@@ -363,7 +360,7 @@ grammar_current_rule_dprec_set (int dprec, location_t location)
    rule. */
 
 void
-grammar_current_rule_merge_set (const char* name, location_t location)
+grammar_current_rule_merge_set (struniq_t name, location_t location)
 {
   if (! glr_parser)
     warn_at (location, _("%s affects only GLR parsers"), "%merge");
@@ -455,7 +452,8 @@ packgram (void)
        p = p->next;
     }
 
-  assert (itemno == nritems);
+  if (itemno != nritems)
+    abort ();
 
   if (trace_flag & trace_sets)
     ritem_print (stderr);
@@ -471,8 +469,6 @@ packgram (void)
 void
 reader (void)
 {
-  gram_control_t gram_control;
-
   /* Initialize the symbol table.  */
   symbols_new ();
 
@@ -496,13 +492,13 @@ reader (void)
   obstack_init (&pre_prologue_obstack);
   obstack_init (&post_prologue_obstack);
 
-  finput = xfopen (infile, "r");
+  finput = xfopen (grammar_file, "r");
   gram_in = finput;
 
   gram__flex_debug = trace_flag & trace_scan;
   gram_debug = trace_flag & trace_parse;
   scanner_initialize ();
-  gram_parse (&gram_control);
+  gram_parse ();
 
   /* If something went wrong during the parsing, don't try to
      continue.  */
@@ -542,11 +538,8 @@ reader (void)
     grammar = p;
   }
 
-  if (SYMBOL_NUMBER_MAX < nsyms)
-    fatal (_("too many symbols (tokens plus nonterminals); maximum %d"),
-          SYMBOL_NUMBER_MAX);
-
-  assert (nsyms == ntokens + nvars);
+  if (! (nsyms <= SYMBOL_NUMBER_MAX && nsyms == ntokens + nvars))
+    abort ();
 
   xfclose (finput);