]> git.saurik.com Git - bison.git/blobdiff - src/print.c
b4_args is more general than only C++.
[bison.git] / src / print.c
index dcf7df3a9941c2561d1fe0a98df1c345dca51b15..ddd76a60ff01e539ce953ce8af950cce5b15f5c8 100644 (file)
@@ -1,26 +1,24 @@
 /* Print information on generated parser, for bison,
 
 /* Print information on generated parser, for bison,
 
-   Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003
+   Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003, 2004, 2005, 2007
    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.
 
-   Bison is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
 
-   Bison is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
+#include <config.h>
 #include "system.h"
 
 #include <bitset.h>
 #include "system.h"
 
 #include <bitset.h>
@@ -38,9 +36,9 @@
 #include "reduce.h"
 #include "state.h"
 #include "symtab.h"
 #include "reduce.h"
 #include "state.h"
 #include "symtab.h"
+#include "tables.h"
 
 
-static bitset shiftset;
-static bitset lookaheadset;
+static bitset no_reduce_set;
 
 #if 0
 static void
 
 #if 0
 static void
@@ -71,9 +69,9 @@ max_length (size_t *width, const char *str)
 static void
 print_core (FILE *out, state *s)
 {
 static void
 print_core (FILE *out, state *s)
 {
-  int i;
+  size_t i;
   item_number *sitems = s->items;
   item_number *sitems = s->items;
-  int snritems = s->nitems;
+  size_t snritems = s->nitems;
   symbol *previous_lhs = NULL;
 
   /* Output all the items of a state, not only its kernel.  */
   symbol *previous_lhs = NULL;
 
   /* Output all the items of a state, not only its kernel.  */
@@ -81,7 +79,7 @@ print_core (FILE *out, state *s)
     {
       closure (sitems, snritems);
       sitems = itemset;
     {
       closure (sitems, snritems);
       sitems = itemset;
-      snritems = nritemset;
+      snritems = nitemset;
     }
 
   if (!snritems)
     }
 
   if (!snritems)
@@ -111,9 +109,10 @@ print_core (FILE *out, state *s)
       for (/* Nothing */; *sp >= 0; ++sp)
        fprintf (out, " %s", symbols[*sp]->tag);
 
       for (/* Nothing */; *sp >= 0; ++sp)
        fprintf (out, " %s", symbols[*sp]->tag);
 
-      /* Display the lookaheads?  */
-      if (report_flag & report_lookaheads)
-       state_rule_lookaheads_print (s, &rules[r], out);
+      /* Display the lookahead tokens?  */
+      if (report_flag & report_lookahead_tokens
+          && item_number_is_rule_number (*sp1))
+       state_rule_lookahead_tokens_print (s, &rules[r], out);
 
       fputc ('\n', out);
     }
 
       fputc ('\n', out);
     }
@@ -132,7 +131,7 @@ print_transitions (state *s, FILE *out, bool display_transitions_p)
   size_t width = 0;
   int i;
 
   size_t width = 0;
   int i;
 
-  /* Compute the width of the lookaheads column.  */
+  /* Compute the width of the lookahead token column.  */
   for (i = 0; i < trans->num; i++)
     if (!TRANSITION_IS_DISABLED (trans, i)
        && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
   for (i = 0; i < trans->num; i++)
     if (!TRANSITION_IS_DISABLED (trans, i)
        && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
@@ -148,7 +147,7 @@ print_transitions (state *s, FILE *out, bool display_transitions_p)
   fputc ('\n', out);
   width += 2;
 
   fputc ('\n', out);
   width += 2;
 
-  /* Report lookaheads and shifts.  */
+  /* Report lookahead tokens and shifts.  */
   for (i = 0; i < trans->num; i++)
     if (!TRANSITION_IS_DISABLED (trans, i)
        && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
   for (i = 0; i < trans->num; i++)
     if (!TRANSITION_IS_DISABLED (trans, i)
        && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
@@ -180,7 +179,7 @@ print_errs (FILE *out, state *s)
   size_t width = 0;
   int i;
 
   size_t width = 0;
   int i;
 
-  /* Compute the width of the lookaheads column.  */
+  /* Compute the width of the lookahead token column.  */
   for (i = 0; i < errp->num; ++i)
     if (errp->symbols[i])
       max_length (&width, errp->symbols[i]->tag);
   for (i = 0; i < errp->num; ++i)
     if (errp->symbols[i])
       max_length (&width, errp->symbols[i]->tag);
@@ -192,7 +191,7 @@ print_errs (FILE *out, state *s)
   fputc ('\n', out);
   width += 2;
 
   fputc ('\n', out);
   width += 2;
 
-  /* Report lookaheads and errors.  */
+  /* Report lookahead tokens and errors.  */
   for (i = 0; i < errp->num; ++i)
     if (errp->symbols[i])
       {
   for (i = 0; i < errp->num; ++i)
     if (errp->symbols[i])
       {
@@ -206,85 +205,20 @@ print_errs (FILE *out, state *s)
 }
 
 
 }
 
 
-/*-------------------------------------------------------------.
-| Return the default rule of S if it has one, NULL otherwise.  |
-`-------------------------------------------------------------*/
-
-static rule *
-state_default_rule (state *s)
-{
-  reductions *reds = s->reductions;
-  rule *default_rule = NULL;
-  int cmax = 0;
-  int i;
-
-  /* No need for a lookahead.  */
-  if (s->consistent)
-    return reds->rules[0];
-
-  /* 1. Each reduction is possibly masked by the lookaheads on which
-     we shift (S/R conflicts)...  */
-  bitset_zero (shiftset);
-  {
-    transitions *trans = s->transitions;
-    FOR_EACH_SHIFT (trans, i)
-      {
-       /* If this state has a shift for the error token, don't use a
-            default rule.  */
-       if (TRANSITION_IS_ERROR (trans, i))
-         return NULL;
-       bitset_set (shiftset, TRANSITION_SYMBOL (trans, i));
-      }
-  }
-
-  /* 2. Each reduction is possibly masked by the lookaheads on which
-     we raise an error (due to %nonassoc).  */
-  {
-    errs *errp = s->errs;
-    for (i = 0; i < errp->num; i++)
-      if (errp->symbols[i])
-       bitset_set (shiftset, errp->symbols[i]->number);
-  }
-
-  for (i = 0; i < reds->num; ++i)
-    {
-      int count = 0;
-
-      /* How many non-masked lookaheads are there for this reduction?
-        */
-      bitset_andn (lookaheadset, reds->lookaheads[i], shiftset);
-      count = bitset_count (lookaheadset);
-
-      if (count > cmax)
-       {
-         cmax = count;
-         default_rule = reds->rules[i];
-       }
-
-      /* 3. And finally, each reduction is possibly masked by previous
-        reductions (in R/R conflicts, we keep the first reductions).
-        */
-      bitset_or (shiftset, shiftset, reds->lookaheads[i]);
-    }
-
-  return default_rule;
-}
-
-
-/*--------------------------------------------------------------------.
-| Report a reduction of RULE on LOOKAHEADS (which can be `default').  |
-| If not ENABLED, the rule is masked by a shift or a reduce (S/R and  |
-| R/R conflicts).                                                     |
-`--------------------------------------------------------------------*/
+/*-------------------------------------------------------------------------.
+| Report a reduction of RULE on LOOKAHEAD_TOKEN (which can be `default').  |
+| If not ENABLED, the rule is masked by a shift or a reduce (S/R and       |
+| R/R conflicts).                                                          |
+`-------------------------------------------------------------------------*/
 
 static void
 print_reduction (FILE *out, size_t width,
 
 static void
 print_reduction (FILE *out, size_t width,
-                const char *lookahead,
+                const char *lookahead_token,
                 rule *r, bool enabled)
 {
   int j;
                 rule *r, bool enabled)
 {
   int j;
-  fprintf (out, "    %s", lookahead);
-  for (j = width - strlen (lookahead); j > 0; --j)
+  fprintf (out, "    %s", lookahead_token);
+  for (j = width - strlen (lookahead_token); j > 0; --j)
     fputc (' ', out);
   if (!enabled)
     fputc ('[', out);
     fputc (' ', out);
   if (!enabled)
     fputc ('[', out);
@@ -314,29 +248,33 @@ print_reductions (FILE *out, state *s)
   if (reds->num == 0)
     return;
 
   if (reds->num == 0)
     return;
 
-  default_rule = state_default_rule (s);
+  if (yydefact[s->number] != 0)
+    default_rule = &rules[yydefact[s->number] - 1];
 
 
-  bitset_zero (shiftset);
+  bitset_zero (no_reduce_set);
   FOR_EACH_SHIFT (trans, i)
   FOR_EACH_SHIFT (trans, i)
-    bitset_set (shiftset, TRANSITION_SYMBOL (trans, i));
+    bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i));
+  for (i = 0; i < s->errs->num; ++i)
+    if (s->errs->symbols[i])
+      bitset_set (no_reduce_set, s->errs->symbols[i]->number);
 
 
-  /* Compute the width of the lookaheads column.  */
+  /* Compute the width of the lookahead token column.  */
   if (default_rule)
     width = strlen (_("$default"));
 
   if (default_rule)
     width = strlen (_("$default"));
 
-  if (reds->lookaheads)
+  if (reds->lookahead_tokens)
     for (i = 0; i < ntokens; i++)
       {
     for (i = 0; i < ntokens; i++)
       {
-       int count = bitset_test (shiftset, i);
+       bool count = bitset_test (no_reduce_set, i);
 
        for (j = 0; j < reds->num; ++j)
 
        for (j = 0; j < reds->num; ++j)
-         if (bitset_test (reds->lookaheads[j], i))
+         if (bitset_test (reds->lookahead_tokens[j], i))
            {
            {
-             if (count == 0)
+             if (! count)
                {
                  if (reds->rules[j] != default_rule)
                    max_length (&width, symbols[i]->tag);
                {
                  if (reds->rules[j] != default_rule)
                    max_length (&width, symbols[i]->tag);
-                 count++;
+                 count = true;
                }
              else
                {
                }
              else
                {
@@ -352,25 +290,25 @@ print_reductions (FILE *out, state *s)
   fputc ('\n', out);
   width += 2;
 
   fputc ('\n', out);
   width += 2;
 
-  /* Report lookaheads (or $default) and reductions.  */
-  if (reds->lookaheads)
+  /* Report lookahead tokens (or $default) and reductions.  */
+  if (reds->lookahead_tokens)
     for (i = 0; i < ntokens; i++)
       {
     for (i = 0; i < ntokens; i++)
       {
-       int defaulted = 0;
-       int count = bitset_test (shiftset, i);
+       bool defaulted = false;
+       bool count = bitset_test (no_reduce_set, i);
 
        for (j = 0; j < reds->num; ++j)
 
        for (j = 0; j < reds->num; ++j)
-         if (bitset_test (reds->lookaheads[j], i))
+         if (bitset_test (reds->lookahead_tokens[j], i))
            {
            {
-             if (count == 0)
+             if (! count)
                {
                  if (reds->rules[j] != default_rule)
                    print_reduction (out, width,
                                     symbols[i]->tag,
                                     reds->rules[j], true);
                  else
                {
                  if (reds->rules[j] != default_rule)
                    print_reduction (out, width,
                                     symbols[i]->tag,
                                     reds->rules[j], true);
                  else
-                   defaulted = 1;
-                 count++;
+                   defaulted = true;
+                 count = true;
                }
              else
                {
                }
              else
                {
@@ -378,7 +316,7 @@ print_reductions (FILE *out, state *s)
                    print_reduction (out, width,
                                     symbols[i]->tag,
                                     default_rule, true);
                    print_reduction (out, width,
                                     symbols[i]->tag,
                                     default_rule, true);
-                 defaulted = 0;
+                 defaulted = false;
                  print_reduction (out, width,
                                   symbols[i]->tag,
                                   reds->rules[j], false);
                  print_reduction (out, width,
                                   symbols[i]->tag,
                                   reds->rules[j], false);
@@ -464,7 +402,7 @@ print_grammar (FILE *out)
        buffer[0] = 0;
        column = strlen (tag);
        fputs (tag, out);
        buffer[0] = 0;
        column = strlen (tag);
        fputs (tag, out);
-       END_TEST (50);
+       END_TEST (65);
        sprintf (buffer, " (%d)", i);
 
        for (r = 0; r < nrules; r++)
        sprintf (buffer, " (%d)", i);
 
        for (r = 0; r < nrules; r++)
@@ -508,14 +446,16 @@ print_grammar (FILE *out)
 
       if (left_count > 0)
        {
 
       if (left_count > 0)
        {
-         END_TEST (50);
+         END_TEST (65);
          sprintf (buffer + strlen (buffer), _(" on left:"));
 
          for (r = 0; r < nrules; r++)
            {
          sprintf (buffer + strlen (buffer), _(" on left:"));
 
          for (r = 0; r < nrules; r++)
            {
-             END_TEST (65);
              if (rules[r].lhs->number == i)
              if (rules[r].lhs->number == i)
-               sprintf (buffer + strlen (buffer), " %d", r);
+               {
+                 END_TEST (65);
+                 sprintf (buffer + strlen (buffer), " %d", r);
+               }
            }
        }
 
            }
        }
 
@@ -523,7 +463,7 @@ print_grammar (FILE *out)
        {
          if (left_count > 0)
            sprintf (buffer + strlen (buffer), ",");
        {
          if (left_count > 0)
            sprintf (buffer + strlen (buffer), ",");
-         END_TEST (50);
+         END_TEST (65);
          sprintf (buffer + strlen (buffer), _(" on right:"));
          for (r = 0; r < nrules; r++)
            {
          sprintf (buffer + strlen (buffer), _(" on right:"));
          for (r = 0; r < nrules; r++)
            {
@@ -552,7 +492,8 @@ print_results (void)
 
   reduce_output (out);
   grammar_rules_partial_print (out,
 
   reduce_output (out);
   grammar_rules_partial_print (out,
-                              _("Rules never reduced"), rule_never_reduced_p);
+                              _("Rules useless in parser due to conflicts"),
+                                 rule_useless_in_parser_p);
   conflicts_output (out);
 
   print_grammar (out);
   conflicts_output (out);
 
   print_grammar (out);
@@ -562,12 +503,10 @@ print_results (void)
   if (report_flag & report_itemsets)
     new_closure (nritems);
   /* Storage for print_reductions.  */
   if (report_flag & report_itemsets)
     new_closure (nritems);
   /* Storage for print_reductions.  */
-  shiftset =  bitset_create (ntokens, BITSET_FIXED);
-  lookaheadset = bitset_create (ntokens, BITSET_FIXED);
+  no_reduce_set =  bitset_create (ntokens, BITSET_FIXED);
   for (i = 0; i < nstates; i++)
     print_state (out, states[i]);
   for (i = 0; i < nstates; i++)
     print_state (out, states[i]);
-  bitset_free (shiftset);
-  bitset_free (lookaheadset);
+  bitset_free (no_reduce_set);
   if (report_flag & report_itemsets)
     free_closure ();
 
   if (report_flag & report_itemsets)
     free_closure ();