我用readP编写了一个简单的解析器.它可以工作,但我正在使用它作为一种验证解析器,因为输入是手动编写的,有时会偏离规范.为了纠正输入,我想知道我的解析器在哪一行失败,所以我的问题是:
如何获得一个调试消息,显示我的解析器输入哪一行失败,如现实世界haskell(Parsec)中所示?
(我对哈斯克尔很新,顺便说一下.)
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构造函数不存储任何信息.
您将需要使用不同的解析器组合器库(或构建您自己的).