Most real production compilers don't use lexer or parser generators.
Do those not count? What are the tradeoffs to doing it from scratch?
Using tools is often more complicated than just writing code, it isn't that hard to write a recursive descent parser, and you have the flexibility if loading it with all the error recovery you want. What tools give you is potentially better parser performance and more theoretic assurances (useful for tricky grammars).