cex: also include in the report on --report=counterexamples

And let --report=all include the counterexamples.

* src/getargs.h, src/getargs.c (report_cex): New.
* src/main.c: Compute counterexamples when -rcex is specified.
* src/print.c: Include the counterexamples when -rcex is specified.

* tests/conflicts.at, tests/existing.at, tests/local.at: Adjust.
This commit is contained in:
Akim Demaille
2020-06-14 08:18:37 +02:00
parent d4f854e5b2
commit c35e829a76
8 changed files with 71 additions and 16 deletions

3
TODO
View File

@@ -32,6 +32,9 @@ could try to use the same color for the same rule.
Show the counterexamples. This is going to be really hard and/or painful. Show the counterexamples. This is going to be really hard and/or painful.
Unless we play it dumb (little structure). Unless we play it dumb (little structure).
*** Doc
-Wcounterexamples, --report=counterexamples
** glr.cc ** glr.cc
Get rid of global_tokens_and_yystype. Get rid of global_tokens_and_yystype.

View File

@@ -206,23 +206,26 @@ ARGMATCH_DEFINE_GROUP (report, enum report)
static const argmatch_report_doc argmatch_report_docs[] = static const argmatch_report_doc argmatch_report_docs[] =
{ {
{ "states", N_("describe the states") }, { "states", N_("describe the states") },
{ "itemsets", N_("complete the core item sets with their closure") }, { "itemsets", N_("complete the core item sets with their closure") },
{ "lookaheads", N_("explicitly associate lookahead tokens to items") }, { "lookaheads", N_("explicitly associate lookahead tokens to items") },
{ "solved", N_("describe shift/reduce conflicts solving") }, { "solved", N_("describe shift/reduce conflicts solving") },
{ "all", N_("include all the above information") }, { "counterexamples", N_("generate conflict counterexamples") },
{ "none", N_("disable the report") }, { "all", N_("include all the above information") },
{ "none", N_("disable the report") },
{ NULL, NULL }, { NULL, NULL },
}; };
static const argmatch_report_arg argmatch_report_args[] = static const argmatch_report_arg argmatch_report_args[] =
{ {
{ "none", report_none }, { "none", report_none },
{ "states", report_states }, { "states", report_states },
{ "itemsets", report_states | report_itemsets }, { "itemsets", report_states | report_itemsets },
{ "lookaheads", report_states | report_lookahead_tokens }, { "lookaheads", report_states | report_lookahead_tokens },
{ "solved", report_states | report_solved_conflicts }, { "solved", report_states | report_solved_conflicts },
{ "all", report_all }, { "counterexamples", report_cex },
{ "cex", report_cex },
{ "all", report_all },
{ NULL, report_none }, { NULL, report_none },
}; };

View File

@@ -79,6 +79,7 @@ enum report
report_itemsets = 1 << 1, report_itemsets = 1 << 1,
report_lookahead_tokens = 1 << 2, report_lookahead_tokens = 1 << 2,
report_solved_conflicts = 1 << 3, report_solved_conflicts = 1 << 3,
report_cex = 1 << 4,
report_all = ~0 report_all = ~0
}; };
/** What appears in the *.output file. */ /** What appears in the *.output file. */

View File

@@ -146,7 +146,8 @@ main (int argc, char *argv[])
conflicts_update_state_numbers (old_to_new, nstates_old); conflicts_update_state_numbers (old_to_new, nstates_old);
free (old_to_new); free (old_to_new);
} }
if (warning_is_enabled (Wcounterexamples)) if (report_flag & report_cex
|| warning_is_enabled (Wcounterexamples))
counterexample_init (); counterexample_init ();
conflicts_print (); conflicts_print ();
timevar_pop (tv_conflicts); timevar_pop (tv_conflicts);

View File

@@ -356,7 +356,9 @@ print_state (FILE *out, const state *s)
fputc ('\n', out); fputc ('\n', out);
fputs (s->solved_conflicts, out); fputs (s->solved_conflicts, out);
} }
if (warning_is_enabled (Wcounterexamples) && has_conflicts (s)) if (has_conflicts (s)
&& (report_flag & report_cex
|| warning_is_enabled (Wcounterexamples)))
{ {
fputc ('\n', out); fputc ('\n', out);
counterexample_report_state (s, out, " "); counterexample_report_state (s, out, " ");

View File

@@ -860,6 +860,15 @@ State 5
OP [reduce using rule 1 (exp)] OP [reduce using rule 1 (exp)]
$default reduce using rule 1 (exp) $default reduce using rule 1 (exp)
Shift/reduce conflict on token OP:
1 exp: exp OP exp .
1 exp: exp . OP exp
Example exp OP exp • OP exp
First derivation exp ::=[ exp ::=[ exp OP exp • ] OP exp ]
Example exp OP exp • OP exp
Second derivation exp ::=[ exp OP exp ::=[ exp • OP exp ] ]
]]) ]])
AT_CLEANUP AT_CLEANUP
@@ -1195,6 +1204,15 @@ State 1
$end [reduce using rule 4 (id)] $end [reduce using rule 4 (id)]
$default reduce using rule 3 (num) $default reduce using rule 3 (num)
Reduce/reduce conflict on token $end:
3 num: '0' .
4 id: '0' .
Example '0' •
First derivation exp ::=[ num ::=[ '0' • ] ]
Example '0' •
Second derivation exp ::=[ id ::=[ '0' • ] ]
State 2 State 2
@@ -1734,6 +1752,15 @@ State 4
reported_conflicts go to state 6 reported_conflicts go to state 6
Shift/reduce conflict on token 'a':
10 reported_conflicts: . %empty
8 reported_conflicts: . 'a'
First example resolved_conflict • 'a'
First derivation start ::=[ resolved_conflict reported_conflicts ::=[ • ] 'a' ]
Second example resolved_conflict • 'a' 'a'
Second derivation start ::=[ resolved_conflict reported_conflicts ::=[ • 'a' ] 'a' ]
State 5 State 5
@@ -1744,6 +1771,15 @@ State 5
'a' [reduce using rule 9 (reported_conflicts)] 'a' [reduce using rule 9 (reported_conflicts)]
$default reduce using rule 8 (reported_conflicts) $default reduce using rule 8 (reported_conflicts)
Reduce/reduce conflict on token 'a':
8 reported_conflicts: 'a' .
9 reported_conflicts: 'a' .
Example 'a' •
First derivation reported_conflicts ::=[ 'a' • ]
Example 'a' •
Second derivation reported_conflicts ::=[ 'a' • ]
State 6 State 6
@@ -1920,6 +1956,15 @@ 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 10 and token 'b' resolved as an error (%nonassoc 'b').
Conflict between rule 11 and token 'c' resolved as an error (%nonassoc 'c'). Conflict between rule 11 and token 'c' resolved as an error (%nonassoc 'c').
Reduce/reduce conflict on token 'c':
12 empty_c2: . %empty
13 empty_c3: . %empty
Example • 'c'
First derivation start ::=[ empty_c2 ::=[ • ] 'c' ]
Example • 'c'
Second derivation start ::=[ empty_c3 ::=[ • ] 'c' ]
State 1 State 1
]]) ]])

View File

@@ -36,7 +36,7 @@ dnl support is rapidly evolving, let's keep that information to be careful.
dnl However, we don't do diffs for canonical LR(1) because the diff is huge. dnl However, we don't do diffs for canonical LR(1) because the diff is huge.
m4_pushdef([AT_LALR1_DIFF_CHECK], m4_pushdef([AT_LALR1_DIFF_CHECK],
[AT_CHECK([[sed 's/^%define lr.type .*$//' input.y > input-lalr.y]]) [AT_CHECK([[sed 's/^%define lr.type .*$//' input.y > input-lalr.y]])
AT_BISON_CHECK([[--report=all input-lalr.y]], [[0]], [ignore], [ignore]) AT_BISON_CHECK([[--report=all,no-cex input-lalr.y]], [[0]], [ignore], [ignore])
AT_DIFF_U_CHECK([[input-lalr.output input.output]], [$1])]) AT_DIFF_U_CHECK([[input-lalr.output input.output]], [$1])])
AT_TEST_TABLES_AND_PARSE([$2[: LALR(1)]], [[LALR]], [[last-state]], AT_TEST_TABLES_AND_PARSE([$2[: LALR(1)]], [[LALR]], [[last-state]],

View File

@@ -1594,7 +1594,7 @@ yylex (void)
m4_if(m4_index(m4_quote($3), [no-xml]), -1, m4_if(m4_index(m4_quote($3), [no-xml]), -1,
[AT_BISON_CHECK], [AT_BISON_CHECK],
[AT_BISON_CHECK_NO_XML])([[-Wall --report=all --defines -o input.c input.y]], [AT_BISON_CHECK_NO_XML])([[-Wall --report=all,no-cex --defines -o input.c input.y]],
[0], [], m4_dquote($7)) [0], [], m4_dquote($7))
m4_if(m4_index(m4_quote($3), [last-state]), -1, m4_if(m4_index(m4_quote($3), [last-state]), -1,