diff options
Diffstat (limited to 'nfa')
-rw-r--r-- | nfa/Cargo.toml | 5 | ||||
-rw-r--r-- | nfa/src/default/nfa.rs | 56 | ||||
-rw-r--r-- | nfa/src/default/regex.rs | 60 |
3 files changed, 20 insertions, 101 deletions
diff --git a/nfa/Cargo.toml b/nfa/Cargo.toml index 9eac932..75a6a43 100644 --- a/nfa/Cargo.toml +++ b/nfa/Cargo.toml @@ -6,10 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -graph = { path = "../graph", optional = true } +graph = { path = "../graph" } +graph_macro = { path = "../graph_macro" } receme = { path = "../receme", optional = true } [features] -default = ["default-graph"] -default-graph = ["dep:graph"] recursion = ["dep:receme"] diff --git a/nfa/src/default/nfa.rs b/nfa/src/default/nfa.rs index 6b1e56f..d2fe88e 100644 --- a/nfa/src/default/nfa.rs +++ b/nfa/src/default/nfa.rs @@ -12,8 +12,10 @@ use crate::{ use core::fmt::{Debug, Display}; +use graph_macro::Graph; + /// Default NFA implementation. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Graph)] pub struct DefaultNFA<T: GraphLabel> { graph: DLGraph<T>, } @@ -31,51 +33,7 @@ impl<T: GraphLabel + Display> Default for DefaultNFA<T> { // I deliberately avoid using [`Deref`][std::ops::Deref] here, as I do // not want to dereference an NFA to a Graph. -impl<T: GraphLabel + Display> Graph for DefaultNFA<T> { - type Iter<'a> = <DLGraph<T> as Graph>::Iter<'a> where T: 'a; - - #[inline] - fn is_empty(&self) -> bool { - self.graph.is_empty() - } - - #[inline] - fn nodes_len(&self) -> usize { - self.graph.nodes_len() - } - - #[inline] - fn children_of(&self, node_id: usize) -> Result<Self::Iter<'_>, GError> { - self.graph.children_of(node_id) - } - - #[inline] - fn degree(&self, node_id: usize) -> Result<usize, GError> { - self.graph.degree(node_id) - } - - #[inline] - fn is_empty_node(&self, node_id: usize) -> Result<bool, GError> { - self.graph.is_empty_node(node_id) - } - - #[inline] - fn has_edge(&self, source: usize, target: usize) -> Result<bool, GError> { - self.graph.has_edge(source, target) - } - - #[inline] - fn print_viz(&self, filename: &str) -> Result<(), std::io::Error> { - self.graph.print_viz(filename) - } - - #[inline] - fn replace_by_builder(&mut self, _builder: impl Builder<Result = Self>) { - unimplemented!() - } -} - -impl<T: GraphLabel + Display> LabelGraph<T> for DefaultNFA<T> { +impl<T: GraphLabel> LabelGraph<T> for DefaultNFA<T> { type Iter<'a> = <DLGraph<T> as LabelGraph<T>>::Iter<'a> where T: 'a; type LabelIter<'a> = <DLGraph<T> as LabelGraph<T>>::LabelIter<'a> where T: 'a; @@ -119,14 +77,14 @@ impl<T: GraphLabel + Display> LabelGraph<T> for DefaultNFA<T> { } } -impl<T: GraphLabel + Display> LabelExtGraph<T> for DefaultNFA<T> { +impl<T: GraphLabel> LabelExtGraph<T> for DefaultNFA<T> { #[inline] fn extend(&mut self, edges: impl IntoIterator<Item = (T, usize)>) -> Result<usize, GError> { self.graph.extend(edges) } } -impl<T: GraphLabel + Display> Nfa<T> for DefaultNFA<T> { +impl<T: GraphLabel> Nfa<T> for DefaultNFA<T> { type FromRegex<S: GraphLabel + Display + Default> = DefaultNFA<S>; // Reminder: This is an adopted version of Thompson's @@ -484,7 +442,7 @@ impl<T: GraphLabel + Display> Nfa<T> for DefaultNFA<T> { } } -impl<T: GraphLabel + Display + Debug> Display for DefaultNFA<T> { +impl<T: GraphLabel> Display for DefaultNFA<T> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Debug::fmt(self, f) } diff --git a/nfa/src/default/regex.rs b/nfa/src/default/regex.rs index 1c22687..1b1b325 100644 --- a/nfa/src/default/regex.rs +++ b/nfa/src/default/regex.rs @@ -4,6 +4,8 @@ use graph::{error::Error as GError, ALGraph, ExtGraph, Graph, GraphLabel}; use crate::{desrec::DesRec, error::Error, Regex}; +use graph_macro::Graph; + #[cfg(feature = "recursion")] use receme::{algebra::Algebra, catana::Cata}; @@ -64,9 +66,10 @@ impl<T: GraphLabel> Display for RegexType<T> { } /// A default implementation of regular expressions. -#[derive(Debug, Clone)] -pub struct DefaultRegex<T: GraphLabel + Display> { +#[derive(Debug, Clone, Graph)] +pub struct DefaultRegex<T: GraphLabel> { /// The underlying graph is stored using adjacency lists. + #[graph] graph: ALGraph, /// The types of the underlying nodes. types: Vec<RegexType<T>>, @@ -76,7 +79,7 @@ pub struct DefaultRegex<T: GraphLabel + Display> { root: Option<usize>, } -impl<T: GraphLabel + Display> Default for DefaultRegex<T> { +impl<T: GraphLabel> Default for DefaultRegex<T> { fn default() -> Self { Self { graph: Default::default(), @@ -503,54 +506,13 @@ impl<T: GraphLabel> DefaultRegex<T> { } } -impl<T: GraphLabel + Display + Debug> Display for DefaultRegex<T> { +impl<T: GraphLabel> Display for DefaultRegex<T> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.to_string_with(|t| format!("{t}"))?) } } -impl<T: GraphLabel + Display> Graph for DefaultRegex<T> { - type Iter<'a> = <ALGraph as Graph>::Iter<'a> - where - Self: 'a; - - #[inline] - fn is_empty(&self) -> bool { - self.graph.is_empty() - } - - #[inline] - fn nodes_len(&self) -> usize { - self.graph.nodes_len() - } - - #[inline] - fn children_of(&self, node_id: usize) -> Result<Self::Iter<'_>, GError> { - self.graph.children_of(node_id) - } - - #[inline] - fn degree(&self, node_id: usize) -> Result<usize, GError> { - self.graph.degree(node_id) - } - - #[inline] - fn is_empty_node(&self, node_id: usize) -> Result<bool, GError> { - self.graph.is_empty_node(node_id) - } - - #[inline] - fn has_edge(&self, source: usize, target: usize) -> Result<bool, GError> { - self.graph.has_edge(source, target) - } - - #[inline] - fn replace_by_builder(&mut self, _builder: impl graph::Builder<Result = Self>) { - unimplemented!() - } -} - -impl<T: GraphLabel + Display + Debug> Regex<RegexType<T>> for DefaultRegex<T> { +impl<T: GraphLabel> Regex<RegexType<T>> for DefaultRegex<T> { /// Return the root of the regular expression. #[inline] fn root(&self) -> Option<usize> { @@ -649,7 +611,7 @@ pub struct DefaultRegParser<T: GraphLabel + Display> { _phantom: PhantomData<T>, } -impl<T: GraphLabel + Display> DefaultRegParser<T> { +impl<T: GraphLabel> DefaultRegParser<T> { /// Query if a terminal or a non-terminal is already found. /// /// If found, return the associated index of the terminal or @@ -676,7 +638,7 @@ impl<T: GraphLabel + Display> DefaultRegParser<T> { } } -impl<T: GraphLabel + Display> Default for DefaultRegParser<T> { +impl<T: GraphLabel> Default for DefaultRegParser<T> { fn default() -> Self { Self { ter_map: Default::default(), @@ -686,7 +648,7 @@ impl<T: GraphLabel + Display> Default for DefaultRegParser<T> { } } -impl<T: GraphLabel + Display + Debug> DesRec for DefaultRegParser<T> { +impl<T: GraphLabel> DesRec for DefaultRegParser<T> { type Label = RegexType<T>; type Regex = DefaultRegex<T>; |