A second course in formal language and automata theory