diff options
Diffstat (limited to 'src/parse/regex/dfa.rs')
| -rw-r--r-- | src/parse/regex/dfa.rs | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/parse/regex/dfa.rs b/src/parse/regex/dfa.rs index 2fd1935..78888a2 100644 --- a/src/parse/regex/dfa.rs +++ b/src/parse/regex/dfa.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use super::{ byte_range::ByteRange, - enfa::{ENFA, MultiState}, + enfa::{ENFA, Epsilon, MultiState, Resolved}, }; pub type StateId = usize; @@ -60,17 +60,9 @@ impl DFA { } } -impl From<ENFA> for DFA { - fn from(mut nfa: ENFA) -> Self { - nfa.simplify(); - - for s in nfa.states.iter() { - if s.trans.iter().any(|t| t.is_epsilon()) { - panic!( - "NFA simplification did not remove epsilon transitions - cannot proceed with powerset construction." - ); - } - } +impl From<ENFA<Resolved>> for DFA { + fn from(mut nfa: ENFA<Resolved>) -> Self { + nfa.remove_unreachable(); let mut multi_states = nfa.all_multi_states(); multi_states.insert(nfa.void_multi_state()); @@ -109,3 +101,9 @@ impl From<ENFA> for DFA { } } } + +impl From<ENFA<Epsilon>> for DFA { + fn from(value: ENFA<Epsilon>) -> Self { + Self::from(value.resolve_epsilon()) + } +} |
