Many major, modern compilers use hand-written recursive descent parsers. While parser generators like Yacc and Bison were popular in the past, a hand-written approach has become the preferred method for many production-level compilers. 

Examples of major compilers using recursive descent

Reasons for preferring hand-written parsers

Potential drawbacks

For most modern production-level compilers, the trade-off of greater developer control and better diagnostics is worth the extra development effort of writing a recursive descent parser by hand. 

Parser generators

Despite the industry trend toward hand-written parsers, parser generators remain a powerful and fascinating area of study. My experience began with classic tools such as yacc, bison, lex, and flex, and has since expanded to more modern generators like antlr, tatsu, egg, rust-peg, pigeon, and pegen. This exploration covers a spectrum of design philosophies: some generators enforce a separation of concerns by deferring logic to a post-parsing AST walker, while others allow for semantic actions to be embedded directly within the grammar specification (EBNF). Furthermore, these tools vary in their approach to AST construction; some automatically generate an AST from the grammar, others require manual construction via embedded logic, and a few utilize formalisms like the Abstract Syntax Definition Language (ASDL).