How Desmos uses Pratt Parsers
engineering.desmos.com
engineering.desmos.com
Skip over the large introduction to what parsing is and the reasons for switching are listed: Avoid the parser generator special syntax and compilation, better error messages, have the parser in the same language as the rest of their code, avoid having two grammar definitions (another for CodeMirror), faster and smaller JS bundle than generated code.
So the best of both worlds, it sounds to me, would be parser combinators: They're both native to the language, and they're DSLs. So there's only one set of syntax for the programmer, and they still compose declaratively as opposed to writing recursive parsers manually.
What I think is how provide a common parser layer yet allow to get the same benefits of a hand-made one. For some reason, this look like is impossible?
With recursive descent, you can always start adding break points until you understand the forces involved.