diff --git a/src/counterexample.c b/src/counterexample.c index 1f690d3a..90a1739e 100644 --- a/src/counterexample.c +++ b/src/counterexample.c @@ -1265,27 +1265,43 @@ counterexample_report_reduce_reduce (state_item_number itm1, state_item_number i FILE *out, const char *prefix) { { - fputs (prefix, out); - fputs (ngettext ("Reduce/reduce conflict on token", - "Reduce/reduce conflict on tokens", - bitset_count (conflict_syms)), out); + struct obstack obstack; + obstack_init (&obstack); bitset_iterator biter; state_item_number sym; - const char *sep = " "; + const char *sep = ""; BITSET_FOR_EACH (biter, conflict_syms, sym, 0) { - fprintf (out, "%s%s", sep, symbols[sym]->tag); + obstack_printf (&obstack, "%s%s", sep, symbols[sym]->tag); sep = ", "; } - fputs (_(":\n"), out); + char *tokens = obstack_finish0 (&obstack); + if (out == stderr) + complain (NULL, Wcounterexamples, + ngettext ("reduce/reduce conflict on token %s", + "reduce/reduce conflict on tokens %s", + bitset_count (conflict_syms)), + tokens); + else + { + fputs (prefix, out); + fprintf (out, + ngettext ("reduce/reduce conflict on token %s", + "reduce/reduce conflict on tokens %s", + bitset_count (conflict_syms)), + tokens); + fprintf (out, "%s\n", _(":")); + } + obstack_free (&obstack, NULL); } // In the report, print the items. - if (*prefix || trace_flag & trace_cex) + if (out != stderr || trace_flag & trace_cex) { print_state_item (&state_items[itm1], out, prefix); print_state_item (&state_items[itm2], out, prefix); } - counterexample_report (itm1, itm2, bitset_first (conflict_syms), false, out, prefix); + counterexample_report (itm1, itm2, bitset_first (conflict_syms), + false, out, prefix); } static state_item_number diff --git a/tests/conflicts.at b/tests/conflicts.at index 794c7795..529f7406 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -1209,7 +1209,7 @@ State 1 $end [reduce using rule 4 (id)] $default reduce using rule 3 (num) - Reduce/reduce conflict on token $end: + reduce/reduce conflict on token $end: 3 num: '0' . 4 id: '0' . Example '0' . @@ -1803,7 +1803,7 @@ State 5 'a' [reduce using rule 9 (reported_conflicts)] $default reduce using rule 8 (reported_conflicts) - Reduce/reduce conflict on token 'a': + reduce/reduce conflict on token 'a': 8 reported_conflicts: 'a' . 9 reported_conflicts: 'a' . Example 'a' . @@ -1993,7 +1993,7 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, Conflict between rule 10 and token 'b' resolved as an error (%nonassoc 'b'). Conflict between rule 11 and token 'c' resolved as an error (%nonassoc 'c'). - Reduce/reduce conflict on token 'c': + reduce/reduce conflict on token 'c': 12 empty_c2: . %empty 13 empty_c3: . %empty Example . 'c' diff --git a/tests/counterexample.at b/tests/counterexample.at index 2b85d061..270e511e 100644 --- a/tests/counterexample.at +++ b/tests/counterexample.at @@ -389,7 +389,7 @@ b : A | b; AT_BISON_CHECK_CEX( [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] -Reduce/reduce conflict on token $end: +input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example A b . First derivation a @@ -402,7 +402,7 @@ Reduce/reduce conflict on token $end: input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] -Reduce/reduce conflict on token $end: +input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example A b . First derivation a -> [ A b . ] Second derivation a -> [ A b -> [ b . ] ] @@ -428,7 +428,7 @@ b: D; AT_BISON_CHECK_CEX( [[input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] -Reduce/reduce conflict on tokens A, C: +input.y: warning: reduce/reduce conflict on tokens A, C [-Wcounterexamples] First example D . A $end First derivation $accept @@ -445,7 +445,7 @@ Reduce/reduce conflict on tokens A, C: input.y:5.4: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr] -Reduce/reduce conflict on tokens A, C: +input.y: warning: reduce/reduce conflict on tokens A, C [-Wcounterexamples] First example D . A $end First derivation $accept -> [ s -> [ a -> [ D . ] A ] $end ] Second example B D . A $end @@ -589,7 +589,7 @@ C : A c A; AT_BISON_CHECK_CEX( [[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr] -Reduce/reduce conflict on tokens b, c: +input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example B . b c First derivation S @@ -604,7 +604,7 @@ Reduce/reduce conflict on tokens b, c: `-> A b A `-> . `-> %empty -Reduce/reduce conflict on tokens b, c: +input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example C . c b First derivation S @@ -621,12 +621,12 @@ Reduce/reduce conflict on tokens b, c: ]], [[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr] -Reduce/reduce conflict on tokens b, c: +input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example B . b c First derivation S -> [ B -> [ A -> [ B . ] b A -> [ ] ] C -> [ A -> [ ] c A -> [ ] ] ] Second derivation S -> [ B C -> [ A -> [ B -> [ A -> [ . ] b A -> [ ] ] ] c A -> [ ] ] ] -Reduce/reduce conflict on tokens b, c: +input.y: warning: reduce/reduce conflict on tokens b, c [-Wcounterexamples] Example C . c b First derivation S -> [ C -> [ A -> [ C . ] c A -> [ ] ] B -> [ A -> [ ] b A -> [ ] ] ] Second derivation S -> [ C B -> [ A -> [ C -> [ A -> [ . ] c A -> [ ] ] ] b A -> [ ] ] ] @@ -653,7 +653,7 @@ d : a | c A | d; AT_BISON_CHECK_CEX( [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr] -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example . c A A $end First derivation $accept @@ -667,7 +667,7 @@ Reduce/reduce conflict on token A: `-> c d `-> . `-> c A A -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example b . c A A $end First derivation @@ -685,7 +685,7 @@ time limit exceeded: XXX `-> c A `-> . -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example c . c A A $end First derivation @@ -721,7 +721,7 @@ time limit exceeded: XXX `-> b d `-> . `-> c A A -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example b c . c A A $end First derivation $accept @@ -758,7 +758,7 @@ Shift/reduce conflict on token A: `-> c A `-> . -Reduce/reduce conflict on token $end: +input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example b d . First derivation a @@ -768,7 +768,7 @@ Reduce/reduce conflict on token $end: `-> b d `-> d . -Reduce/reduce conflict on token $end: +input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example c d . First derivation a @@ -783,20 +783,20 @@ input.y:6.15: warning: rule useless in parser due to conflicts [-Wother] ]], [[input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] input.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr] -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example . c A A $end First derivation $accept -> [ a -> [ b -> [ . ] d -> [ c A A ] ] $end ] Second example . c A A $end Second derivation $accept -> [ a -> [ c -> [ . ] d -> [ c A A ] ] $end ] -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example b . c A A $end First derivation $accept -> [ a -> [ b d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ] Second example b . A $end Second derivation $accept -> [ a -> [ b d -> [ c -> [ . ] A ] ] $end ] -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] time limit exceeded: XXX First example c . c A A $end First derivation $accept -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] $end ] @@ -810,7 +810,7 @@ time limit exceeded: XXX Second example b c . c A A $end Reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ] -Reduce/reduce conflict on token A: +input.y: warning: reduce/reduce conflict on token A [-Wcounterexamples] First example b c . c A A $end First derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ a -> [ b -> [ . ] d -> [ c A A ] ] ] ] ] ] $end ] Second example b c . A $end @@ -822,12 +822,12 @@ Shift/reduce conflict on token A: Second example b c . A $end Reduce derivation $accept -> [ a -> [ b d -> [ a -> [ c d -> [ c -> [ . ] A ] ] ] ] $end ] -Reduce/reduce conflict on token $end: +input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example b d . First derivation a -> [ b d . ] Second derivation a -> [ b d -> [ d . ] ] -Reduce/reduce conflict on token $end: +input.y: warning: reduce/reduce conflict on token $end [-Wcounterexamples] Example c d . First derivation a -> [ c d . ] Second derivation a -> [ c d -> [ d . ] ] diff --git a/tests/diagnostics.at b/tests/diagnostics.at index 61803c44..47581049 100644 --- a/tests/diagnostics.at +++ b/tests/diagnostics.at @@ -621,7 +621,7 @@ input.y:31.4: warning: empty rule without %empty [-W | ^ | %empty input.y: error: reduce/reduce conflicts: 1 found, 0 expected -Reduce/reduce conflict on token "X": +input.y: warning: reduce/reduce conflict on token "X" [-Wcounterexamples] Example "X" "X" "quuux" "X" First derivation exp diff --git a/tests/report.at b/tests/report.at index 9aa1c7be..ea00d0ad 100644 --- a/tests/report.at +++ b/tests/report.at @@ -1548,7 +1548,7 @@ Shift/reduce conflict on token "⊕": ↳ exp "⊕" exp ↳ exp "+" exp • -Reduce/reduce conflict on tokens $end, "+", "⊕": +input.y: warning: reduce/reduce conflict on tokens $end, "+", "⊕" [-Wcounterexamples] Example exp "+" exp • First derivation exp @@ -1758,7 +1758,7 @@ State 7 ↳ exp "⊕" exp ↳ exp "+" exp • - Reduce/reduce conflict on tokens $end, "+", "⊕": + reduce/reduce conflict on tokens $end, "+", "⊕": 2 exp: exp "+" exp • 3 exp: exp "+" exp • Example exp "+" exp •