]> git.saurik.com Git - bison.git/blobdiff - src/conflicts.c
* src/bison.simple: Remove YYERROR_VERBOSE using.
[bison.git] / src / conflicts.c
index 77520ade1ef7446dd3cde57ccf31914216f308ba..b6bacb94cde8d4e9444eb43f6e57e49d540e2c92 100644 (file)
@@ -90,14 +90,14 @@ resolve_sr_conflict (int state, int lookaheadnum)
   unsigned *fp1;
   unsigned *fp2;
   int redprec;
-  errs *errp = (errs *) xcalloc (sizeof (errs) + ntokens * sizeof (short), 1);
+  errs *errp = ERRS_ALLOC (ntokens + 1);
   short *errtokens = errp->errs;
 
   /* find the rule to reduce by to get precedence of reduction  */
-  redprec = rprec[LAruleno[lookaheadnum]];
+  redprec = rule_table[LAruleno[lookaheadnum]].prec;
 
   mask = 1;
-  fp1 = LA + lookaheadnum * tokensetsize;
+  fp1 = LA (lookaheadnum);
   fp2 = lookaheadset;
   for (i = 0; i < ntokens; i++)
     {
@@ -170,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;
-      err_table[state] = (errs *) xcalloc ((unsigned int) i, 1);
+      err_table[state] = ERRS_ALLOC (i + 1);
       bcopy (errp, err_table[state], i);
     }
   else
@@ -182,13 +182,8 @@ resolve_sr_conflict (int state, int lookaheadnum)
 static void
 set_conflicts (int state)
 {
-  int i;
-  int k;
+  int i, j;
   shifts *shiftp;
-  unsigned *fp2;
-  unsigned *fp3;
-  unsigned *fp4;
-  unsigned *fp1;
   int symbol;
 
   if (state_table[state].consistent)
@@ -199,58 +194,41 @@ set_conflicts (int state)
 
   shiftp = state_table[state].shift_table;
   if (shiftp)
-    {
-      k = shiftp->nshifts;
-      for (i = 0; i < k; i++)
-       {
-         symbol = state_table[shiftp->shifts[i]].accessing_symbol;
-         if (ISVAR (symbol))
-           break;
-         SETBIT (lookaheadset, symbol);
-       }
-    }
-
-  k = state_table[state + 1].lookaheads;
-  fp4 = lookaheadset + tokensetsize;
+    for (i = 0; i < shiftp->nshifts; i++)
+      {
+       symbol = state_table[shiftp->shifts[i]].accessing_symbol;
+       if (ISVAR (symbol))
+         break;
+       SETBIT (lookaheadset, symbol);
+      }
 
   /* Loop over all rules which require lookahead in this state.  First
      check for shift-reduce conflict, and try to resolve using
      precedence */
-  for (i = state_table[state].lookaheads; i < k; i++)
-    if (rprec[LAruleno[i]])
-      {
-       fp1 = LA + i * tokensetsize;
-       fp2 = fp1;
-       fp3 = lookaheadset;
-
-       while (fp3 < fp4)
+  for (i = state_table[state].lookaheads;
+       i < state_table[state + 1].lookaheads;
+       ++i)
+    if (rule_table[LAruleno[i]].prec)
+      for (j = 0; j < tokensetsize; ++j)
+       if (LA (i)[j] & lookaheadset[j])
          {
-           if (*fp2++ & *fp3++)
-             {
-               resolve_sr_conflict (state, i);
-               break;
-             }
+           resolve_sr_conflict (state, i);
+           break;
          }
-      }
 
 
   /* Loop over all rules which require lookahead in this state.  Check
      for conflicts not resolved above.  */
-  for (i = state_table[state].lookaheads; i < k; i++)
+  for (i = state_table[state].lookaheads;
+       i < state_table[state + 1].lookaheads;
+       ++i)
     {
-      fp1 = LA + i * tokensetsize;
-      fp2 = fp1;
-      fp3 = lookaheadset;
-
-      while (fp3 < fp4)
-       if (*fp2++ & *fp3++)
+      for (j = 0; j < tokensetsize; ++j)
+       if (LA (i)[j] & lookaheadset[j])
          conflicts[state] = 1;
 
-      fp2 = fp1;
-      fp3 = lookaheadset;
-
-      while (fp3 < fp4)
-       *fp3++ |= *fp2++;
+      for (j = 0; j < tokensetsize; ++j)
+       lookaheadset[j] |= LA (i)[j];
     }
 }
 
@@ -314,7 +292,7 @@ count_sr_conflicts (int state)
 
   for (i = state_table[state].lookaheads; i < k; i++)
     {
-      fp1 = LA + i * tokensetsize;
+      fp1 = LA (i);
       fp2 = lookaheadset;
 
       while (fp2 < fp3)
@@ -366,7 +344,7 @@ count_rr_conflicts (int state)
     return 0;
 
   mask = 1;
-  baseword = LA + m * tokensetsize;
+  baseword = LA (m);
   for (i = 0; i < ntokens; i++)
     {
       unsigned *wordp = baseword;
@@ -461,6 +439,11 @@ conflicts_print (void)
 {
   int i;
 
+  /* 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;
+
   int src_total = 0;
   int rrc_total = 0;
 
@@ -472,35 +455,38 @@ conflicts_print (void)
        rrc_total += count_rr_conflicts (i);
       }
 
+  src_ok = src_total == (expected_conflicts == -1 ? 0 : expected_conflicts);
+
+  /* If there are no RR conflicts, and as many SR conflicts as
+     expected, then there is nothing to report.  */
+  if (!rrc_total && src_ok)
+    return;
+
   /* Report the total number of conflicts on STDERR.  */
-  if (src_total || rrc_total)
+  if (yacc_flag)
     {
-      if (yacc_flag)
-       {
-         /* 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);
-       }
+      /* 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);
     }
 
-  if (expected_conflicts != -1
-      && src_total != expected_conflicts)
+  if (expected_conflicts != -1 && !src_ok)
     {
       complain_message_count++;
-      fprintf (stderr, ngettext ("expected %d shift/reduce conflict",
-                                "expected %d shift/reduce conflicts",
+      fprintf (stderr, ngettext ("expected %d shift/reduce conflict\n",
+                                "expected %d shift/reduce conflicts\n",
                                 expected_conflicts),
               expected_conflicts);
     }
@@ -572,7 +558,7 @@ print_reductions (FILE *out, int state)
     {
       default_rule = LAruleno[m];
 
-      fp1 = LA + m * tokensetsize;
+      fp1 = LA (m);
       fp2 = shiftset;
       fp3 = lookaheadset;
       fp4 = lookaheadset + tokensetsize;
@@ -587,7 +573,8 @@ print_reductions (FILE *out, int state)
        {
          if (mask & *fp3)
            fprintf (out, _("    %-4s\t[reduce using rule %d (%s)]\n"),
-                    tags[i], default_rule, tags[rlhs[default_rule]]);
+                    tags[i], default_rule,
+                    tags[rule_table[default_rule].lhs]);
 
          mask <<= 1;
          if (mask == 0)
@@ -598,7 +585,7 @@ print_reductions (FILE *out, int state)
        }
 
       fprintf (out, _("    $default\treduce using rule %d (%s)\n\n"),
-              default_rule, tags[rlhs[default_rule]]);
+              default_rule, tags[rule_table[default_rule].lhs]);
     }
   else if (n - m >= 1)
     {
@@ -609,7 +596,7 @@ print_reductions (FILE *out, int state)
       if (!nodefault)
        for (i = m; i < n; i++)
          {
-           fp1 = LA + i * tokensetsize;
+           fp1 = LA (i);
            fp2 = shiftset;
            fp3 = lookaheadset;
 
@@ -664,7 +651,7 @@ print_reductions (FILE *out, int state)
        }
 
       mask = 1;
-      fp1 = LA + m * tokensetsize;
+      fp1 = LA (m);
       fp2 = shiftset;
       for (i = 0; i < ntokens; i++)
        {
@@ -687,7 +674,7 @@ print_reductions (FILE *out, int state)
                          rule = LAruleno[j];
                          fprintf (out,
                                   _("    %-4s\treduce using rule %d (%s)\n"),
-                                  tags[i], rule, tags[rlhs[rule]]);
+                                  tags[i], rule, tags[rule_table[rule].lhs]);
                        }
                      else
                        defaulted = 1;
@@ -701,13 +688,13 @@ print_reductions (FILE *out, int state)
                          rule = LAruleno[default_LA];
                          fprintf (out,
                                   _("    %-4s\treduce using rule %d (%s)\n"),
-                                  tags[i], rule, tags[rlhs[rule]]);
+                                  tags[i], rule, tags[rule_table[rule].lhs]);
                          defaulted = 0;
                        }
                      rule = LAruleno[j];
                      fprintf (out,
                               _("    %-4s\t[reduce using rule %d (%s)]\n"),
-                              tags[i], rule, tags[rlhs[rule]]);
+                              tags[i], rule, tags[rule_table[rule].lhs]);
                    }
                }
 
@@ -727,7 +714,7 @@ print_reductions (FILE *out, int state)
 
       if (default_LA >= 0)
        fprintf (out, _("    $default\treduce using rule %d (%s)\n"),
-                default_rule, tags[rlhs[default_rule]]);
+                default_rule, tags[rule_table[default_rule].lhs]);
     }
 }