use super::token::Token;
pub struct FiniteStateMachine {
initial_state: u32,
accepting_states: Vec<u32>,
next_state: fn(u32, &Token) -> u32
}
impl FiniteStateMachine {
pub fn new(initial_state: u32, accepting_states: Vec<u32>, next_state: fn(u32, &Token) -> u32) -> FiniteStateMachine {
FiniteStateMachine {
initial_state,
accepting_states,
next_state
}
}
pub fn run<'a>(&self, tokens: &'a Vec<Token>) -> Result<(), (u32, &'a Token)> {
let mut state = self.initial_state;
for token in tokens {
let next_state = (self.next_state)(state, token);
if next_state == 0 {
return Err((state, token));
}
state = next_state;
}
if self.accepting_states.contains(&state) == false {
return Err((state, tokens.last().unwrap()));
}
Ok(())
}
}