summaryrefslogtreecommitdiff
path: root/nfa/src/default/regex.rs
diff options
context:
space:
mode:
Diffstat (limited to 'nfa/src/default/regex.rs')
-rw-r--r--nfa/src/default/regex.rs60
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>;