X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/ad5feac4e2cd16569d8586f2eac6a9efeeadc038..a924ef368d861a0593285ac9640837b9080f29ca:/src/print-xml.c?ds=sidebyside
diff --git a/src/print-xml.c b/src/print-xml.c
index cde23665..cb6707da 100644
--- a/src/print-xml.c
+++ b/src/print-xml.c
@@ -43,36 +43,13 @@
 #include "tables.h"
 
 static bitset no_reduce_set;
-
-
-/*----------------------------.
-| Print rules never reduced.  |
-`-----------------------------*/
-
-static void
-print_rules_never_reduced (FILE *out, int level)
+struct escape_buf
 {
-  rule_number r;
-  bool count = false;
-
-  for (r = 0; r < nrules + nuseless_productions; r++)
-    {
-      if (rule_never_reduced_p (&rules[r]))
-	{
-	  count = true;
-	  break;
-	}
-    }
+  char *ptr;
+  size_t size;
+};
+static struct escape_buf escape_bufs[2];
 
-  if (count) {
-    xml_puts (out, level, "");
-    grammar_rules_partial_print_xml (out, level - 1,
-				     false, rule_never_reduced_p);
-    xml_puts (out, level, "");
-  }
-  else
-    xml_puts (out, level, "");
-}
 
 /*--------------------------------.
 | Report information on a state.  |
@@ -86,12 +63,9 @@ print_core (FILE *out, int level, state *s)
   size_t snritems = s->nitems;
 
   /* Output all the items of a state, not only its kernel.  */
-  if (report_flag & report_itemsets)
-    {
-      closure (sitems, snritems);
-      sitems = itemset;
-      snritems = nitemset;
-    }
+  closure (sitems, snritems);
+  sitems = itemset;
+  snritems = nitemset;
 
   if (!snritems) {
     xml_puts (out, level, "");
@@ -102,6 +76,7 @@ print_core (FILE *out, int level, state *s)
 
   for (i = 0; i < snritems; i++)
     {
+      bool printed = false;
       item_number *sp;
       item_number *sp1;
       rule_number r;
@@ -112,30 +87,33 @@ print_core (FILE *out, int level, state *s)
 	sp++;
 
       r = item_number_as_rule_number (*sp);
-
-      xml_printf (out, level + 1, "",
-		  rules[r].number);
-
-      rule_lhs_print_xml (&rules[r], out, level + 2);
-
-      xml_puts (out, level + 2, "");
-      for (sp = rules[r].rhs; sp < sp1; sp++)
-	xml_printf (out, level + 3, "%s",
-		    symbol_class_get_string (symbols[*sp]),
-		    xml_escape (symbols[*sp]->tag));
-      xml_puts (out, level + 3, "");
-      for (/* Nothing */; *sp >= 0; ++sp)
-	xml_printf (out, level + 3, "%s",
-		    symbol_class_get_string (symbols[*sp]),
-		    xml_escape (symbols[*sp]->tag));
-
-      xml_puts (out, level + 2, "");
+      sp = rules[r].rhs;
 
       /* Display the lookahead tokens?  */
-      if (report_flag & report_lookahead_tokens)
-	state_rule_lookahead_tokens_print_xml (s, &rules[r], out, level + 2);
+      if (item_number_is_rule_number (*sp1))
+	{
+	  reductions *reds = s->reductions;
+	  int red = state_reduction_find (s, &rules[r]);
+	  /* Print item with lookaheads if there are. */
+	  if (reds->lookahead_tokens && red != -1)
+	    {
+	      xml_printf (out, level + 1,
+			  "- ",
+			  rules[r].number, sp1 - sp);
+	      state_rule_lookahead_tokens_print_xml (s, &rules[r],
+						     out, level + 2);
+	      xml_puts (out, level + 1, "");
+	      printed = true;
+	    }
+	}
 
-      xml_puts (out, level + 1, "");
+      if (!printed)
+	{
+	  xml_printf (out, level + 1,
+		      "
- ",
+		      rules[r].number,
+		      sp1 - sp);
+	}
     }
   xml_puts (out, level, "");
 }
@@ -383,7 +361,7 @@ print_state (FILE *out, int level, state *s)
   xml_printf (out, level, "", s->number);
   print_core (out, level + 1, s);
   print_actions (out, level + 1, s);
-  if ((report_flag & report_solved_conflicts) && s->solved_conflicts_xml)
+  if (s->solved_conflicts_xml)
     {
       xml_puts (out, level + 1, "");
       fputs (s->solved_conflicts_xml, out);
@@ -414,89 +392,51 @@ print_grammar (FILE *out, int level)
     if (token_translations[i] != undeftoken->number)
       {
 	char const *tag = symbols[token_translations[i]]->tag;
-	rule_number r;
-	item_number *rhsp;
-
-	xml_printf (out, level + 2,
-		    "",
-		    i, xml_escape (tag));
-
-	for (r = 0; r < nrules; r++)
-	  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-	    if (item_number_as_symbol_number (*rhsp) == token_translations[i])
-	      {
-		xml_printf (out, level + 3, "%d", r);
-		break;
-	      }
-	xml_puts (out, level + 2, "");
+        int precedence = symbols[token_translations[i]]->prec;
+        assoc associativity = symbols[token_translations[i]]->assoc;
+        xml_indent (out, level + 2);
+        fprintf (out,
+                 "\n", out);
       }
   xml_puts (out, level + 1, "");
 
   /* Nonterminals */
   xml_puts (out, level + 1, "");
-  for (i = ntokens; i < nsyms; i++)
+  for (i = ntokens; i < nsyms + nuseless_nonterminals; i++)
     {
-      int left_count = 0, right_count = 0;
-      rule_number r;
       char const *tag = symbols[i]->tag;
-
-      for (r = 0; r < nrules; r++)
-	{
-	  item_number *rhsp;
-	  if (rules[r].lhs->number == i)
-	    left_count++;
-	  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-	    if (item_number_as_symbol_number (*rhsp) == i)
-	      {
-		right_count++;
-		break;
-	      }
-	}
-
       xml_printf (out, level + 2,
-		  "",
-		  i, xml_escape (tag));
-
-      if (left_count > 0)
-	{
-	  xml_puts (out, level + 3, "");
-	  for (r = 0; r < nrules; r++)
-	    {
-	      if (rules[r].lhs->number == i)
-		xml_printf (out, level + 4, "%d", r);
-	    }
-	  xml_puts (out, level + 3, "");
-	}
-
-      if (right_count > 0)
-	{
-	  xml_puts (out, level + 3, "");
-	  for (r = 0; r < nrules; r++)
-	    {
-	      item_number *rhsp;
-	      for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
-		if (item_number_as_symbol_number (*rhsp) == i)
-		  {
-		    xml_printf (out, level + 4, "%d", r);
-		    break;
-		  }
-	    }
-	  xml_puts (out, level + 3, "");
-	}
-
-      xml_puts (out, level + 2, "");
+		  "",
+		  i, xml_escape (tag),
+                  reduce_nonterminal_useless_in_grammar (i)
+                    ? "useless-in-grammar" : "useful");
     }
   xml_puts (out, level + 1, "");
   xml_puts (out, level, "");
 }
 
 void
-xml_puts (FILE *out, int level, char const *s)
+xml_indent (FILE *out, int level)
 {
   int i;
-  level *= 2;
   for (i = 0; i < level; i++)
-    fputc (' ', out);
+    fputs ("  ", out);
+}
+
+void
+xml_puts (FILE *out, int level, char const *s)
+{
+  xml_indent (out, level);
   fputs (s, out);
   fputc ('\n', out);
 }
@@ -504,11 +444,9 @@ xml_puts (FILE *out, int level, char const *s)
 void
 xml_printf (FILE *out, int level, char const *fmt, ...)
 {
-  int i;
   va_list arglist;
 
-  for (i = 0; i < level; i++)
-    fputc (' ', out);
+  xml_indent (out, level);
 
   va_start (arglist, fmt);
   vfprintf (out, fmt, arglist);
@@ -517,12 +455,6 @@ xml_printf (FILE *out, int level, char const *fmt, ...)
   fputc ('\n', out);
 }
 
-struct escape_buf
-{
-  char *ptr;
-  size_t size;
-};
-
 static char const *
 xml_escape_string (struct escape_buf *buf, char const *str)
 {
@@ -554,8 +486,7 @@ xml_escape_string (struct escape_buf *buf, char const *str)
 char const *
 xml_escape_n (int n, char const *str)
 {
-  static struct escape_buf buf[2];
-  return xml_escape_string (buf + n, str);
+  return xml_escape_string (escape_bufs + n, str);
 }
 
 char const *
@@ -580,20 +511,10 @@ print_xml (void)
   xml_printf (out, level + 1, "%s",
 	      xml_escape (grammar_file));
 
-  /* print reductions */
-  reduce_xml (out, level + 1);
-
-  /* print rules never reduced */
-  print_rules_never_reduced (out, level + 1);
-
-  /* print conflicts */
-  conflicts_output_xml (out, level + 1);
-
   /* print grammar */
   print_grammar (out, level + 1);
 
-  if (report_flag & report_itemsets)
-    new_closure (nritems);
+  new_closure (nritems);
   no_reduce_set =  bitset_create (ntokens, BITSET_FIXED);
 
   /* print automaton */
@@ -604,10 +525,12 @@ print_xml (void)
   xml_puts (out, level + 1, "");
 
   bitset_free (no_reduce_set);
-  if (report_flag & report_itemsets)
-    free_closure ();
+  free_closure ();
 
   xml_puts (out, 0, "");
 
+  free (escape_bufs[0].ptr);
+  free (escape_bufs[1].ptr);
+
   xfclose (out);
 }