The parser
p <?> msg behaves as parser
p, but
whenever the parser
p fails
without consuming any
input, it replaces expect error messages with the expect error
message
msg.
This is normally used at the end of a set alternatives where we want
to return an error message in terms of a higher level construct rather
than returning all possible characters. For example, if the
expr parser from the
try example would fail, the error
message is: '...: expecting expression'. Without the
(<?>) combinator, the message would be like '...:
expecting "let" or letter', which is less friendly.