Formal languages and automata theory