X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/a4f75309f2e467a701ebd8bfb0faf79c011226a6..d065cb3853cf5763a035abbb58f6c5f598af7879:/src/conflicts.c?ds=sidebyside diff --git a/src/conflicts.c b/src/conflicts.c index 0f1f9298..4e05ab32 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -1,7 +1,7 @@ /* Find and resolve or report lookahead conflicts for bison, - Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1992, 2000-2007, 2009-2013 Free Software + Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -73,7 +73,7 @@ log_resolution (rule *r, symbol_number token, { case shift_resolution: case right_resolution: - obstack_fgrow2 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, _(" Conflict between rule %d and token %s" " resolved as shift"), r->number, @@ -82,7 +82,7 @@ log_resolution (rule *r, symbol_number token, case reduce_resolution: case left_resolution: - obstack_fgrow2 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, _(" Conflict between rule %d and token %s" " resolved as reduce"), r->number, @@ -90,7 +90,7 @@ log_resolution (rule *r, symbol_number token, break; case nonassoc_resolution: - obstack_fgrow2 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, _(" Conflict between rule %d and token %s" " resolved as an error"), r->number, @@ -102,111 +102,111 @@ log_resolution (rule *r, symbol_number token, switch (resolution) { case shift_resolution: - obstack_fgrow2 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, " (%s < %s)", r->prec->tag, symbols[token]->tag); break; case reduce_resolution: - obstack_fgrow2 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, " (%s < %s)", symbols[token]->tag, r->prec->tag); break; case left_resolution: - obstack_fgrow1 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, " (%%left %s)", symbols[token]->tag); break; case right_resolution: - obstack_fgrow1 (&solved_conflicts_obstack, + obstack_printf (&solved_conflicts_obstack, " (%%right %s)", symbols[token]->tag); break; case nonassoc_resolution: - obstack_fgrow1 (&solved_conflicts_obstack, + obstack_printf (&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, - " ", - r->number, - xml_escape (symbols[token]->tag)); - break; - - case reduce_resolution: - case left_resolution: - obstack_fgrow2 (&solved_conflicts_xml_obstack, - " ", - r->number, - xml_escape (symbols[token]->tag)); - break; - - case nonassoc_resolution: - obstack_fgrow2 (&solved_conflicts_xml_obstack, - " ", - 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; - } + /* XML report */ + if (xml_flag) + { + /* The description of the resolution. */ + switch (resolution) + { + case shift_resolution: + case right_resolution: + obstack_printf (&solved_conflicts_xml_obstack, + " ", + r->number, + xml_escape (symbols[token]->tag)); + break; + + case reduce_resolution: + case left_resolution: + obstack_printf (&solved_conflicts_xml_obstack, + " ", + r->number, + xml_escape (symbols[token]->tag)); + break; + + case nonassoc_resolution: + obstack_printf (&solved_conflicts_xml_obstack, + " ", + r->number, + xml_escape (symbols[token]->tag)); + break; + } - obstack_sgrow (&solved_conflicts_xml_obstack, "\n"); - } + /* The reason. */ + switch (resolution) + { + case shift_resolution: + obstack_printf (&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_printf (&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_printf (&solved_conflicts_xml_obstack, + "%%left %s", + xml_escape (symbols[token]->tag)); + break; + + case right_resolution: + obstack_printf (&solved_conflicts_xml_obstack, + "%%right %s", + xml_escape (symbols[token]->tag)); + break; + + case nonassoc_resolution: + obstack_printf (&solved_conflicts_xml_obstack, + "%%nonassoc %s", + xml_escape (symbols[token]->tag)); + break; + } + + obstack_sgrow (&solved_conflicts_xml_obstack, "\n"); } } @@ -522,47 +522,6 @@ 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, ""); - } - - src_num = count_sr_conflicts (s); - rrc_num = count_rr_conflicts (s, true); - - if (src_num) - xml_printf (out, level + 1, - "", - i, src_num); - if (rrc_num) - xml_printf (out, level + 1, - "", - i, rrc_num); - - printed_sth = true; - } - } - if (printed_sth) - xml_puts (out, level, ""); - else - xml_puts (out, level, ""); -} - /*--------------------------------------------------------. | Total the number of S/R and R/R conflicts. Unlike the | | code in conflicts_output, however, count EACH pair of | @@ -635,8 +594,17 @@ conflicts_print (void) return; /* Report the total number of conflicts on STDERR. */ + if (expected_sr_conflicts == -1 && expected_rr_conflicts == -1) + { + if (!(warnings_flag & warnings_conflicts_sr)) + src_total = 0; + if (!(warnings_flag & warnings_conflicts_rr)) + rrc_total = 0; + } if (src_total | rrc_total) { + if (expected_sr_conflicts == -1 && expected_rr_conflicts == -1) + set_warning_issued (); if (! yacc_flag) fprintf (stderr, "%s: ", current_file); conflict_report (stderr, src_total, rrc_total);