summaryrefslogtreecommitdiff
path: root/chain/src/atom/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'chain/src/atom/mod.rs')
-rw-r--r--chain/src/atom/mod.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/chain/src/atom/mod.rs b/chain/src/atom/mod.rs
new file mode 100644
index 0000000..084acca
--- /dev/null
+++ b/chain/src/atom/mod.rs
@@ -0,0 +1,41 @@
+//! This file defines the behaviour of the Atomic languages, and
+//! provides a default implementation.
+//!
+//! Here I do not to substitute external packages' implementations in
+//! the future, so why define a trait for the atomic languages?
+//! Because this way I can easily substitute other implementations if
+//! I have better ideas in the future.
+
+use grammar::{Error as GrammarError, TNT};
+use nfa::{DOption, Nfa};
+
+/// The expected behaviours of an atomic language.
+pub trait Atom: Nfa<DOption<TNT>> {
+ /// Return the index of a node representing the derivative of the
+ /// left-linear null closure of `nt` with respect to `t`.
+ fn atom(&self, nt: usize, t: usize) -> Result<Option<usize>, GrammarError>;
+
+ /// Return the index of the empty state.
+ fn empty(&self) -> usize;
+}
+
+pub mod default;
+
+pub use default::DefaultAtom;
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use grammar::test_grammar_helper::*;
+
+ #[test]
+ fn atom() -> Result<(), Box<dyn std::error::Error>> {
+ let grammar = new_notes_grammar()?;
+
+ let atom = DefaultAtom::from_grammar(grammar)?;
+
+ println!("atom = {atom}");
+
+ Ok(())
+ }
+}