aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse/regex/dfa.rs
diff options
context:
space:
mode:
authorJonas Maier <jonas@x77.dev>2026-06-02 15:52:36 +0200
committerJonas Maier <jonas@x77.dev>2026-06-02 15:52:36 +0200
commit93a7ccabdf85ab2733b2b67810750a97bf3509cb (patch)
tree0e42faacb6b84446128a8ca6acd123e32d811ca1 /src/parse/regex/dfa.rs
parent1ec7a9d2d3bc77b07c97a07e896be05b4099cf9f (diff)
downloadpish-93a7ccabdf85ab2733b2b67810750a97bf3509cb.tar.gz
refactor enfa for better type safety
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())
+ }
+}