diff options
| author | Jonas Maier <jonas@x77.dev> | 2026-06-02 15:52:36 +0200 |
|---|---|---|
| committer | Jonas Maier <jonas@x77.dev> | 2026-06-02 15:52:36 +0200 |
| commit | 93a7ccabdf85ab2733b2b67810750a97bf3509cb (patch) | |
| tree | 0e42faacb6b84446128a8ca6acd123e32d811ca1 /src/parse/regex/dfa.rs | |
| parent | 1ec7a9d2d3bc77b07c97a07e896be05b4099cf9f (diff) | |
| download | pish-93a7ccabdf85ab2733b2b67810750a97bf3509cb.tar.gz | |
refactor enfa for better type safety
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()) + } +} |
