Theory of Automata Formal language and computation