Automata theory and formal languages from scratch in Python, no dependencies: DFA/NFA with Hopcroft minimisation, regular expressions via Thompson and Brzozowski derivatives, context-free grammars ...