diff --git a/src/nfa/mcclellancompile.cpp b/src/nfa/mcclellancompile.cpp index 29642dde..e2466000 100644 --- a/src/nfa/mcclellancompile.cpp +++ b/src/nfa/mcclellancompile.cpp @@ -842,6 +842,8 @@ void find_better_daddy(dfa_info &info, dstate_id_t curr_id, bool using8bit, flat_set 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); } else { hinted = find_daddy_candidates(info, curr_id); } @@ -896,7 +898,7 @@ void find_better_daddy(dfa_info &info, dstate_id_t curr_id, bool using8bit, if (self_loop_width > MAX_SHERMAN_SELF_LOOP) { DEBUG_PRINTF("%hu is banned wide self loop (%u)\n", curr_id, - self_loop_width); + self_loop_width); return; } diff --git a/src/smallwrite/smallwrite_build.cpp b/src/smallwrite/smallwrite_build.cpp index 829c72e5..fac8d012 100644 --- a/src/smallwrite/smallwrite_build.cpp +++ b/src/smallwrite/smallwrite_build.cpp @@ -443,11 +443,11 @@ bool isSaneTrie(const LitTrie &trie) { * edges and reports. */ static -void buildAutomaton(LitTrie &trie) { +void buildAutomaton(LitTrie &trie, + map &failure_map) { assert(isSaneTrie(trie)); // Find our failure transitions and reports. - map failure_map; vector ordering; ACVisitor ac_vis(trie, failure_map, ordering); boost::breadth_first_search(trie, trie.root, visitor(ac_vis)); @@ -535,7 +535,8 @@ static unique_ptr buildDfa(LitTrie &trie, bool nocase) { DEBUG_PRINTF("trie has %zu states\n", num_vertices(trie)); - buildAutomaton(trie); + map failure_map; + buildAutomaton(trie, failure_map); auto rdfa = make_unique(NFA_OUTFIX); @@ -559,13 +560,19 @@ unique_ptr buildDfa(LitTrie &trie, bool nocase) { DEBUG_PRINTF("state %zu\n", u_state); assert(u_state < rdfa->states.size()); auto &ds = rdfa->states[u_state]; - ds.daddy = root_state; ds.reports = trie[u].reports; - if (!ds.reports.empty()) { DEBUG_PRINTF("reports: %s\n", as_string_list(ds.reports).c_str()); } + // Set daddy state from failure map. + if (u == trie.root) { + ds.daddy = DEAD_STATE; + } else { + assert(contains(failure_map, u)); + ds.daddy = trie[failure_map.at(u)].index + 1; + } + // By default, transition back to the root. fill(ds.next.begin(), ds.next.end(), root_state); // TOP should be a self-loop.