flat_set<dstate_id_t> hinted;
if (trust_daddy_states) {
- hinted.insert(currState.daddy);
- addIfEarlier(hinted, info.raw.start_floating, curr_id);
- addIfEarlier(hinted, info.raw.start_anchored, curr_id);
+ // Use the daddy already set for this state so long as it isn't already
+ // a Sherman state.
+ if (!info.is_sherman(currState.daddy)) {
+ hinted.insert(currState.daddy);
+ } else {
+ // Fall back to granddaddy, which has already been processed (due
+ // to BFS ordering) and cannot be a Sherman state.
+ dstate_id_t granddaddy = info.states[currState.daddy].daddy;
+ assert(!info.is_sherman(granddaddy));
+ hinted.insert(granddaddy);
+ }
} else {
hinted = find_daddy_candidates(info, curr_id);
}
ACVisitor ac_vis(trie, failure_map, ordering);
boost::breadth_first_search(trie, trie.root, visitor(ac_vis));
+ // Renumber with BFS ordering, which is assumed by other DFA construction
+ // code (i.e. Sherman state computation).
+ size_t idx = 0;
+ for (auto v : ordering) {
+ trie[v].index = idx++;
+ }
+
// Compute missing edges from failure map.
for (auto v : ordering) {
DEBUG_PRINTF("vertex %zu\n", trie[v].index);