DEBUG_PRINTF("doing som\n");
dumpComponent(g, "03_presom", w.expressionIndex, comp_id, ng.cc.grey);
assert(hasCorrectlyNumberedVertices(g));
+ assert(allMatchStatesHaveReports(w));
// First, we try the "SOM chain" support in ng_som.cpp.
dumpComponent(g, "01_begin", w.expressionIndex, comp_id, ng.cc.grey);
+ assert(allMatchStatesHaveReports(w));
+
reduceGraph(g, som, w.utf8, cc);
dumpComponent(g, "02_reduced", w.expressionIndex, comp_id, ng.cc.grey);
}
}
+ assert(allMatchStatesHaveReports(w));
+
if (splitOffAnchoredAcyclic(*ng.rose, g, cc)) {
return true;
}
/*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2016, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
add_edge(g.startDs, v_4, g);
remove_edge(orig, g);
g.renumberEdges();
+ clearReports(g);
}
}
*shell_comp = true;
}
+ // Ensure that only vertices with accept edges have reports.
+ for (auto &gc : comps) {
+ assert(gc);
+ clearReports(*gc);
+ }
+
// We should never produce empty component graphs.
assert(all_of(begin(comps), end(comps),
[](const unique_ptr<NGHolder> &g_comp) {
}
}
- // Vertices with edges to accept or acceptEod must have reports.
+ // Vertices with edges to accept or acceptEod must have reports and
+ // other vertices must not have them.
if (is_match_vertex(v, g) && v != g.accept) {
if (g[v].reports.empty()) {
- DEBUG_PRINTF("vertex %u has no reports\n",
- g[v].index);
+ DEBUG_PRINTF("vertex %u has no reports\n", g[v].index);
return false;
}
+ } else if (!g[v].reports.empty()) {
+ DEBUG_PRINTF("vertex %u has reports but no accept edge\n",
+ g[v].index);
+ return false;
}
// Participant vertices should have distinct state indices.
}
clear_in_edges(g.accept, g);
+ clearReports(g);
vector<NFAVertex> verts(pred.begin(), pred.end());
sort(verts.begin(), verts.end(), VertexIndexOrdering<NGHolder>(g));
}
#ifndef NDEBUG
-/** \brief Used in sanity-checking assertions: returns true if all vertices
- * leading to accept or acceptEod have at least one report ID. */
+
bool allMatchStatesHaveReports(const NGHolder &g) {
+ unordered_set<NFAVertex> reporters;
for (auto v : inv_adjacent_vertices_range(g.accept, g)) {
if (g[v].reports.empty()) {
DEBUG_PRINTF("vertex %u has no reports!\n",
g[v].index);
return false;
}
+ reporters.insert(v);
}
+
for (auto v : inv_adjacent_vertices_range(g.acceptEod, g)) {
if (v == g.accept) {
continue; // stylised edge
g[v].index);
return false;
}
+ reporters.insert(v);
}
+
+ for (auto v : vertices_range(g)) {
+ if (!contains(reporters, v) && !g[v].reports.empty()) {
+ DEBUG_PRINTF("vertex %u is not a match state, but has reports!\n",
+ g[v].index);
+ return false;
+ }
+ }
+
return true;
}
-/** Assertion: returns true if the vertices in this graph are contiguously (and
- * uniquely) numbered from zero. */
bool hasCorrectlyNumberedVertices(const NGHolder &g) {
size_t count = num_vertices(g);
vector<bool> ids(count, false);
&& num_vertices(g) == num_vertices(g.g);
}
-/** Assertion: returns true if the edges in this graph are contiguously (and
- * uniquely) numbered from zero. */
bool hasCorrectlyNumberedEdges(const NGHolder &g) {
size_t count = num_edges(g);
vector<bool> ids(count, false);
void duplicateReport(NGHolder &g, ReportID r_old, ReportID r_new);
#ifndef NDEBUG
-// Assertions: only available in internal builds
-/** \brief Used in sanity-checking assertions: returns true if all vertices
- * leading to accept or acceptEod have at least one report ID. */
+// Assertions: only available in internal builds.
+
+/**
+ * Used in sanity-checking assertions: returns true if all vertices
+ * with edges to accept or acceptEod have at least one report ID. Additionally,
+ * checks that ONLY vertices with edges to accept or acceptEod has reports.
+ */
bool allMatchStatesHaveReports(const NGHolder &g);
+/**
+ * Assertion: returns true if the vertices in this graph are contiguously (and
+ * uniquely) numbered from zero.
+ */
bool hasCorrectlyNumberedVertices(const NGHolder &g);
+
+/**
+ * Assertion: returns true if the edges in this graph are contiguously (and
+ * uniquely) numbered from zero.
+ */
bool hasCorrectlyNumberedEdges(const NGHolder &g);
-#endif
+
+#endif // NDEBUG
} // namespace ue2
#include "nfa/nfa_internal.h"
#include "nfa/nfa_api_util.h"
#include "nfagraph/ng_lbr.h"
+#include "nfagraph/ng_util.h"
#include "util/alloc.h"
#include "util/compile_context.h"
#include "grey.h"
ParsedExpression parsed(0, pattern.c_str(), flags, 0);
unique_ptr<NGWrapper> g = buildWrapper(rm, cc, parsed);
ASSERT_TRUE(g != nullptr);
+ clearReports(*g);
ASSERT_TRUE(isLBR(*g, grey));
#include "grey.h"
#include "compiler/compiler.h"
-#include "nfagraph/ng.h"
-#include "nfagraph/ng_limex.h"
-#include "nfagraph/ng_restructuring.h"
#include "nfa/limex_context.h"
#include "nfa/limex_internal.h"
#include "nfa/nfa_api.h"
#include "nfa/nfa_api_util.h"
#include "nfa/nfa_internal.h"
+#include "nfagraph/ng.h"
+#include "nfagraph/ng_limex.h"
+#include "nfagraph/ng_restructuring.h"
+#include "nfagraph/ng_util.h"
#include "util/alloc.h"
#include "util/target_info.h"
ParsedExpression parsed(0, expr.c_str(), flags, 0);
unique_ptr<NGWrapper> g = buildWrapper(rm, cc, parsed);
ASSERT_TRUE(g != nullptr);
+ clearReports(*g);
rm.setProgramOffset(0, MATCH_REPORT);
ParsedExpression parsed(0, expr.c_str(), flags, 0);
unique_ptr<NGWrapper> g = buildWrapper(rm, cc, parsed);
ASSERT_TRUE(g != nullptr);
+ clearReports(*g);
// Reverse the graph and add some reports on the accept vertices.
NGHolder g_rev(NFA_REV_PREFIX);
reverseHolder(*g, g_rev);
+ clearReports(g_rev);
for (NFAVertex v : inv_adjacent_vertices_range(g_rev.accept, g_rev)) {
g_rev[v].reports.insert(0);
}
ReportManager rm(cc.grey);
unique_ptr<NGWrapper> g = buildWrapper(rm, cc, parsed);
ASSERT_TRUE(g != nullptr);
+ clearReports(*g);
rm.setProgramOffset(0, MATCH_REPORT);
/*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2016, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
#include "gtest/gtest.h"
#include "nfagraph/ng_repeat.h"
+#include "nfagraph/ng_util.h"
#include "util/depth.h"
#include "hs_compile.h"
{ "^..?..?..?..?..?", 5, 10 }
};
-INSTANTIATE_TEST_CASE_P(PureRepeat, NFAPureRepeatTest, ValuesIn(pureRepeatTests));
+INSTANTIATE_TEST_CASE_P(PureRepeat, NFAPureRepeatTest,
+ ValuesIn(pureRepeatTests));
TEST_P(NFAPureRepeatTest, Check) {
const PureRepeatTest &t = GetParam();
SCOPED_TRACE(testing::Message() << "Pattern: " << t.pattern);
- unique_ptr<NGWrapper> w(constructGraph(t.pattern, HS_FLAG_ALLOWEMPTY));
+ auto w = constructGraph(t.pattern, HS_FLAG_ALLOWEMPTY);
+ ASSERT_TRUE(w != nullptr);
+ clearReports(*w);
PureRepeat repeat;
bool result = isPureRepeat(*w, repeat);