diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2007-09-21 22:53:58 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2007-09-21 22:53:58 +0000 |
commit | 41d7a5f24d5e69bdf6ce10c012d50b89ce1e3957 (patch) | |
tree | f7a1bd6489acc3a3c16c3f5aacda7c595356a100 /src/conflicts.c | |
parent | 6d8e724de2f64116a2d2684fe2f84e4d02b5809b (diff) | |
download | bison-41d7a5f24d5e69bdf6ce10c012d50b89ce1e3957.tar.gz |
* src/gram.c (rule_rhs_print_xml): Now static, since it isn't used
elsewhere.
* src/print-xml.c: Prefer "const" after types; that's more consistent.
(xml_printf): Indent just 1 space for level.
(e_char, xlate_char): Remove.
(xml_escape_string): Rewrite to avoid undefined behavior (used
storage that was freed from the stack).
(xml_escape_n): Don't bother checking for subscript error.
2007-09-21 Wojciech Polak <polak@gnu.org>
Add support for an -x option to generate an XML report.
It is not documented yet.
* src/print-xml.c: New file.
* src/print-xml.h: Likewise.
* lib/timevar.def (TV_XML): New var.
* src/Makefile.am (bison_SOURCES): Add print-xml.c, print-xml.h.
* src/conflicts.c: Include print-xml.h.
(solved_conflicts_xml_obstack): New var.
(log_resolution, conflicts_solve, conflicts_free):
Add support for XML report.
(conflicts_output_val): New function.
* src/conflicts.h (conflicts_output_val): New decl.
* src/files.c (spec_xml_file): New var.
(compute_output_file_names, output_file_names_free): Add XML support.
* src/files.h (spec_xml_file): New decl.
* src/getargs.c (xml_flag): New var.
(usage, short_options, long_options, getargs): Add XML support.
* src/getargs.h (xml_flag): New decl.
* src/gram.c: Include print-xml.h.
(rule_lhs_print_xml, rule_rhs_print_xml):
(grammar_rules_partial_print_xml, grammar_rules_print_xml):
New functions.
* src/gram.h: Declare external ones.
* src/main.c: Include print-xml.h.
(main): Add XML support.
* src/reduce.c: Include print-xml.h.
(reduce_xml): New function.
* src/reduce.h: Declare it.
* src/state.c: Include print-xml.h.
(state_new): Add XML support.
(state_rule_lookahead_tokens_print_xml): New function.
* src/state.h: Declare it.
(struct state): New member solved_conflicts_xml.
* src/symtab.c (symbol_class_get_string): New function.
* src/symtab.h: Declare it.
2007-09-21 Paul Eggert <eggert@cs.ucla.edu>
Diffstat (limited to 'src/conflicts.c')
-rw-r--r-- | src/conflicts.c | 138 |
1 files changed, 132 insertions, 6 deletions
diff --git a/src/conflicts.c b/src/conflicts.c index b50922e0..3a8edba4 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -30,6 +30,7 @@ #include "getargs.h" #include "gram.h" #include "lalr.h" +#include "print-xml.h" #include "reader.h" #include "state.h" #include "symtab.h" @@ -39,6 +40,7 @@ int expected_sr_conflicts = -1; int expected_rr_conflicts = -1; static char *conflicts; static struct obstack solved_conflicts_obstack; +static struct obstack solved_conflicts_xml_obstack; static bitset shift_set; static bitset lookahead_set; @@ -72,23 +74,25 @@ log_resolution (rule *r, symbol_number token, case shift_resolution: case right_resolution: obstack_fgrow2 (&solved_conflicts_obstack, - _("\ - Conflict between rule %d and token %s resolved as shift"), + _(" Conflict between rule %d and token %s" + " resolved as shift"), r->number, symbols[token]->tag); break; + case reduce_resolution: case left_resolution: obstack_fgrow2 (&solved_conflicts_obstack, - _("\ - Conflict between rule %d and token %s resolved as reduce"), + _(" Conflict between rule %d and token %s" + " resolved as reduce"), r->number, symbols[token]->tag); break; + case nonassoc_resolution: obstack_fgrow2 (&solved_conflicts_obstack, - _("\ - Conflict between rule %d and token %s resolved as an error"), + _(" Conflict between rule %d and token %s" + " resolved as an error"), r->number, symbols[token]->tag); break; @@ -122,13 +126,87 @@ log_resolution (rule *r, symbol_number token, " (%%right %s)", symbols[token]->tag); break; + case nonassoc_resolution: obstack_fgrow1 (&solved_conflicts_obstack, " (%%nonassoc %s)", symbols[token]->tag); break; } + obstack_sgrow (&solved_conflicts_obstack, ".\n"); + + /* XML report */ + if (xml_flag) + { + /* The description of the resolution. */ + switch (resolution) + { + case shift_resolution: + case right_resolution: + obstack_fgrow2 (&solved_conflicts_xml_obstack, + "<resolution rule=\"%d\" symbol=\"%s\"" + " type=\"shift\">", + r->number, + xml_escape (symbols[token]->tag)); + break; + + case reduce_resolution: + case left_resolution: + obstack_fgrow2 (&solved_conflicts_xml_obstack, + "<resolution rule=\"%d\" symbol=\"%s\"" + " type=\"reduce\">", + r->number, + xml_escape (symbols[token]->tag)); + break; + + case nonassoc_resolution: + obstack_fgrow2 (&solved_conflicts_xml_obstack, + "<resolution rule=\"%d\" symbol=\"%s\"" + " type=\"error\">", + r->number, + xml_escape (symbols[token]->tag)); + break; + } + + /* The reason. */ + switch (resolution) + { + case shift_resolution: + obstack_fgrow2 (&solved_conflicts_xml_obstack, + "%s < %s", + xml_escape_n (0, r->prec->tag), + xml_escape_n (1, symbols[token]->tag)); + break; + + case reduce_resolution: + obstack_fgrow2 (&solved_conflicts_xml_obstack, + "%s < %s", + xml_escape_n (0, symbols[token]->tag), + xml_escape_n (1, r->prec->tag)); + break; + + case left_resolution: + obstack_fgrow1 (&solved_conflicts_xml_obstack, + "%%left %s", + xml_escape (symbols[token]->tag)); + break; + + case right_resolution: + obstack_fgrow1 (&solved_conflicts_xml_obstack, + "%%right %s", + xml_escape (symbols[token]->tag)); + break; + + case nonassoc_resolution: + obstack_fgrow1 (&solved_conflicts_xml_obstack, + "%%nonassoc %s", + xml_escape (symbols[token]->tag)); + break; + } + + obstack_sgrow (&solved_conflicts_xml_obstack, "</resolution>\n"); + } } } @@ -281,6 +359,11 @@ set_conflicts (state *s, symbol **errors) obstack_1grow (&solved_conflicts_obstack, '\0'); s->solved_conflicts = obstack_finish (&solved_conflicts_obstack); } + if (obstack_object_size (&solved_conflicts_xml_obstack)) + { + obstack_1grow (&solved_conflicts_xml_obstack, '\0'); + s->solved_conflicts_xml = obstack_finish (&solved_conflicts_xml_obstack); + } /* Loop over all rules which require lookahead in this state. Check for conflicts not resolved above. */ @@ -309,6 +392,7 @@ conflicts_solve (void) shift_set = bitset_create (ntokens, BITSET_FIXED); lookahead_set = bitset_create (ntokens, BITSET_FIXED); obstack_init (&solved_conflicts_obstack); + obstack_init (&solved_conflicts_xml_obstack); for (i = 0; i < nstates; i++) { @@ -438,6 +522,47 @@ conflicts_output (FILE *out) fputs ("\n\n", out); } +void +conflicts_output_xml (FILE *out, int level) +{ + bool printed_sth = false; + state_number i; + int src_num; + int rrc_num; + + for (i = 0; i < nstates; i++) + { + state *s = states[i]; + if (conflicts[i]) + { + if (!printed_sth) { + fputc ('\n', out); + xml_puts (out, level, "<conflicts>"); + } + + src_num = count_sr_conflicts (s); + rrc_num = count_rr_conflicts (s, true); + + if (src_num) + xml_printf (out, level + 1, + "<conflict state=\"%d\" num=\"%d\"" + " type=\"shift/reduce\"/>", + i, src_num); + if (rrc_num) + xml_printf (out, level + 1, + "<conflict state=\"%d\" num=\"%d\"" + " type=\"reduce/reduce\"/>", + i, rrc_num); + + printed_sth = true; + } + } + if (printed_sth) + xml_puts (out, level, "</conflicts>"); + else + xml_puts (out, level, "<conflicts/>"); +} + /*--------------------------------------------------------. | Total the number of S/R and R/R conflicts. Unlike the | | code in conflicts_output, however, count EACH pair of | @@ -540,4 +665,5 @@ conflicts_free (void) bitset_free (shift_set); bitset_free (lookahead_set); obstack_free (&solved_conflicts_obstack, NULL); + obstack_free (&solved_conflicts_xml_obstack, NULL); } |