X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f041e30b91baed171ee7423d89f5bf4361e32777..0ced3098fd97e1483b4ac938bdce99bfc7942539:/src/conflicts.c

diff --git a/src/conflicts.c b/src/conflicts.c
index 57d42d01..44546e1c 100644
--- a/src/conflicts.c
+++ b/src/conflicts.c
@@ -1,6 +1,6 @@
 /* Find and resolve or report look-ahead conflicts for bison,
 
-   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002
+   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -237,9 +237,12 @@ resolve_sr_conflict (state *s, int ruleno, symbol **errors)
 	    }
       }
 
-  /* Some tokens have been explicitly made errors.  Allocate a
-     permanent errs structure for this state, to record them.  */
-  state_errs_set (s, nerrs, errors);
+  if (nerrs)
+    {
+      /* Some tokens have been explicitly made errors.  Allocate a
+	 permanent errs structure for this state, to record them.  */
+      state_errs_set (s, nerrs, errors);
+    }
 
   if (obstack_object_size (&solved_conflicts_obstack))
     {
@@ -277,10 +280,7 @@ set_conflicts (state *s, symbol **errors)
   for (i = 0; i < reds->num; ++i)
     if (reds->rules[i]->prec && reds->rules[i]->prec->prec
 	&& !bitset_disjoint_p (reds->lookaheads[i], lookaheadset))
-      {
-	resolve_sr_conflict (s, i, errors);
-	break;
-      }
+      resolve_sr_conflict (s, i, errors);
 
   /* Loop over all rules which require lookahead in this state.  Check
      for conflicts not resolved above.  */
@@ -304,9 +304,9 @@ conflicts_solve (void)
 {
   state_number i;
   /* List of lookaheads on which we explicitly raise a syntax error.  */
-  symbol **errors = XMALLOC (symbol *, ntokens + 1);
+  symbol **errors = MALLOC (errors, ntokens + 1);
 
-  conflicts = XCALLOC (char, nstates);
+  CALLOC (conflicts, nstates);
   shiftset = bitset_create (ntokens, BITSET_FIXED);
   lookaheadset = bitset_create (ntokens, BITSET_FIXED);
   obstack_init (&solved_conflicts_obstack);
@@ -365,7 +365,7 @@ count_sr_conflicts (state *s)
 +`----------------------------------------------------------------*/
 
 static int
-count_rr_conflicts (state *s, int one_per_token)
+count_rr_conflicts (state *s, bool one_per_token)
 {
   int i;
   reductions *reds = s->reductions;
@@ -387,60 +387,20 @@ count_rr_conflicts (state *s, int one_per_token)
 }
 
 
-/*--------------------------------------------------------------.
-| Return a human readable string which reports shift/reduce and |
-| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM).            |
-`--------------------------------------------------------------*/
-
-static const char *
-conflict_report (int src_num, int rrc_num)
-{
-  static char res[4096];
-  char *cp = res;
-
-  if (src_num >= 1)
-    {
-      sprintf (cp, ngettext ("%d shift/reduce conflict",
-			     "%d shift/reduce conflicts", src_num), src_num);
-      cp += strlen (cp);
-    }
-
-  if (src_num > 0 && rrc_num > 0)
-    {
-      sprintf (cp, " %s ", _("and"));
-      cp += strlen (cp);
-    }
-
-  if (rrc_num >= 1)
-    {
-      sprintf (cp, ngettext ("%d reduce/reduce conflict",
-			     "%d reduce/reduce conflicts", rrc_num), rrc_num);
-      cp += strlen (cp);
-    }
-
-  *cp++ = '\0';
-
-  return res;
-}
-
-
-/*----------------------------------------------------------------.
-| Same as above, but report the number of conflicts a` la POSIX.  |
-`----------------------------------------------------------------*/
+/*--------------------------------------------------------.
+| Report the number of conflicts, using the Yacc format.  |
+`--------------------------------------------------------*/
 
 static void
-conflict_report_yacc (int src_num, int rrc_num)
+conflict_report (FILE *out, int src_num, int rrc_num)
 {
-  /* If invoked with `--yacc', use the output format specified by
-     POSIX.  */
-  fprintf (stderr, _("conflicts: "));
-  if (src_num > 0)
-    fprintf (stderr, _(" %d shift/reduce"), src_num);
-  if (src_num > 0 && rrc_num > 0)
-    fprintf (stderr, ",");
-  if (rrc_num > 0)
-    fprintf (stderr, _(" %d reduce/reduce"), rrc_num);
-  putc ('\n', stderr);
+  if (src_num && rrc_num)
+    fprintf (out, _("conflicts: %d shift/reduce, %d reduce/reduce\n"),
+	     src_num, rrc_num);
+  else if (src_num)
+    fprintf (out, _("conflicts: %d shift/reduce\n"), src_num);
+  else if (rrc_num)
+    fprintf (out, _("conflicts: %d reduce/reduce\n"), rrc_num);
 }
 
 
@@ -458,10 +418,9 @@ conflicts_output (FILE *out)
       state *s = states[i];
       if (conflicts[i])
 	{
-	  fprintf (out, _("State %d contains "), i);
-	  fprintf (out, "%s.\n",
-		   conflict_report (count_sr_conflicts (s),
-				    count_rr_conflicts (s, true)));
+	  fprintf (out, _("State %d "), i);
+	  conflict_report (out, count_sr_conflicts (s),
+			   count_rr_conflicts (s, true));
 	  printed_sth = true;
 	}
     }
@@ -504,7 +463,7 @@ conflicts_print (void)
   /* Is the number of SR conflicts OK?  Either EXPECTED_CONFLICTS is
      not set, and then we want 0 SR, or else it is specified, in which
      case we want equality.  */
-  int src_ok = 0;
+  bool src_ok = false;
 
   int src_total = 0;
   int rrc_total = 0;
@@ -529,16 +488,20 @@ conflicts_print (void)
     return;
 
   /* Report the total number of conflicts on STDERR.  */
-  if (yacc_flag)
-    conflict_report_yacc (src_total, rrc_total);
-  else
-    warn ("%s", conflict_report (src_total, rrc_total));
+  if (! yacc_flag)
+    fprintf (stderr, "%s: ", current_file);
+  conflict_report (stderr, src_total, rrc_total);
 
-  if (expected_conflicts != -1 && !src_ok)
-    complain (ngettext ("expected %d shift/reduce conflict",
+  if (expected_conflicts != -1)
+    {
+      if (! src_ok)
+	warn (ngettext ("expected %d shift/reduce conflict",
 			"expected %d shift/reduce conflicts",
 			expected_conflicts),
 	      expected_conflicts);
+      if (rrc_total)
+	warn (_("expected 0 reduce/reduce conflicts"));
+    }
 }