]> git.saurik.com Git - bison.git/blobdiff - src/gram.c
* GNUmakefile: Update git-version-gen invocation so make dist
[bison.git] / src / gram.c
index 1040f072f2a13238f4d385d3d55a1de2c6346286..6b9eda13b7c4d60df0950388bf27dfeec3919b81 100644 (file)
@@ -1,7 +1,7 @@
 /* Allocate input grammar variables for Bison.
 
-   Copyright (C) 1984, 1986, 1989, 2001, 2002, 2003, 2005, 2006 Free
-   Software Foundation, Inc.
+   Copyright (C) 1984, 1986, 1989, 2001, 2002, 2003, 2005, 2006
+   2007 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -27,6 +27,7 @@
 #include "reader.h"
 #include "reduce.h"
 #include "symtab.h"
+#include "print-xml.h"
 
 /* Comments for these variables are in gram.h.  */
 
@@ -45,46 +46,24 @@ symbol_number *token_translations = NULL;
 
 int max_user_token_number = 256;
 
-/*--------------------------------------------------------------.
-| Return true IFF the rule has a `number' smaller than NRULES.  |
-`--------------------------------------------------------------*/
-
 bool
-rule_useful_p (rule *r)
+rule_useful_in_grammar_p (rule *r)
 {
   return r->number < nrules;
 }
 
-
-/*-------------------------------------------------------------.
-| Return true IFF the rule has a `number' higher than NRULES.  |
-`-------------------------------------------------------------*/
-
 bool
-rule_useless_p (rule *r)
+rule_useless_in_grammar_p (rule *r)
 {
-  return !rule_useful_p (r);
+  return !rule_useful_in_grammar_p (r);
 }
 
-
-/*--------------------------------------------------------------------.
-| Return true IFF the rule is not flagged as useful *and* is useful.  |
-| In other words, it was discarded because of conflicts.              |
-`--------------------------------------------------------------------*/
-
 bool
-rule_never_reduced_p (rule *r)
+rule_useless_in_parser_p (rule *r)
 {
-  return !r->useful && rule_useful_p (r);
+  return !r->useful && rule_useful_in_grammar_p (r);
 }
 
-
-/*----------------------------------------------------------------.
-| Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was |
-| already displayed (by a previous call for another rule), avoid  |
-| useless repetitions.                                            |
-`----------------------------------------------------------------*/
-
 void
 rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out)
 {
@@ -102,10 +81,11 @@ rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out)
     }
 }
 
-
-/*--------------------------------------.
-| Return the number of symbols in RHS.  |
-`--------------------------------------*/
+void
+rule_lhs_print_xml (rule *r, FILE *out, int level)
+{
+  xml_printf (out, level, "<lhs>%s</lhs>", r->lhs->tag);
+}
 
 int
 rule_rhs_length (rule *r)
@@ -117,11 +97,6 @@ rule_rhs_length (rule *r)
   return res;
 }
 
-
-/*-------------------------------.
-| Print this rule's RHS on OUT.  |
-`-------------------------------*/
-
 void
 rule_rhs_print (rule *r, FILE *out)
 {
@@ -138,10 +113,25 @@ rule_rhs_print (rule *r, FILE *out)
     }
 }
 
-
-/*-------------------------.
-| Print this rule on OUT.  |
-`-------------------------*/
+static void
+rule_rhs_print_xml (rule *r, FILE *out, int level)
+{
+  if (*r->rhs >= 0)
+    {
+      item_number *rp;
+      xml_puts (out, level, "<rhs>");
+      for (rp = r->rhs; *rp >= 0; rp++)
+       xml_printf (out, level + 1, "<symbol>%s</symbol>",
+                   xml_escape (symbols[*rp]->tag));
+      xml_puts (out, level, "</rhs>");
+    }
+  else
+    {
+      xml_puts (out, level, "<rhs>");
+      xml_puts (out, level + 1, "<empty/>");
+      xml_puts (out, level, "</rhs>");
+    }
+}
 
 void
 rule_print (rule *r, FILE *out)
@@ -150,11 +140,6 @@ rule_print (rule *r, FILE *out)
   rule_rhs_print (r, out);
 }
 
-
-/*------------------------.
-| Dump RITEM for traces.  |
-`------------------------*/
-
 void
 ritem_print (FILE *out)
 {
@@ -168,11 +153,6 @@ ritem_print (FILE *out)
   fputs ("\n\n", out);
 }
 
-
-/*------------------------------------------.
-| Return the size of the longest rule RHS.  |
-`------------------------------------------*/
-
 size_t
 ritem_longest_rhs (void)
 {
@@ -189,11 +169,6 @@ ritem_longest_rhs (void)
   return max;
 }
 
-
-/*-----------------------------------------------------------------.
-| Print the grammar's rules that match FILTER on OUT under TITLE.  |
-`-----------------------------------------------------------------*/
-
 void
 grammar_rules_partial_print (FILE *out, const char *title,
                             rule_filter filter)
@@ -220,21 +195,47 @@ grammar_rules_partial_print (FILE *out, const char *title,
     fputs ("\n\n", out);
 }
 
-
-/*------------------------------------------.
-| Print the grammar's useful rules on OUT.  |
-`------------------------------------------*/
-
 void
 grammar_rules_print (FILE *out)
 {
-  grammar_rules_partial_print (out, _("Grammar"), rule_useful_p);
+  grammar_rules_partial_print (out, _("Grammar"), rule_useful_in_grammar_p);
 }
 
+void
+grammar_rules_print_xml (FILE *out, int level)
+{
+  rule_number r;
+  bool first = true;
 
-/*-------------------.
-| Dump the grammar.  |
-`-------------------*/
+  for (r = 0; r < nrules + nuseless_productions; r++)
+    {
+      if (first)
+       xml_puts (out, level + 1, "<rules>");
+      first = false;
+      {
+        char const *usefulness;
+        if (rule_useless_in_grammar_p (&rules[r]))
+          usefulness = "useless-in-grammar";
+        else if (rule_useless_in_parser_p (&rules[r]))
+          usefulness = "useless-in-parser";
+        else
+          usefulness = "useful";
+        xml_indent (out, level + 2);
+        fprintf (out, "<rule number=\"%d\" usefulness=\"%s\"",
+                 rules[r].number, usefulness);
+        if (rules[r].precsym)
+          fprintf (out, " percent_prec=\"%s\"", rules[r].precsym->tag);
+        fputs (">\n", out);
+      }
+      rule_lhs_print_xml (&rules[r], out, level + 3);
+      rule_rhs_print_xml (&rules[r], out, level + 3);
+      xml_puts (out, level + 2, "</rule>");
+    }
+  if (!first)
+    xml_puts (out, level + 1, "</rules>");
+  else
+   xml_puts (out, level + 1, "<rules/>");
+}
 
 void
 grammar_dump (FILE *out, const char *title)
@@ -299,16 +300,8 @@ grammar_dump (FILE *out, const char *title)
   fprintf (out, "\n\n");
 }
 
-
-/*------------------------------------------------------------------.
-| Report on STDERR the rules that are not flagged USEFUL, using the |
-| MESSAGE (which can be `useless rule' when invoked after grammar   |
-| reduction, or `never reduced' after conflicts were taken into     |
-| account).                                                         |
-`------------------------------------------------------------------*/
-
 void
-grammar_rules_never_reduced_report (const char *message)
+grammar_rules_useless_report (const char *message)
 {
   rule_number r;
   for (r = 0; r < nrules ; ++r)