When merging error messages, prefer known messages to unknown ones

This fixes a regression introduced by:

Sun Feb 20 18:24:22 EET 2011  Roman Cheplyaka <roma@ro-che.info>
  * Choose the longest match when merging error messages

The source of the regression is that parsec sometimes generates dummy (aka
"unknown") error messages when no actual error has occurred.

So, when merging errors, before simply looking at the positions we should check
if one of them is unknown and just ignore it.

Reported by Matthias Hörmann.
This commit is contained in:
Roman Cheplyaka 2012-05-30 22:38:09 +00:00
parent 1bac97f3b5
commit b8990ab042

View File

@ -134,12 +134,16 @@ setErrorMessage msg (ParseError pos msgs)
= ParseError pos (msg : filter (msg /=) msgs)
mergeError :: ParseError -> ParseError -> ParseError
mergeError (ParseError pos1 msgs1) (ParseError pos2 msgs2)
mergeError e1@(ParseError pos1 msgs1) e2@(ParseError pos2 msgs2)
-- prefer meaningful errors
| null msgs2 && not (null msgs1) = e1
| null msgs1 && not (null msgs2) = e2
| otherwise
= case pos1 `compare` pos2 of
-- select the longest match
EQ -> ParseError pos1 (msgs1 ++ msgs2)
GT -> ParseError pos1 msgs1
LT -> ParseError pos2 msgs2
GT -> e1
LT -> e2
instance Show ParseError where
show err