X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/41d7a5f24d5e69bdf6ce10c012d50b89ce1e3957..4c20d18dc1147ff37726c22ce6987f1201266e83:/src/print-xml.c diff --git a/src/print-xml.c b/src/print-xml.c index be6bb56a..d1535a33 100644 --- a/src/print-xml.c +++ b/src/print-xml.c @@ -43,6 +43,12 @@ #include "tables.h" static bitset no_reduce_set; +struct escape_buf +{ + char *ptr; + size_t size; +}; +static struct escape_buf escape_bufs[2]; /*----------------------------. @@ -102,6 +108,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 +119,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); + { + 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, ""); } @@ -491,12 +501,11 @@ print_grammar (FILE *out, int level) } void -xml_puts (FILE *out, int level, char *s) +xml_puts (FILE *out, int level, char const *s) { int i; - level *= 2; for (i = 0; i < level; i++) - fputc (' ', out); + fputs (" ", out); fputs (s, out); fputc ('\n', out); } @@ -508,7 +517,7 @@ xml_printf (FILE *out, int level, char const *fmt, ...) va_list arglist; for (i = 0; i < level; i++) - fputc (' ', out); + fputs (" ", out); va_start (arglist, fmt); vfprintf (out, fmt, arglist); @@ -517,12 +526,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 +557,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 * @@ -586,9 +588,6 @@ print_xml (void) /* 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); @@ -609,5 +608,8 @@ print_xml (void) xml_puts (out, 0, ""); + free (escape_bufs[0].ptr); + free (escape_bufs[1].ptr); + xfclose (out); }