]> git.saurik.com Git - bison.git/blobdiff - src/gram.c
* src/symtab.h, src/symtab.c (symbol_t): printer and
[bison.git] / src / gram.c
index 3fc03d0e09600cd9f24a367a2c3fdea24c79e5b5..c1279282adc8d8f22a0df133a278aa09007c9fab 100644 (file)
 #include "reduce.h"
 #include "reader.h"
 
-/* comments for these variables are in gram.h  */
+/* Comments for these variables are in gram.h.  */
 
 item_number_t *ritem = NULL;
-int nritems = 0;
+unsigned int nritems = 0;
 
 rule_t *rules = NULL;
 int nrules = 0;
@@ -39,9 +39,7 @@ int nsyms = 0;
 int ntokens = 1;
 int nvars = 0;
 
-token_number_t *token_translations = NULL;
-
-token_number_t start_symbol = 0;
+symbol_number_t *token_translations = NULL;
 
 int max_user_token_number = 256;
 
@@ -63,6 +61,39 @@ rule_rhs_length (rule_t *rule)
 }
 
 
+/*-------------------------------.
+| Print this RULE's RHS on OUT.  |
+`-------------------------------*/
+
+void
+rule_rhs_print (rule_t *rule, FILE *out)
+{
+  if (*rule->rhs >= 0)
+    {
+      item_number_t *r;
+      for (r = rule->rhs; *r >= 0; r++)
+       fprintf (out, " %s", symbol_tag_get (symbols[*r]));
+      fputc ('\n', out);
+    }
+  else
+    {
+      fprintf (out, " /* %s */\n", _("empty"));
+    }
+}
+
+
+/*-------------------------.
+| Print this RULE on OUT.  |
+`-------------------------*/
+
+void
+rule_print (rule_t *rule, FILE *out)
+{
+  fprintf (out, "%s:", symbol_tag_get (rule->lhs));
+  rule_rhs_print (rule, out);
+}
+
+
 /*------------------------.
 | Dump RITEM for traces.  |
 `------------------------*/
@@ -70,12 +101,11 @@ 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)
-      fprintf (out, "  %s", quotearg_style (escape_quoting_style,
-                                           symbols[ritem[i]]->tag));
+      fprintf (out, "  %s", symbol_tag_get (symbols[ritem[i]]));
     else
       fprintf (out, "  (rule %d)\n", -ritem[i] - 1);
   fputs ("\n\n", out);
@@ -103,6 +133,60 @@ ritem_longest_rhs (void)
 }
 
 
+/*----------------------------------------------------------------.
+| Print the grammar's rules numbers from BEGIN (inclusive) to END |
+| (exclusive) on OUT under TITLE.                                 |
+`----------------------------------------------------------------*/
+
+static inline void
+blanks_print (unsigned n, FILE *out)
+{
+  for (/* Nothing*/; n > 0; --n)
+    fputc (' ', out);
+}
+
+void
+grammar_rules_partial_print (FILE *out, const char *title,
+                            int begin, int end)
+{
+  int r;
+  symbol_t *last_lhs = NULL;
+
+  /* rule # : LHS -> RHS */
+  fprintf (out, "%s\n\n", title);
+  for (r = begin; r < end; r++)
+    {
+      if (last_lhs && last_lhs != rules[r].lhs)
+       fputc ('\n', out);
+
+      fprintf (out, "  %3d ", r - 1);
+      if (last_lhs != rules[r].lhs)
+       {
+         last_lhs = rules[r].lhs;
+         fprintf (out, "%s:", symbol_tag_get (last_lhs));
+       }
+      else
+       {
+         blanks_print (strlen (symbol_tag_get (last_lhs)), out);
+         fputc ('|', out);
+       }
+      rule_rhs_print (&rules[r], out);
+    }
+  fputs ("\n\n", out);
+}
+
+
+/*------------------------------------------.
+| Print the grammar's useful rules on OUT.  |
+`------------------------------------------*/
+
+void
+grammar_rules_print (FILE *out)
+{
+  grammar_rules_partial_print (out, _("Grammar"), 1, nrules + 1);
+}
+
+
 /*-------------------.
 | Dump the grammar.  |
 `-------------------*/
@@ -123,7 +207,7 @@ grammar_dump (FILE *out, const char *title)
     fprintf (out, "%5d  %5d   %5d  %s\n",
             i,
             symbols[i]->prec, symbols[i]->assoc,
-            quotearg_style (escape_quoting_style, symbols[i]->tag));
+            symbol_tag_get (symbols[i]));
   fprintf (out, "\n\n");
   fprintf (out, "Rules\n-----\n\n");
   fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
@@ -150,12 +234,8 @@ grammar_dump (FILE *out, const char *title)
   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, "%-5d  ", i);
+      rule_print (&rules[i], out);
     }
   fprintf (out, "\n\n");
 }