deterministic finite state automaton