如何调试ReadP解析器?

bru*_*ato 1 parsing haskell

我用readP编写了一个简单的解析器.它可以工作,但我正在使用它作为一种验证解析器,因为输入是手动编写的,有时会偏离规范.为了纠正输入,我想知道我的解析器在哪一行失败,所以我的问题是:

如何获得一个调试消息,显示我的解析器输入哪一行失败,如现实世界haskell(Parsec)中所示?

(我对哈斯克尔很新,顺便说一下.)

Dan*_*ner 5

ReadP不提供错误报告功能.从ReadP解析器的类型可以看出这一点:

newtype ReadP a = R (forall b . (a -> P b) -> P b)
data P a
  = Get (Char -> P a)
  | Look (String -> P a)
  | Fail
  | Result a (P a)
  | Final [(a,String)] -- invariant: list is non-empty!
  deriving Functor
Run Code Online (Sandbox Code Playgroud)

您可以看到Fail构造函数不存储任何信息.

您将需要使用不同的解析器组合器库(或构建您自己的).