Also, https://matklad.github.io/2018/06/06/modern-parser-generator.html is worth a read even if you're only kind of interested in parsers. There's epiphanies in it. Like:
Regular languages (regex's) are state machines with a fixed memory space.
Full Turing machine languages are state machines with two stacks of memory space (moving the Tape is popping an item from one stack and pushing it to the other).
Context-free languages are exactly in the middle: they're state machines with one stack.
I don't know what it means but it's deep.