This course introduces students to the theoretical foundations of computer science through the study of formal languages and automata theory. Students with little to no prior exposure to automata concepts will build understanding progressively, starting from a review of discrete mathematics foundations and advancing through finite automata, regular expressions and languages, context-free grammars, pushdown automata, Turing machines, and the fundamentals of decidability and computational complexity. The course emphasizes both formal proof and constructive design: students learn to prove properties of languages mathematically and to design automata and grammars that recognize or generate them. The laboratory component reinforces these concepts through automata simulation software (e.g., JFLAP) and programming exercises, culminating in a case study or project that applies automata-theoretic principles to a practical computing problem such as a lexical analyzer or pattern-matching engine. As a 4th-year course, it equips students with the theoretical grounding essential for compiler design, formal verification, algorithm analysis, and other advanced areas of computer science.

- Teacher: Angelo Joaquin