]> git.saurik.com Git - bison.git/blobdiff - src/gram.c
* data/bison.simple (m4_if): Don't output empty enums.
[bison.git] / src / gram.c
index 6368051c686e01259ddbe4a80d7799a44fe8514e..75546603758b7f85cdd0711c89a657b357862e9d 100644 (file)
@@ -1,5 +1,5 @@
 /* Allocate input grammar variables for bison,
 /* Allocate input grammar variables for bison,
-   Copyright 1984, 1986, 1989, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1986, 1989, 2001, 2002 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
 
 #include "system.h"
 
 
 #include "system.h"
+#include "quotearg.h"
+#include "symtab.h"
 #include "gram.h"
 #include "gram.h"
+#include "reduce.h"
 #include "reader.h"
 
 /* comments for these variables are in gram.h  */
 
 #include "reader.h"
 
 /* comments for these variables are in gram.h  */
 
-int nitems;
-int nrules;
-int nsyms;
-int ntokens;
-int nvars;
+item_number_t *ritem = NULL;
+int nritems = 0;
 
 
-short *ritem = NULL;
-int nritems;
+rule_t *rules = NULL;
+int nrules = 0;
 
 
-rule_t *rule_table = NULL;
-short *rprec = NULL;
-short *rprecsym = NULL;
-short *sprec = NULL;
-short *rassoc = NULL;
-short *sassoc = NULL;
-short *token_translations = NULL;
+symbol_t **symbols = NULL;
+int nsyms = 0;
+int ntokens = 1;
+int nvars = 0;
 
 
-int start_symbol;
+token_number_t *token_translations = NULL;
 
 
-int max_user_token_number;
+token_number_t start_symbol = 0;
 
 
-int semantic_parser;
+int max_user_token_number = 256;
 
 
-int pure_parser;
+int pure_parser = 0;
 
 
-int error_token_number;
+
+/*--------------------------------------.
+| Return the number of symbols in RHS.  |
+`--------------------------------------*/
+
+int
+rule_rhs_length (rule_t *rule)
+{
+  int res = 0;
+  item_number_t *rhsp;
+  for (rhsp = rule->rhs; *rhsp >= 0; ++rhsp)
+    ++res;
+  return res;
+}
 
 
 /*------------------------.
 
 
 /*------------------------.
@@ -64,9 +74,10 @@ ritem_print (FILE *out)
   fputs ("RITEM\n", out);
   for (i = 0; i < nritems; ++i)
     if (ritem[i] >= 0)
   fputs ("RITEM\n", out);
   for (i = 0; i < nritems; ++i)
     if (ritem[i] >= 0)
-      fprintf (out, "  %s", tags[ritem[i]]);
+      fprintf (out, "  %s", quotearg_style (escape_quoting_style,
+                                           symbols[ritem[i]]->tag));
     else
     else
-      fprintf (out, "  (rule %d)\n", -ritem[i]);
+      fprintf (out, "  (rule %d)\n", -ritem[i] - 1);
   fputs ("\n\n", out);
 }
 
   fputs ("\n\n", out);
 }
 
@@ -78,23 +89,73 @@ ritem_print (FILE *out)
 size_t
 ritem_longest_rhs (void)
 {
 size_t
 ritem_longest_rhs (void)
 {
-  int length;
-  int max;
+  int max = 0;
   int i;
 
   int i;
 
-  length = 0;
-  max = 0;
-  for (i = 0; i < nritems; ++i)
-    if (ritem[i] >= 0)
-      {
-       length++;
-      }
-    else
-      {
-       if (length > max)
-         max = length;
-       length = 0;
-      }
+  for (i = 1; i < nrules + 1; ++i)
+    {
+      int length = rule_rhs_length (&rules[i]);
+      if (length > max)
+       max = length;
+    }
 
   return max;
 }
 
   return max;
 }
+
+
+/*-------------------.
+| Dump the grammar.  |
+`-------------------*/
+
+void
+grammar_dump (FILE *out, const char *title)
+{
+  int i;
+  item_number_t *r;
+
+  fprintf (out, "%s\n\n", title);
+  fprintf (out,
+          "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
+          ntokens, nvars, nsyms, nrules, nritems);
+  fprintf (out, "Variables\n---------\n\n");
+  fprintf (out, "Value  Sprec  Sassoc  Tag\n");
+  for (i = ntokens; i < nsyms; i++)
+    fprintf (out, "%5d  %5d   %5d  %s\n",
+            i,
+            symbols[i]->prec, symbols[i]->assoc,
+            quotearg_style (escape_quoting_style, symbols[i]->tag));
+  fprintf (out, "\n\n");
+  fprintf (out, "Rules\n-----\n\n");
+  fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
+  for (i = 1; i < nrules + nuseless_productions + 1; i++)
+    {
+      int rhs_count = 0;
+      /* Find the last RHS index in ritems. */
+      for (r = rules[i].rhs; *r >= 0; ++r)
+       ++rhs_count;
+      fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d)   %2d ->",
+              i - 1,
+              rules[i].prec ? rules[i].prec->prec : 0,
+              rules[i].prec ? rules[i].prec->assoc : 0,
+              rules[i].useful,
+              rules[i].rhs - ritem,
+              rules[i].rhs - ritem + rhs_count - 1,
+              rules[i].lhs->number);
+      /* Dumped the RHS. */
+      for (r = rules[i].rhs; *r >= 0; r++)
+       fprintf (out, " %3d", *r);
+      fprintf (out, "  [%d]\n", -(*r) - 1);
+    }
+  fprintf (out, "\n\n");
+  fprintf (out, "Rules interpreted\n-----------------\n\n");
+  for (i = 1; i < nrules + nuseless_productions + 1; i++)
+    {
+      fprintf (out, "%-5d  %s :",
+              i, quotearg_style (escape_quoting_style, rules[i].lhs->tag));
+      for (r = rules[i].rhs; *r >= 0; r++)
+       fprintf (out, " %s",
+                quotearg_style (escape_quoting_style, symbols[*r]->tag));
+      fputc ('\n', out);
+    }
+  fprintf (out, "\n\n");
+}