introduction to deterministic finite automata