]> git.saurik.com Git - bison.git/blobdiff - src/conflicts.c
* data/yacc.c: (b4_lex_param): Corrected for the case where
[bison.git] / src / conflicts.c
index 0c2fb03c38c1bd539bd2df8cd37ad77f635c6d86..fe1f6f9f6b211251be79ed24e262c1bcfa278831 100644 (file)
@@ -1,6 +1,6 @@
 /* Find and resolve or report look-ahead conflicts for bison,
 
 /* 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.
    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))
     {
 
   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))
   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.  */
 
   /* Loop over all rules which require lookahead in this state.  Check
      for conflicts not resolved above.  */
@@ -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
 
 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])
        {
       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;
        }
     }
          printed_sth = true;
        }
     }
@@ -529,20 +488,19 @@ conflicts_print (void)
     return;
 
   /* Report the total number of conflicts on STDERR.  */
     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)
     {
       if (! src_ok)
 
   if (expected_conflicts != -1)
     {
       if (! src_ok)
-       complain (ngettext ("expected %d shift/reduce conflict",
-                           "expected %d shift/reduce conflicts",
-                           expected_conflicts),
-                 expected_conflicts);
+       warn (ngettext ("expected %d shift/reduce conflict",
+                       "expected %d shift/reduce conflicts",
+                       expected_conflicts),
+             expected_conflicts);
       if (rrc_total)
       if (rrc_total)
-       complain (_("expected 0 reduce/reduce conflicts"));
+       warn (_("expected 0 reduce/reduce conflicts"));
     }
 }
 
     }
 }