X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/41d7a5f24d5e69bdf6ce10c012d50b89ce1e3957..d0ee410565c9d7bc876af42583ee092568f44fa8:/src/print-xml.c diff --git a/src/print-xml.c b/src/print-xml.c index be6bb56a..da8bfcab 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,34 @@ 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 (report_flag & report_lookahead_tokens + && 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, ""); } @@ -418,8 +429,9 @@ print_grammar (FILE *out, int level) item_number *rhsp; xml_printf (out, level + 2, - "", - i, xml_escape (tag)); + "", + token_translations[i], i, xml_escape (tag)); for (r = 0; r < nrules; r++) for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) @@ -454,7 +466,7 @@ print_grammar (FILE *out, int level) } xml_printf (out, level + 2, - "", + "", i, xml_escape (tag)); if (left_count > 0) @@ -491,12 +503,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 +519,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 +528,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 +559,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 +590,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 +610,8 @@ print_xml (void) xml_puts (out, 0, ""); + free (escape_bufs[0].ptr); + free (escape_bufs[1].ptr); + xfclose (out); }