aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJonas Maier <jonas@x77.dev>2026-06-02 21:44:30 +0200
committerJonas Maier <jonas@x77.dev>2026-06-02 21:44:30 +0200
commitdbca276ac60af603209f62dcc2e0e1fcfbebae11 (patch)
tree7a7f368a1d8caf1d041bbf8327c5ef362115489f /src
parent5647a7645739fa2aa2dea4fe059b4efe84a278bc (diff)
downloadpish-dbca276ac60af603209f62dcc2e0e1fcfbebae11.tar.gz
better case_match command
Diffstat (limited to 'src')
-rw-r--r--src/parse/regex/dfa.rs16
-rw-r--r--src/parse/regex/mod.rs4
-rw-r--r--src/run/builtin.rs20
3 files changed, 26 insertions, 14 deletions
diff --git a/src/parse/regex/dfa.rs b/src/parse/regex/dfa.rs
index 243176d..0a5c78d 100644
--- a/src/parse/regex/dfa.rs
+++ b/src/parse/regex/dfa.rs
@@ -34,7 +34,7 @@ impl fmt::Debug for DFA {
write!(f, "{chr:?} to {to}, ")?;
}
- write!(f, "default to {}", s.default_trans)?;
+ write!(f, "dfl to {}", s.default_trans)?;
if s.accept {
write!(f, ", accept")?;
}
@@ -58,14 +58,18 @@ impl DFA {
}
self.states[state].accept
}
+
+ pub fn simplify(&mut self) {
+ for state in self.states.iter_mut() {
+ state.trans.retain(|_, to| *to != state.default_trans);
+ }
+ }
}
impl From<ENFA> for DFA {
fn from(mut nfa: ENFA) -> Self {
nfa.remove_unreachable();
- println!("{nfa:?}");
-
let mut multi_states = nfa.all_multi_states();
multi_states.insert(nfa.void_multi_state());
let mut len = 0;
@@ -97,9 +101,11 @@ impl From<ENFA> for DFA {
}
}
- Self {
+ let mut this = Self {
start: multi_to_dfa[&nfa.start_multi_state()],
states,
- }
+ };
+ this.simplify();
+ this
}
}
diff --git a/src/parse/regex/mod.rs b/src/parse/regex/mod.rs
index 2f7c223..b8dd8ba 100644
--- a/src/parse/regex/mod.rs
+++ b/src/parse/regex/mod.rs
@@ -3,8 +3,8 @@ use crate::parse::OtherHighlights;
use super::{Parse, ParseError, Result};
mod byte_range;
-mod dfa;
-mod enfa;
+pub mod dfa;
+pub mod enfa;
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
pub enum LookDirection {
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index fd4cbed..87a0be0 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -1039,7 +1039,9 @@ impl Builtin for pish_theme {
#[cfg(debug_assertions)]
mod dbg {
- use super::*;
+ use crate::parse::regex::{dfa::DFA, enfa::ENFA};
+
+use super::*;
#[derive(Copy, Clone)]
pub struct debug;
@@ -1121,13 +1123,17 @@ mod dbg {
},
};
- match regex.try_compile() {
- Ok(compiled) => writeln!(stdout, "{compiled:?}")?,
- Err(e) => {
- writeln!(stdout, "compilation error: {e:?}")?;
+ let nfa = match ENFA::try_from(regex) {
+ Ok(nfa) => nfa,
+ Err(err) => {
+ writeln!(stdout, "nfa error: {err:?}")?;
return Err(Error::Exit(2));
- },
- }
+ }
+ };
+ writeln!(stdout, "{nfa:?}")?;
+
+ let dfa = DFA::from(nfa);
+ writeln!(stdout, "{dfa:?}")?;
Ok(())
}