]> git.saurik.com Git - bison.git/blobdiff - src/conflicts.c
* src/lalr.h (reduction_table, shift_table): Removed arrays, which
[bison.git] / src / conflicts.c
index 2ade63da446361bd94121310005e78965ffd473e..2f213850987ef20341f1b8db0464a7b6731a3c9c 100644 (file)
@@ -1,5 +1,5 @@
 /* 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 Free Software Foundation, Inc.
+   Copyright 1984, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
    02111-1307, USA.  */
 
 #include "system.h"
    02111-1307, USA.  */
 
 #include "system.h"
+#include "complain.h"
 #include "getargs.h"
 #include "getargs.h"
-#include "alloc.h"
 #include "files.h"
 #include "gram.h"
 #include "state.h"
 #include "lalr.h"
 #include "conflicts.h"
 #include "files.h"
 #include "gram.h"
 #include "state.h"
 #include "lalr.h"
 #include "conflicts.h"
+#include "reader.h"
+#include "LR0.h"
 
 
-extern char **tags;
-extern int fixed_outfiles;
+errs **err_table = NULL;
+/* -1 stands for not specified. */
+int expected_conflicts = -1;
+static char *conflicts = NULL;
 
 
-int any_conflicts = 0;
-errs **err_table;
-int expected_conflicts;
-static char *conflicts;
-
-static unsigned *shiftset;
-static unsigned *lookaheadset;
-static int src_total;
-static int rrc_total;
-static int src_count;
-static int rrc_count;
+static unsigned *shiftset = NULL;
+static unsigned *lookaheadset = NULL;
 \f
 
 static inline void
 log_resolution (int state, int LAno, int token, char *resolution)
 {
 \f
 
 static inline void
 log_resolution (int state, int LAno, int token, char *resolution)
 {
-  if (verboseflag)
-    fprintf (foutput,
-            _("\
+  obstack_fgrow4 (&output_obstack,
+                 _("\
 Conflict in state %d between rule %d and token %s resolved as %s.\n"),
 Conflict in state %d between rule %d and token %s resolved as %s.\n"),
-            state, LAruleno[LAno], tags[token], resolution);
+                 state, LAruleno[LAno], tags[token], resolution);
 }
 
 
 }
 
 
@@ -66,7 +60,7 @@ flush_shift (int state, int token)
   shifts *shiftp;
   int k, i;
 
   shifts *shiftp;
   int k, i;
 
-  shiftp = shift_table[state];
+  shiftp = state_table[state].shift_table;
 
   if (shiftp)
     {
 
   if (shiftp)
     {
@@ -74,7 +68,7 @@ flush_shift (int state, int token)
       for (i = 0; i < k; i++)
        {
          if (shiftp->shifts[i]
       for (i = 0; i < k; i++)
        {
          if (shiftp->shifts[i]
-             && token == accessing_symbol[shiftp->shifts[i]])
+             && token == state_table[shiftp->shifts[i]].accessing_symbol)
            (shiftp->shifts[i]) = 0;
        }
     }
            (shiftp->shifts[i]) = 0;
        }
     }
@@ -96,7 +90,7 @@ resolve_sr_conflict (int state, int lookaheadnum)
   unsigned *fp1;
   unsigned *fp2;
   int redprec;
   unsigned *fp1;
   unsigned *fp2;
   int redprec;
-  errs *errp = (errs *) xmalloc (sizeof (errs) + ntokens * sizeof (short));
+  errs *errp = (errs *) xcalloc (sizeof (errs) + ntokens * sizeof (short), 1);
   short *errtokens = errp->errs;
 
   /* find the rule to reduce by to get precedence of reduction  */
   short *errtokens = errp->errs;
 
   /* find the rule to reduce by to get precedence of reduction  */
@@ -132,29 +126,29 @@ resolve_sr_conflict (int state, int lookaheadnum)
 
              switch (sassoc[i])
                {
 
              switch (sassoc[i])
                {
-               case RIGHT_ASSOC:
+               case right_assoc:
                  log_resolution (state, lookaheadnum, i, _("shift"));
                  break;
 
                  log_resolution (state, lookaheadnum, i, _("shift"));
                  break;
 
-               case LEFT_ASSOC:
+               case left_assoc:
                  log_resolution (state, lookaheadnum, i, _("reduce"));
                  break;
 
                  log_resolution (state, lookaheadnum, i, _("reduce"));
                  break;
 
-               case NON_ASSOC:
+               case non_assoc:
                  log_resolution (state, lookaheadnum, i, _("an error"));
                  break;
                }
 
                  log_resolution (state, lookaheadnum, i, _("an error"));
                  break;
                }
 
-             if (sassoc[i] != RIGHT_ASSOC)
+             if (sassoc[i] != right_assoc)
                {
                  *fp2 &= ~mask;        /* flush the shift for this token */
                  flush_shift (state, i);
                }
                {
                  *fp2 &= ~mask;        /* flush the shift for this token */
                  flush_shift (state, i);
                }
-             if (sassoc[i] != LEFT_ASSOC)
+             if (sassoc[i] != left_assoc)
                {
                  *fp1 &= ~mask;        /* flush the reduce for this token */
                }
                {
                  *fp1 &= ~mask;        /* flush the reduce for this token */
                }
-             if (sassoc[i] == NON_ASSOC)
+             if (sassoc[i] == non_assoc)
                {
                  /* Record an explicit error for this token.  */
                  *errtokens++ = i;
                {
                  /* Record an explicit error for this token.  */
                  *errtokens++ = i;
@@ -176,7 +170,7 @@ resolve_sr_conflict (int state, int lookaheadnum)
       /* Some tokens have been explicitly made errors.  Allocate
          a permanent errs structure for this state, to record them.  */
       i = (char *) errtokens - (char *) errp;
       /* Some tokens have been explicitly made errors.  Allocate
          a permanent errs structure for this state, to record them.  */
       i = (char *) errtokens - (char *) errp;
-      err_table[state] = (errs *) xmalloc ((unsigned int) i);
+      err_table[state] = (errs *) xcalloc ((unsigned int) i, 1);
       bcopy (errp, err_table[state], i);
     }
   else
       bcopy (errp, err_table[state], i);
     }
   else
@@ -203,13 +197,13 @@ set_conflicts (int state)
   for (i = 0; i < tokensetsize; i++)
     lookaheadset[i] = 0;
 
   for (i = 0; i < tokensetsize; i++)
     lookaheadset[i] = 0;
 
-  shiftp = shift_table[state];
+  shiftp = state_table[state].shift_table;
   if (shiftp)
     {
       k = shiftp->nshifts;
       for (i = 0; i < k; i++)
        {
   if (shiftp)
     {
       k = shiftp->nshifts;
       for (i = 0; i < k; i++)
        {
-         symbol = accessing_symbol[shiftp->shifts[i]];
+         symbol = state_table[shiftp->shifts[i]].accessing_symbol;
          if (ISVAR (symbol))
            break;
          SETBIT (lookaheadset, symbol);
          if (ISVAR (symbol))
            break;
          SETBIT (lookaheadset, symbol);
@@ -249,13 +243,8 @@ set_conflicts (int state)
       fp3 = lookaheadset;
 
       while (fp3 < fp4)
       fp3 = lookaheadset;
 
       while (fp3 < fp4)
-       {
-         if (*fp2++ & *fp3++)
-           {
-             conflicts[state] = 1;
-             any_conflicts = 1;
-           }
-       }
+       if (*fp2++ & *fp3++)
+         conflicts[state] = 1;
 
       fp2 = fp1;
       fp3 = lookaheadset;
 
       fp2 = fp1;
       fp3 = lookaheadset;
@@ -266,17 +255,15 @@ set_conflicts (int state)
 }
 
 void
 }
 
 void
-initialize_conflicts (void)
+solve_conflicts (void)
 {
   int i;
 
 {
   int i;
 
-  conflicts = NEW2 (nstates, char);
-  shiftset = NEW2 (tokensetsize, unsigned);
-  lookaheadset = NEW2 (tokensetsize, unsigned);
-
-  err_table = NEW2 (nstates, errs *);
+  conflicts = XCALLOC (char, nstates);
+  shiftset = XCALLOC (unsigned, tokensetsize);
+  lookaheadset = XCALLOC (unsigned, tokensetsize);
 
 
-  any_conflicts = 0;
+  err_table = XCALLOC (errs *, nstates);
 
   for (i = 0; i < nstates; i++)
     set_conflicts (i);
 
   for (i = 0; i < nstates; i++)
     set_conflicts (i);
@@ -287,7 +274,7 @@ initialize_conflicts (void)
 | Count the number of shift/reduce conflicts.  |
 `---------------------------------------------*/
 
 | Count the number of shift/reduce conflicts.  |
 `---------------------------------------------*/
 
-static void
+static int
 count_sr_conflicts (int state)
 {
   int i;
 count_sr_conflicts (int state)
 {
   int i;
@@ -299,11 +286,11 @@ count_sr_conflicts (int state)
   unsigned *fp3;
   int symbol;
 
   unsigned *fp3;
   int symbol;
 
-  src_count = 0;
+  int src_count = 0;
 
 
-  shiftp = shift_table[state];
+  shiftp = state_table[state].shift_table;
   if (!shiftp)
   if (!shiftp)
-    return;
+    return 0;
 
   for (i = 0; i < tokensetsize; i++)
     {
 
   for (i = 0; i < tokensetsize; i++)
     {
@@ -316,7 +303,7 @@ count_sr_conflicts (int state)
     {
       if (!shiftp->shifts[i])
        continue;
     {
       if (!shiftp->shifts[i])
        continue;
-      symbol = accessing_symbol[shiftp->shifts[i]];
+      symbol = state_table[shiftp->shifts[i]].accessing_symbol;
       if (ISVAR (symbol))
        break;
       SETBIT (shiftset, symbol);
       if (ISVAR (symbol))
        break;
       SETBIT (shiftset, symbol);
@@ -354,6 +341,8 @@ count_sr_conflicts (int state)
          fp2++;
        }
     }
          fp2++;
        }
     }
+
+  return src_count;
 }
 
 
 }
 
 
@@ -361,33 +350,29 @@ count_sr_conflicts (int state)
 | Count the number of reduce/reduce conflicts.  |
 `----------------------------------------------*/
 
 | Count the number of reduce/reduce conflicts.  |
 `----------------------------------------------*/
 
-static void
+static int
 count_rr_conflicts (int state)
 {
   int i;
 count_rr_conflicts (int state)
 {
   int i;
-  int j;
-  int count;
   unsigned mask;
   unsigned *baseword;
   unsigned mask;
   unsigned *baseword;
-  unsigned *wordp;
-  int m;
-  int n;
 
 
-  rrc_count = 0;
+  int rrc_count = 0;
 
 
-  m = lookaheads[state];
-  n = lookaheads[state + 1];
+  int m = lookaheads[state];
+  int n = lookaheads[state + 1];
 
   if (n - m < 2)
 
   if (n - m < 2)
-    return;
+    return 0;
 
   mask = 1;
   baseword = LA + m * tokensetsize;
   for (i = 0; i < ntokens; i++)
     {
 
   mask = 1;
   baseword = LA + m * tokensetsize;
   for (i = 0; i < ntokens; i++)
     {
-      wordp = baseword;
+      unsigned *wordp = baseword;
 
 
-      count = 0;
+      int count = 0;
+      int j;
       for (j = m; j < n; j++)
        {
          if (mask & *wordp)
       for (j = m; j < n; j++)
        {
          if (mask & *wordp)
@@ -406,89 +391,124 @@ count_rr_conflicts (int state)
          baseword++;
        }
     }
          baseword++;
        }
     }
+
+  return rrc_count;
 }
 
 }
 
-/*----------------------------------------------------------.
-| Output to OUT a human readable report on shift/reduce and |
-| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM).        |
-`----------------------------------------------------------*/
+/*--------------------------------------------------------------.
+| Return a human readable string which reports shift/reduce and |
+| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM).            |
+`--------------------------------------------------------------*/
 
 
-static void
-conflict_report (FILE *out, int src_num, int rrc_num)
+static const char *
+conflict_report (int src_num, int rrc_num)
 {
 {
-  if (src_num == 1)
-    fprintf (out, _(" 1 shift/reduce conflict"));
-  else if (src_num > 1)
-    fprintf (out, _(" %d shift/reduce conflicts"), src_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)
 
   if (src_num > 0 && rrc_num > 0)
-    fprintf (out, _(" and"));
+    {
+      sprintf (cp, " %s ", _("and"));
+      cp += strlen (cp);
+    }
 
 
-  if (rrc_num == 1)
-    fprintf (out, _(" 1 reduce/reduce conflict"));
-  else if (rrc_num > 1)
-    fprintf (out, _(" %d reduce/reduce conflicts"), rrc_num);
+  if (rrc_num >= 1)
+    {
+      sprintf (cp, ngettext ("%d reduce/reduce conflict",
+                            "%d reduce/reduce conflicts", rrc_num), rrc_num);
+      cp += strlen (cp);
+    }
+
+  *cp++ = '.';
+  *cp++ = '\n';
+  *cp++ = '\0';
 
 
-  putc ('.', out);
-  putc ('\n', out);
+  return res;
 }
 
 
 }
 
 
-/*---------------------------------------------.
-| Compute and give a report on the conflicts.  |
-`---------------------------------------------*/
+/*-----------------------------------------------------------.
+| Output the detailed description of states with conflicts.  |
+`-----------------------------------------------------------*/
+
+void
+conflicts_output (FILE *out)
+{
+  int i;
+  for (i = 0; i < nstates; i++)
+    if (conflicts[i])
+      {
+       fprintf (out, _("State %d contains "), i);
+       fputs (conflict_report (count_sr_conflicts (i),
+                               count_rr_conflicts (i)), out);
+      }
+}
+
+
+/*------------------------------------------.
+| Reporting the total number of conflicts.  |
+`------------------------------------------*/
 
 void
 
 void
-print_conflicts (void)
+conflicts_print (void)
 {
   int i;
 
 {
   int i;
 
-  src_total = 0;
-  rrc_total = 0;
+  int src_total = 0;
+  int rrc_total = 0;
 
 
-  /* Count the total number of conflicts, and if wanted, give a
-     detailed report in FOUTPUT.  */
+  /* Conflicts by state.  */
   for (i = 0; i < nstates; i++)
   for (i = 0; i < nstates; i++)
+    if (conflicts[i])
+      {
+       src_total += count_sr_conflicts (i);
+       rrc_total += count_rr_conflicts (i);
+      }
+
+  /* Report the total number of conflicts on STDERR.  */
+  if (src_total || rrc_total)
     {
     {
-      if (conflicts[i])
+      if (yacc_flag)
        {
        {
-         count_sr_conflicts (i);
-         count_rr_conflicts (i);
-         src_total += src_count;
-         rrc_total += rrc_count;
-
-         if (verboseflag)
-           {
-             fprintf (foutput, _("State %d contains"), i);
-             conflict_report (foutput, src_count, rrc_count);
-           }
+         /* If invoked with `--yacc', use the output format specified by
+            POSIX.  */
+         fprintf (stderr, _("conflicts: "));
+         if (src_total > 0)
+           fprintf (stderr, _(" %d shift/reduce"), src_total);
+         if (src_total > 0 && rrc_total > 0)
+           fprintf (stderr, ",");
+         if (rrc_total > 0)
+           fprintf (stderr, _(" %d reduce/reduce"), rrc_total);
+         putc ('\n', stderr);
+       }
+      else
+       {
+         fprintf (stderr, _("%s contains "), infile);
+         fputs (conflict_report (src_total, rrc_total), stderr);
        }
     }
 
        }
     }
 
-  /* Report the total number of conflicts on STDERR.  */
-  if (fixed_outfiles)
+  if (expected_conflicts != -1
+      && src_total != expected_conflicts)
     {
     {
-      /* If invoked with `--yacc', use the output format specified by
-        POSIX.  */
-      fprintf (stderr, _("conflicts: "));
-      if (src_total > 0)
-       fprintf (stderr, _(" %d shift/reduce"), src_total);
-      if (src_total > 0 && rrc_total > 0)
-       fprintf (stderr, ",");
-      if (rrc_total > 0)
-       fprintf (stderr, _(" %d reduce/reduce"), rrc_total);
-      putc ('\n', stderr);
-    }
-  else
-    {
-      fprintf (stderr, _("%s contains"), infile);
-      conflict_report (stderr, src_total, rrc_total);
+      complain_message_count++;
+      fprintf (stderr, ngettext ("expected %d shift/reduce conflict",
+                                "expected %d shift/reduce conflicts",
+                                expected_conflicts),
+              expected_conflicts);
     }
 }
 
 
 void
     }
 }
 
 
 void
-print_reductions (int state)
+print_reductions (FILE *out, int state)
 {
   int i;
   int j;
 {
   int i;
   int j;
@@ -513,7 +533,7 @@ print_reductions (int state)
   for (i = 0; i < tokensetsize; i++)
     shiftset[i] = 0;
 
   for (i = 0; i < tokensetsize; i++)
     shiftset[i] = 0;
 
-  shiftp = shift_table[state];
+  shiftp = state_table[state].shift_table;
   if (shiftp)
     {
       k = shiftp->nshifts;
   if (shiftp)
     {
       k = shiftp->nshifts;
@@ -521,7 +541,7 @@ print_reductions (int state)
        {
          if (!shiftp->shifts[i])
            continue;
        {
          if (!shiftp->shifts[i])
            continue;
-         symbol = accessing_symbol[shiftp->shifts[i]];
+         symbol = state_table[shiftp->shifts[i]].accessing_symbol;
          if (ISVAR (symbol))
            break;
          /* if this state has a shift for the error token,
          if (ISVAR (symbol))
            break;
          /* if this state has a shift for the error token,
@@ -566,7 +586,7 @@ print_reductions (int state)
       for (i = 0; i < ntokens; i++)
        {
          if (mask & *fp3)
       for (i = 0; i < ntokens; i++)
        {
          if (mask & *fp3)
-           fprintf (foutput, _("    %-4s\t[reduce using rule %d (%s)]\n"),
+           fprintf (out, _("    %-4s\t[reduce using rule %d (%s)]\n"),
                     tags[i], default_rule, tags[rlhs[default_rule]]);
 
          mask <<= 1;
                     tags[i], default_rule, tags[rlhs[default_rule]]);
 
          mask <<= 1;
@@ -577,7 +597,7 @@ print_reductions (int state)
            }
        }
 
            }
        }
 
-      fprintf (foutput, _("    $default\treduce using rule %d (%s)\n\n"),
+      fprintf (out, _("    $default\treduce using rule %d (%s)\n\n"),
               default_rule, tags[rlhs[default_rule]]);
     }
   else if (n - m >= 1)
               default_rule, tags[rlhs[default_rule]]);
     }
   else if (n - m >= 1)
@@ -636,7 +656,7 @@ print_reductions (int state)
            {
              if (!shiftp->shifts[i])
                continue;
            {
              if (!shiftp->shifts[i])
                continue;
-             symbol = accessing_symbol[shiftp->shifts[i]];
+             symbol = state_table[shiftp->shifts[i]].accessing_symbol;
              if (ISVAR (symbol))
                break;
              SETBIT (shiftset, symbol);
              if (ISVAR (symbol))
                break;
              SETBIT (shiftset, symbol);
@@ -665,7 +685,7 @@ print_reductions (int state)
                      if (j != default_LA)
                        {
                          rule = LAruleno[j];
                      if (j != default_LA)
                        {
                          rule = LAruleno[j];
-                         fprintf (foutput,
+                         fprintf (out,
                                   _("    %-4s\treduce using rule %d (%s)\n"),
                                   tags[i], rule, tags[rlhs[rule]]);
                        }
                                   _("    %-4s\treduce using rule %d (%s)\n"),
                                   tags[i], rule, tags[rlhs[rule]]);
                        }
@@ -679,13 +699,13 @@ print_reductions (int state)
                      if (defaulted)
                        {
                          rule = LAruleno[default_LA];
                      if (defaulted)
                        {
                          rule = LAruleno[default_LA];
-                         fprintf (foutput,
+                         fprintf (out,
                                   _("    %-4s\treduce using rule %d (%s)\n"),
                                   tags[i], rule, tags[rlhs[rule]]);
                          defaulted = 0;
                        }
                      rule = LAruleno[j];
                                   _("    %-4s\treduce using rule %d (%s)\n"),
                                   tags[i], rule, tags[rlhs[rule]]);
                          defaulted = 0;
                        }
                      rule = LAruleno[j];
-                     fprintf (foutput,
+                     fprintf (out,
                               _("    %-4s\t[reduce using rule %d (%s)]\n"),
                               tags[i], rule, tags[rlhs[rule]]);
                    }
                               _("    %-4s\t[reduce using rule %d (%s)]\n"),
                               tags[i], rule, tags[rlhs[rule]]);
                    }
@@ -706,20 +726,16 @@ print_reductions (int state)
        }
 
       if (default_LA >= 0)
        }
 
       if (default_LA >= 0)
-       {
-         fprintf (foutput, _("    $default\treduce using rule %d (%s)\n"),
-                  default_rule, tags[rlhs[default_rule]]);
-       }
-
-      putc ('\n', foutput);
+       fprintf (out, _("    $default\treduce using rule %d (%s)\n"),
+                default_rule, tags[rlhs[default_rule]]);
     }
 }
 
 
 void
     }
 }
 
 
 void
-finalize_conflicts (void)
+free_conflicts (void)
 {
 {
-  FREE (conflicts);
-  FREE (shiftset);
-  FREE (lookaheadset);
+  XFREE (conflicts);
+  XFREE (shiftset);
+  XFREE (lookaheadset);
 }
 }