Hi Fabien,
If the grammar is really well structure, it's sometimes possible to
simply include erroneous constructs within the grammar, as long as they
don't cause conflicts. That's the most robust approach to handle known
errors.
The general problem is that there's an infinite number of erroneous
constructs. It's simply impossible for a parser to know which valid
construct was desired by the user.
Even programs which are free from parsing errors contain errors, because
the users didn't write what he really wanted, or maybe he was confused
about the outcome of his code, or maybe the user simply forgot to
declare a variable.
Anyway, the idea is that the number of possible mistakes is infinite.
Doing "error recovery" while minimizing false positives is very
difficult to achieve, and often useless.
If I wanted to give more flexibility to users of a language, I would
just try to design a lighter and more flexible syntax, instead of trying
to rely on unreliable error recovery.