> The best option is a clean grammar in Yacc/Bison!. GCC had such parsers for over a decade, and yet they are being replaced.
Bison remains a good solution in many cases, especially for languages specifically designed to be easy to parse with an LALR parser (that is, languages that don't look like C). The biggest problem with Bison and other table-driver parsers is error messages and error recovery. There have been research projects in making this better for such parsers, but you can always do better in a hand-written parser.