Expand description
§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.
- State
Machine - A compiled state machine.
- Transition
- A state machine transition.
Enums§
- Condition
- A basic “is” or “is not” condition criteria.