Was there a language change that required it or some practical reason why Bison was no longer appropriate or optimal?
These release notes state:
A hand-written recursive-descent C++ parser has replaced the YACC-derived C++ parser from previous GCC releases. The new parser contains much improved infrastructure needed for better parsing of C++ source codes, handling of extensions, and clean separation (where possible) between proper semantics analysis and parsing. The new parser fixes many bugs that were found in the old parser.
The old Bison-based C and Objective-C parser has been replaced by a new, faster hand-written recursive-descent parser
What I would like to know is what actual problems were they having and why it was impossible / impractical to solve using Bison