[−][src]Crate automafish
Automafish DFA builder
Makes state machines that do things
Automafish can be used to optimize state machines defined through states and overlapping transitions into more effective-to-evaluate deterministic forms.
In technical terms Automafish takes nondeterministic Moore machines and creates a deterministic state machine for it through powerset construction.
Example
use std::iter::FromIterator; use automafish::{Builder, State, Transition, Criteria, Condition}; let mut builder : Builder<Condition<char>, &mut dyn FnMut(&mut char)> = Builder::new(); // Set up an automata that capitalizes first character of a word. let mut upper_case = |mut c: &mut char| { c.make_ascii_uppercase(); }; let wait_not_space = builder.create_initial_state(); let first_not_space = builder.add_state(State::with_action(&mut upper_case)); let wait_for_space = builder.add_state(State::new()); builder.add_transition(Transition::new( wait_not_space, Condition::Is(vec![' ']), wait_not_space)); builder.add_transition(Transition::new( wait_not_space, Condition::Not(vec![' ']), first_not_space)); builder.add_transition(Transition::new( first_not_space, Condition::Not(vec![' ']), wait_for_space)); builder.add_transition(Transition::new( first_not_space, Condition::Is(vec![' ']), wait_not_space)); builder.add_transition(Transition::new( wait_for_space, Condition::Not(vec![' ']), wait_for_space)); builder.add_transition(Transition::new( wait_for_space, Condition::Is(vec![' ']), wait_not_space)); // Set up an automata that counts all exclamation marks. // This automata modifies a value outside the state machine. let mut exclamations = 0; let mut exclamation_counter = |_: &mut char| { exclamations += 1; }; let wait_exclamation = builder.create_initial_state(); let exclamation = builder.add_state(State::with_action(&mut exclamation_counter)); builder.add_transition(Transition::new( wait_exclamation, Condition::Any, wait_exclamation)); builder.add_transition(Transition::new( wait_exclamation, Condition::Is(vec!['!']), exclamation)); // Build the machine. let mut machine = builder.build(); // Execute the machine on an input string. let mut current_state = machine.start(); let mut input : Vec<char> = "hello world! this is rust!".chars().collect(); for i in &mut input { current_state = machine.step_and_execute_mut(current_state, i); } let output : String = String::from_iter(input); assert_eq!("Hello World! This Is Rust!", output); assert_eq!(2, exclamations);
Structs
Builder | A state machine builder. |
State | A state machine state. |
StateMachine | A compiled state machine. |
Transition | A state machine transition. |
Enums
Condition | A basic "is" or "is not" condition criteria. |
Traits
Action | Action that may be executed when entering a state. |
ActionMut | Action that may be executed when entering a state and may mutate its inner state. |
Criteria | A trait defining transition criteria. |