aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse/regex/dfa.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/regex/dfa.rs')
-rw-r--r--src/parse/regex/dfa.rs22
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())
+ }
+}