diff options
Diffstat (limited to 'nfa/src/default/regex.rs')
-rw-r--r-- | nfa/src/default/regex.rs | 60 |
1 files changed, 11 insertions, 49 deletions
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>; |