[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 4/5] counterexample generation integration
From: |
Vincent Imbimbo |
Subject: |
[PATCH 4/5] counterexample generation integration |
Date: |
Tue, 12 May 2020 22:23:53 -0400 |
---
src/complain.c | 2 ++
src/complain.h | 2 ++
src/conflicts.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++
src/getargs.c | 2 ++
src/getargs.h | 1 +
src/local.mk | 10 ++++++++
src/main.c | 3 +++
7 files changed, 87 insertions(+)
diff --git a/src/complain.c b/src/complain.c
index 87563d59..e4037c5e 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -113,6 +113,7 @@ static const argmatch_warning_doc argmatch_warning_docs[] =
{
{ "conflicts-sr", N_("S/R conflicts (enabled by default)") },
{ "conflicts-rr", N_("R/R conflicts (enabled by default)") },
+ { "counterexample", N_("Conflict counter examples") },
{ "deprecated", N_("obsolete constructs") },
{ "empty-rule", N_("empty rules without %empty") },
{ "midrule-values", N_("unset or unused midrule values") },
@@ -133,6 +134,7 @@ static const argmatch_warning_arg argmatch_warning_args[] =
{ "yacc", Wyacc },
{ "conflicts-sr", Wconflicts_sr },
{ "conflicts-rr", Wconflicts_rr },
+ { "counterexample", Wcounterexample },
{ "deprecated", Wdeprecated },
{ "empty-rule", Wempty_rule },
{ "precedence", Wprecedence },
diff --git a/src/complain.h b/src/complain.h
index 4b73d08d..dfe7bcc4 100644
--- a/src/complain.h
+++ b/src/complain.h
@@ -47,6 +47,7 @@ typedef enum
{
warning_conflicts_rr,
warning_conflicts_sr,
+ warning_counterexample,
warning_deprecated,
warning_empty_rule,
warning_midrule_values,
@@ -104,6 +105,7 @@ typedef enum
Wconflicts_rr = 1 << warning_conflicts_rr,
Wconflicts_sr = 1 << warning_conflicts_sr,
+ Wcounterexample = 1 << warning_counterexample,
Wdeprecated = 1 << warning_deprecated,
Wempty_rule = 1 << warning_empty_rule,
Wmidrule_values = 1 << warning_midrule_values,
diff --git a/src/conflicts.c b/src/conflicts.c
index cfc729aa..01598049 100644
--- a/src/conflicts.c
+++ b/src/conflicts.c
@@ -34,6 +34,7 @@
#include "reader.h"
#include "state.h"
#include "symtab.h"
+#include "counterexample.h"
/* -1 stands for not specified. */
int expected_sr_conflicts = -1;
@@ -628,6 +629,70 @@ conflicts_total_count (void)
| Reporting per-rule conflicts. |
`------------------------------*/
+static void
+report_counterexamples ()
+{
+ for (state_number sn = 0; sn < nstates; ++sn)
+ {
+ if (conflicts[sn])
+ {
+ state *s = states[sn];
+ reductions *reds = s->reductions;
+ for (int i = 0; i < reds->num; ++i)
+ {
+ rule *r1 = reds->rules[i];
+ state_item_number c1;
+ for (int j = state_item_map[sn];
+ j < state_item_map[sn + 1]; ++j)
+ {
+ if (item_number_as_rule_number (*state_items[j].item) ==
r1->number)
+ {
+ c1 = j;
+ break;
+ }
+ }
+
+ for (int j = state_item_map[sn];
+ j < state_item_map[sn + 1]; ++j)
+ {
+ if (SI_DISABLED (j))
+ continue;
+ state_item *si = state_items + j;
+ item_number conf = *si->item;
+ if (item_number_is_symbol_number (conf) &&
+ bitset_test (reds->lookahead_tokens[i], conf))
+ {
+ counterexample_report_shift_reduce (c1, j, conf);
+ break;
+ }
+ }
+ for (int j = i+1; j < reds->num; ++j)
+ {
+ bitset conf = bitset_create (ntokens, BITSET_FIXED);
+ bitset_intersection (conf,
+ reds->lookahead_tokens[i],
+ reds->lookahead_tokens[j]);
+ if (!bitset_empty_p (conf))
+ {
+ rule *r2 = reds->rules[j];
+ for (int k = state_item_map[sn];
+ k < state_item_map[sn + 1]; ++k)
+ {
+ state_item *si = state_items + k;
+ const rule *r = item_rule (si->item);
+ if (r == r2)
+ {
+ counterexample_report_reduce_reduce (c1, k,
conf);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
static void
rule_conflicts_print (void)
{
@@ -653,6 +718,8 @@ rule_conflicts_print (void)
r->user_number, rr, expected_rr);
}
}
+ if (warning_is_enabled (Wcounterexample))
+ report_counterexamples ();
}
/*---------------------------------.
diff --git a/src/getargs.c b/src/getargs.c
index bf4a938f..7544ec22 100644
--- a/src/getargs.c
+++ b/src/getargs.c
@@ -261,6 +261,7 @@ static const argmatch_trace_doc argmatch_trace_docs[] =
{ "skeleton", "skeleton postprocessing" },
{ "time", "time consumption" },
{ "ielr", "IELR conversion" },
+ { "cex", "counterexample generation"},
{ "all", "all of the above" },
{ NULL, NULL},
};
@@ -283,6 +284,7 @@ static const argmatch_trace_arg argmatch_trace_args[] =
{ "skeleton", trace_skeleton },
{ "time", trace_time },
{ "ielr", trace_ielr },
+ { "cex", trace_cex },
{ "all", trace_all },
{ NULL, trace_none},
};
diff --git a/src/getargs.h b/src/getargs.h
index ab6af6c3..598fce4f 100644
--- a/src/getargs.h
+++ b/src/getargs.h
@@ -105,6 +105,7 @@ enum trace
trace_ielr = 1 << 12, /**< IELR conversion. */
trace_closure = 1 << 13, /**< Input/output of closure(). */
trace_locations = 1 << 14, /**< Full display of locations. */
+ trace_cex = 1 << 15, /**< Counterexample generation */
trace_all = ~0 /**< All of the above. */
};
/** What debug items bison displays during its run. */
diff --git a/src/local.mk b/src/local.mk
index ee8ec03b..8b28800f 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -40,6 +40,10 @@ src_bison_SOURCES = \
src/complain.h \
src/conflicts.c \
src/conflicts.h \
+ src/counterexample.c \
+ src/counterexample.h \
+ src/derivation.c \
+ src/derivation.h \
src/derives.c \
src/derives.h \
src/files.c \
@@ -61,6 +65,8 @@ src_bison_SOURCES = \
src/location.h \
src/lr0.c \
src/lr0.h \
+ src/lssi.c \
+ src/lssi.h \
src/main.c \
src/muscle-tab.c \
src/muscle-tab.h \
@@ -71,6 +77,8 @@ src_bison_SOURCES = \
src/output.c \
src/output.h \
src/parse-gram.y \
+ src/parse-simulation.c \
+ src/parse-simulation.h \
src/print-graph.c \
src/print-graph.h \
src/print-xml.c \
@@ -91,6 +99,8 @@ src_bison_SOURCES = \
src/scan-skel.h \
src/state.c \
src/state.h \
+ src/state-item.c \
+ src/state-item.h \
src/symlist.c \
src/symlist.h \
src/symtab.c \
diff --git a/src/main.c b/src/main.c
index 258a6d1e..cbae8fbc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -55,6 +55,7 @@
#include "symtab.h"
#include "tables.h"
#include "uniqstr.h"
+#include "counterexample.h"
int
@@ -144,6 +145,7 @@ main (int argc, char *argv[])
conflicts_update_state_numbers (old_to_new, nstates_old);
free (old_to_new);
}
+ counterexample_init ();
conflicts_print ();
timevar_pop (tv_conflicts);
@@ -217,6 +219,7 @@ main (int argc, char *argv[])
reduce_free ();
conflicts_free ();
grammar_free ();
+ counterexample_free ();
output_file_names_free ();
/* The scanner memory cannot be released right after parsing, as it
--
2.20.1 (Apple Git-117)
- [PATCH 0/5] Conflict Counterexample Generation, Vincent Imbimbo, 2020/05/12
- [PATCH 1/5] State-item pair graph generation, Vincent Imbimbo, 2020/05/12
- [PATCH 2/5] Parse simulator, Vincent Imbimbo, 2020/05/12
- [PATCH 3/5] Counterexample search, Vincent Imbimbo, 2020/05/12
- [PATCH 4/5] counterexample generation integration,
Vincent Imbimbo <=
- [PATCH 5/5] counterexample test suite, Vincent Imbimbo, 2020/05/12
- Re: [PATCH 0/5] Conflict Counterexample Generation, Akim Demaille, 2020/05/13
- Re: [PATCH 0/5] Conflict Counterexample Generation, Vincent Imbimbo, 2020/05/13
- Re: [PATCH 0/5] Conflict Counterexample Generation, Akim Demaille, 2020/05/13
- Re: [PATCH 0/5] Conflict Counterexample Generation, Akim Demaille, 2020/05/13
- Re: [PATCH 0/5] Conflict Counterexample Generation, Akim Demaille, 2020/05/14
- Re: [PATCH 0/5] Conflict Counterexample Generation, Akim Demaille, 2020/05/16
- cex: isolate missing API from gl_list, Akim Demaille, 2020/05/16
- cex: stylistic changes, Akim Demaille, 2020/05/16
- cex: fix a crash, Akim Demaille, 2020/05/16