ng_literal_analysis: refactor splitOffLeadingLiteral

This commit is contained in:
Justin Viiret 2017-02-02 10:33:20 +11:00 committed by Matthew Barr
parent 7acd8dcac8
commit d48a11cbbd

View File

@ -734,55 +734,30 @@ vector<u64a> scoreEdges(const NGHolder &g, const flat_set<NFAEdge> &known_bad) {
return scores; return scores;
} }
static bool splitOffLeadingLiteral(const NGHolder &g, ue2_literal *lit_out,
bool splitOffLeadingLiteral_i(const NGHolder &g, bool anch, NGHolder *rhs) {
ue2_literal *lit_out, DEBUG_PRINTF("looking for leading floating literal\n");
NGHolder *rhs) { set<NFAVertex> s_succ;
NFAVertex u; insert(&s_succ, adjacent_vertices(g.start, g));
NFAVertex v;
if (!anch) { set<NFAVertex> sds_succ;
DEBUG_PRINTF("looking for leading floating literal\n"); insert(&sds_succ, adjacent_vertices(g.startDs, g));
set<NFAVertex> s_succ;
insert(&s_succ, adjacent_vertices(g.start, g));
set<NFAVertex> sds_succ; bool floating = is_subset_of(s_succ, sds_succ);
insert(&sds_succ, adjacent_vertices(g.startDs, g)); if (!floating) {
DEBUG_PRINTF("not floating\n");
bool floating = is_subset_of(s_succ, sds_succ); return false;
if (!floating) {
DEBUG_PRINTF("not floating\n");
return false;
}
sds_succ.erase(g.startDs);
if (sds_succ.size() != 1) {
DEBUG_PRINTF("branchy root\n");
return false;
}
u = g.startDs;
v = *sds_succ.begin();
} else {
DEBUG_PRINTF("looking for leading anchored literal\n");
if (proper_out_degree(g.startDs, g)) {
DEBUG_PRINTF("not anchored\n");
return false;
}
set<NFAVertex> s_succ;
insert(&s_succ, adjacent_vertices(g.start, g));
s_succ.erase(g.startDs);
if (s_succ.size() != 1) {
DEBUG_PRINTF("branchy root\n");
return false;
}
u = g.start;
v = *s_succ.begin();
} }
sds_succ.erase(g.startDs);
if (sds_succ.size() != 1) {
DEBUG_PRINTF("branchy root\n");
return false;
}
NFAVertex u = g.startDs;
NFAVertex v = *sds_succ.begin();
while (true) { while (true) {
DEBUG_PRINTF("validating vertex %zu\n", g[v].index); DEBUG_PRINTF("validating vertex %zu\n", g[v].index);
@ -838,8 +813,7 @@ bool splitOffLeadingLiteral_i(const NGHolder &g, bool anch,
assert(u != g.startDs); assert(u != g.startDs);
ue2::unordered_map<NFAVertex, NFAVertex> rhs_map; ue2::unordered_map<NFAVertex, NFAVertex> rhs_map;
vector<NFAVertex> pivots; vector<NFAVertex> pivots = make_vector_from(adjacent_vertices(u, g));
insert(&pivots, pivots.end(), adjacent_vertices(u, g));
splitRHS(g, pivots, rhs, &rhs_map); splitRHS(g, pivots, rhs, &rhs_map);
DEBUG_PRINTF("literal is '%s' (len %zu)\n", dumpString(*lit_out).c_str(), DEBUG_PRINTF("literal is '%s' (len %zu)\n", dumpString(*lit_out).c_str(),
@ -848,11 +822,6 @@ bool splitOffLeadingLiteral_i(const NGHolder &g, bool anch,
return true; return true;
} }
bool splitOffLeadingLiteral(const NGHolder &g, ue2_literal *lit_out,
NGHolder *rhs) {
return splitOffLeadingLiteral_i(g, false, lit_out, rhs);
}
bool getTrailingLiteral(const NGHolder &g, ue2_literal *lit_out) { bool getTrailingLiteral(const NGHolder &g, ue2_literal *lit_out) {
if (in_degree(g.acceptEod, g) != 1) { if (in_degree(g.acceptEod, g) != 1) {
return false; return false;