The only correct answer is a handwritten recursive descent parser. All other discussion of parser generators is CS wankery committed by compiler professors so they don't have to cover any actually hard problems like code generation, register allocation, and redundancy elimination.