automaton

An automaton library written in Rust
Log | Files | Refs

commit 994f86650d03433ed3ca4ec9c649c335eee25f96
parent f5e3b90bbda00a01ab80a0585e825214ad6fc49e
Author: Ethan Long <ethan@Ethans-MacBook-Pro.local>
Date:   Wed, 29 Nov 2023 15:57:42 +1100

Some minor prettification

Diffstat:
Msrc/bin/dfa.rs | 16+++++++++-------
Msrc/bin/nfa.rs | 14+++++++++-----
Msrc/lib/automaton.rs | 5++++-
Msrc/lib/nfa.rs | 20+++++++++-----------
Msrc/lib/tests/nfa_tests.rs | 12++++++++++--
5 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/src/bin/dfa.rs b/src/bin/dfa.rs @@ -1,9 +1,9 @@ +use automaton::{dfa::DFA, Automaton, Encodable}; use std::{env, error::Error, fmt::Display, fs}; -use automaton::{dfa::DFA,Encodable,Automaton}; #[derive(Debug)] struct CommandLineError { - reason: String + reason: String, } impl Display for CommandLineError { @@ -15,7 +15,7 @@ impl Display for CommandLineError { impl CommandLineError { fn cause(reason: &str) -> Self { CommandLineError { - reason: reason.to_owned() + reason: reason.to_owned(), } } } @@ -30,11 +30,15 @@ fn main() -> Result<(), Box<dyn Error>> { let args: Vec<String> = env::args().collect(); if args.len() != 3 { - return Err(Box::new(CommandLineError::cause(&usage(args.get(0).map_or("automaton", |s| s))))); + return Err(Box::new(CommandLineError::cause(&usage( + args.get(0).map_or("automaton", |s| s), + )))); } let dfa_json = fs::read_to_string(args.get(1).unwrap_or(&"".to_owned()))?; - let input_string = args.get(2).ok_or(Box::new(CommandLineError::cause("No input string provided!")))?; + let input_string = args + .get(2) + .ok_or(CommandLineError::cause("No input string provided!"))?; let dfa: DFA = DFA::parse(dfa_json.as_str())?; println!("DFA:\n{dfa}\n"); @@ -43,5 +47,3 @@ fn main() -> Result<(), Box<dyn Error>> { Ok(()) } - - diff --git a/src/bin/nfa.rs b/src/bin/nfa.rs @@ -1,9 +1,9 @@ +use automaton::{dfa::DFA, nfa::NFA, Automaton, Encodable, FiniteStateAutomaton}; use std::{env, error::Error, fmt::Display, fs}; -use automaton::{nfa::NFA,Encodable,Automaton,dfa::DFA, FiniteStateAutomaton}; #[derive(Debug)] struct CommandLineError { - reason: String + reason: String, } impl Display for CommandLineError { @@ -15,7 +15,7 @@ impl Display for CommandLineError { impl CommandLineError { fn cause(reason: &str) -> Self { CommandLineError { - reason: reason.to_owned() + reason: reason.to_owned(), } } } @@ -30,11 +30,15 @@ fn main() -> Result<(), Box<dyn Error>> { let args: Vec<String> = env::args().collect(); if args.len() != 3 { - return Err(Box::new(CommandLineError::cause(&usage(args.get(0).map_or("automaton", |s| s))))); + return Err(Box::new(CommandLineError::cause(&usage( + args.get(0).map_or("automaton", |s| s), + )))); } let nfa_json = fs::read_to_string(args.get(1).unwrap_or(&"".to_owned()))?; - let input_string = args.get(2).ok_or(Box::new(CommandLineError::cause("No input string provided!")))?; + let input_string = args + .get(2) + .ok_or(CommandLineError::cause("No input string provided!"))?; let nfa: NFA = NFA::parse(nfa_json.as_str())?; println!("NFA:\n{nfa}\n"); diff --git a/src/lib/automaton.rs b/src/lib/automaton.rs @@ -17,7 +17,10 @@ pub trait FiniteStateAutomaton: Automaton { Self: Sized; } -pub trait Encodable<T> where Self: Sized { +pub trait Encodable<T> +where + Self: Sized, +{ fn parse(encoding: T) -> Result<Self, Box<dyn Error>>; } diff --git a/src/lib/nfa.rs b/src/lib/nfa.rs @@ -107,7 +107,9 @@ impl FiniteStateAutomaton for NFA { let current_states = state_reverse_map .clone() .get(&current_newstate) - .ok_or(NFAParseError::error("We should have already added this state into the reverse map!"))? + .ok_or(NFAParseError::error( + "We should have already added this state into the reverse map!", + ))? .to_owned(); let to: BTreeSet<u64> = current_states .iter() @@ -131,7 +133,8 @@ impl FiniteStateAutomaton for NFA { state_forward_map.insert(to.clone(), newest_newstate); state_reverse_map.insert(newest_newstate, to.clone()); transition_table.insert((current_newstate, *c), newest_newstate); - if to.len() == 0 { // Trap state! + if to.len() == 0 { + // Trap state! for c in self.alphabet.iter() { transition_table.insert((newest_newstate, *c), newest_newstate); } @@ -271,16 +274,11 @@ impl Encodable<Value> for NFA { .iter() .map(|v| v.as_u64()) .collect::<Option<_>>() - .ok_or(NFAParseError::error( - "Could not convert the states to u64", - ))?; + .ok_or(NFAParseError::error("Could not convert the states to u64"))?; - let initial_state: u64 = - json["initial_state"] - .as_u64() - .ok_or(NFAParseError::error( - "Initial state incorrectly formatted", - ))?; + let initial_state: u64 = json["initial_state"] + .as_u64() + .ok_or(NFAParseError::error("Initial state incorrectly formatted"))?; let final_states: HashSet<u64> = json["final_states"] .as_array() diff --git a/src/lib/tests/nfa_tests.rs b/src/lib/tests/nfa_tests.rs @@ -1,4 +1,8 @@ -use crate::{nfa::NFA, Automaton, Encodable, FiniteStateAutomaton, tests::testlib::util::{rand_string, read_directory}}; +use crate::{ + nfa::NFA, + tests::testlib::util::{rand_string, read_directory}, + Automaton, Encodable, FiniteStateAutomaton, +}; use std::fs; #[test] @@ -43,7 +47,11 @@ fn run_static_nfa_tests() { .collect(); assert_eq!(inputs.len(), expected.len()); for ((index, input), expect) in inputs.iter().enumerate().zip(expected) { - assert_eq!(nfa.accepts(input), expect, "Test no: {index}, input: {input}"); + assert_eq!( + nfa.accepts(input), + expect, + "Test no: {index}, input: {input}" + ); } println!( "Successfully ran {} tests in {}",