One thing that I like about PEG (among many) is that it's fairly easy to create useful error messages from them.
My approach has been to introduce a type of cut operator, such that if you backtrack past a cut operator then it's information is stored, then if the parsee can't proceed it can examine the stored errors and produce hopefully sensible error messages.
For example, if I have a simple rule for an expression
exp = atom (op exp)*
And I insert a cut between the op and the atom... exp = atom (op <cut> exp)*
Then that cut (which can be appropriately annotated with human readable error information) will be returned if there is a binary exp with no rhs