X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/680e8701b5ad9718f18f1493e30134b52bceaaca..ec3bc39:/src/gram.c

diff --git a/src/gram.c b/src/gram.c
index 2d005048..de5a217c 100644
--- a/src/gram.c
+++ b/src/gram.c
@@ -21,14 +21,15 @@
 
 #include "system.h"
 #include "quotearg.h"
-#include "gram.h"
 #include "symtab.h"
+#include "gram.h"
+#include "reduce.h"
 #include "reader.h"
 
 /* comments for these variables are in gram.h  */
 
-short *ritem = NULL;
-int nritems = 0;
+item_number_t *ritem = NULL;
+unsigned int nritems = 0;
 
 rule_t *rules = NULL;
 int nrules = 0;
@@ -40,16 +41,12 @@ int nvars = 0;
 
 token_number_t *token_translations = NULL;
 
-int start_symbol = 0;
+token_number_t start_symbol = 0;
 
 int max_user_token_number = 256;
 
-int semantic_parser = 0;
-
 int pure_parser = 0;
 
-int error_token_number = 0;
-
 
 /*--------------------------------------.
 | Return the number of symbols in RHS.  |
@@ -59,7 +56,7 @@ int
 rule_rhs_length (rule_t *rule)
 {
   int res = 0;
-  short *rhsp;
+  item_number_t *rhsp;
   for (rhsp = rule->rhs; *rhsp >= 0; ++rhsp)
     ++res;
   return res;
@@ -73,7 +70,7 @@ rule_rhs_length (rule_t *rule)
 void
 ritem_print (FILE *out)
 {
-  int i;
+  unsigned int i;
   fputs ("RITEM\n", out);
   for (i = 0; i < nritems; ++i)
     if (ritem[i] >= 0)
@@ -104,3 +101,72 @@ ritem_longest_rhs (void)
 
   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");
+}
+
+
+void
+grammar_free (void)
+{
+  XFREE (ritem);
+  free (rules + 1);
+  XFREE (token_translations);
+  /* Free the symbol table data structure.  */
+  symbols_free ();
+}