Are you talking about hand coding a recursive descent parser
or using a parser generator that creates recursive descent
parse trees?
The one I know most about (Sun CC) is hand coded. I think g++
is too. If you're going to use a parser generator, you might as
well use one which uses LR, rather that LL, since it will be
able to handle a larger set of grammars. The advantage of a
hand coded recursive descent parser is that it is easier to
"fudge" cases where the language doesn't fit the grammar.
(Also, typically, you get much better error messages and error
recovery. Colloquially expressed: with an LL parser, such as
recursive descent, you know what you're looking for, which helps
greatly in formulating error messages and in resynchronizing;
with an LR parser, you know what you got, but in the case of an
error, all you really know is that you cannot do anything with
it.)
About 20
years ago (college) I wrote some recursive descent code for small grammars
to do statistical evaluation but could not fathom hand coding one for a
full scale language with a non-trival grammar. I believed an LALR type
parser generator was the de-facto standard for implementing non-trivial
projects.
I think that the general consensus is that LALR parsers are OK
for medium sized projects---they're overkill for very small
things, and the grammar soon becomes too wieldy, especially if
you start adding error productions, for very large languages.
Recursive descent has the advantage that it modularizes very
well.
And of course, almost no real languages can be described
directly by an LR grammar. Even something as simple as Pascal
requires a few simple hacks, and C++ is almost hopeless---the
recursive descent implementations I've heard of use backtracking
(which isn't formally allowed
).
And yes, it would seem that recursive descent would be easier
to hack but setting the thing up in the first place seems like
a nightmare.
Not really. It can be done in a very modular fashion, with each
function being fairly simple. And of course, anything that can
handle standard C++ isn't going to be simple; you need the
modularity to manage it.