2009-11-18 2 views
6

Какой предпочтительный способ поднять ошибки (ParseError) в Parsec? Я получил код внутри парсера, который выполняет проверку, и если проверка завершилась неудачей, необходимо вернуть ParseError (т. Е. Left ParseError при запуске parse).Raise ParseError в Haskell/Parsec

ответ

5

Для этого можно использовать Text.ParserCombinators.Parsec.Prim.unexpected и Control.Monad.fail. Оба принимают аргумент String, обозначающий сообщение об ошибке, и возвращают (в данном случае) значение типа GenParser tok st a.

Подробнее см. Text.ParserCombinators.Parsec.Error, в частности Message. Там вы можете прочитать, какую функцию использовать в этом случае (хотя оба означают ошибку синтаксического анализа, они семантически немного отличаются).

+0

Можете ли вы подробно рассказать о том, как их объединить с парсерами? например, когда имеет такой синтаксический анализатор: 'p = someparser <|> fail" error "' вещь, когда someparser не удалось выполнить его сообщение об ошибке, не исчезает, вместо этого добавляется строка «error». – niceman