mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
getMatches: simplify
This commit is contained in:
parent
c81c30b144
commit
749e3e64b9
@ -868,56 +868,58 @@ bool canReach(const NGHolder &g, const NFAEdge &e, struct fmstate &state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
void getMatches(const NGHolder &g, MatchSet &matches, struct fmstate &state,
|
void getAcceptMatches(const NGHolder &g, MatchSet &matches,
|
||||||
bool allowEodMatches) {
|
struct fmstate &state, NFAVertex accept_vertex) {
|
||||||
flat_set<NFAVertex> accepts {g.accept, g.acceptEod};
|
assert(accept_vertex == g.accept || accept_vertex == g.acceptEod);
|
||||||
|
|
||||||
for (auto v : accepts) {
|
const bool eod = accept_vertex == g.acceptEod;
|
||||||
bool eod = v == g.acceptEod;
|
auto active_states = eod ? state.states.getAcceptEodStates(state.gc)
|
||||||
if (eod && !allowEodMatches) {
|
: state.states.getAcceptStates(state.gc);
|
||||||
|
|
||||||
|
DEBUG_PRINTF("Number of active states: %zu\n", active_states.size());
|
||||||
|
|
||||||
|
for (const auto &cur : active_states) {
|
||||||
|
auto u = state.vertices[cur.idx];
|
||||||
|
|
||||||
|
// we can't accept anything from startDs in between UTF-8 codepoints
|
||||||
|
if (state.utf8 && u == g.startDs && !isUtf8CodePoint(state.cur)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto active_states = eod ? state.states.getAcceptEodStates(state.gc) :
|
const auto &reports =
|
||||||
state.states.getAcceptStates(state.gc);
|
eod ? state.gc.vertex_eod_reports_by_level[cur.level][u]
|
||||||
|
: state.gc.vertex_reports_by_level[cur.level][u];
|
||||||
|
|
||||||
DEBUG_PRINTF("Number of active states: %zu\n", active_states.size());
|
NFAEdge e = edge(u, accept_vertex, g);
|
||||||
|
|
||||||
for (const auto &cur : active_states) {
|
// we assume edge assertions only exist at level 0
|
||||||
auto u = state.vertices[cur.idx];
|
if (e && !canReach(g, e, state)) {
|
||||||
|
continue;
|
||||||
// we can't accept anything from startDs in between UTF-8 codepoints
|
|
||||||
if (state.utf8 && u == g.startDs && !isUtf8CodePoint(state.cur)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto &reports =
|
|
||||||
eod ?
|
|
||||||
state.gc.vertex_eod_reports_by_level[cur.level][u] :
|
|
||||||
state.gc.vertex_reports_by_level[cur.level][u];
|
|
||||||
|
|
||||||
NFAEdge e = edge(u, v, g);
|
|
||||||
|
|
||||||
// we assume edge assertions only exist at level 0
|
|
||||||
if (e && !canReach(g, e, state)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG_PRINTF("%smatch found at %zu\n",
|
|
||||||
eod ? "eod " : "", state.offset);
|
|
||||||
|
|
||||||
assert(!reports.empty());
|
|
||||||
for (const auto &report_id : reports) {
|
|
||||||
const Report &ri = state.rm.getReport(report_id);
|
|
||||||
|
|
||||||
DEBUG_PRINTF("report %u has offset adjustment %d\n",
|
|
||||||
report_id, ri.offsetAdjust);
|
|
||||||
DEBUG_PRINTF("match from (i:%zu,l:%u,t:%u): (%zu,%zu)\n",
|
|
||||||
cur.idx, cur.level, cur.type, cur.som,
|
|
||||||
state.offset + ri.offsetAdjust);
|
|
||||||
matches.emplace(cur.som, state.offset + ri.offsetAdjust);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG_PRINTF("%smatch found at %zu\n", eod ? "eod " : "", state.offset);
|
||||||
|
|
||||||
|
assert(!reports.empty());
|
||||||
|
for (const auto &report_id : reports) {
|
||||||
|
const Report &ri = state.rm.getReport(report_id);
|
||||||
|
|
||||||
|
DEBUG_PRINTF("report %u has offset adjustment %d\n", report_id,
|
||||||
|
ri.offsetAdjust);
|
||||||
|
DEBUG_PRINTF("match from (i:%zu,l:%u,t:%u): (%zu,%zu)\n", cur.idx,
|
||||||
|
cur.level, cur.type, cur.som,
|
||||||
|
state.offset + ri.offsetAdjust);
|
||||||
|
matches.emplace(cur.som, state.offset + ri.offsetAdjust);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
void getMatches(const NGHolder &g, MatchSet &matches, struct fmstate &state,
|
||||||
|
bool allowEodMatches) {
|
||||||
|
getAcceptMatches(g, matches, state, g.accept);
|
||||||
|
if (allowEodMatches) {
|
||||||
|
getAcceptMatches(g, matches, state, g.acceptEod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user