如何调试ReadP解析器?

时间:2017-11-03 15:18:09

标签: parsing haskell

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

如何获取调试消息,显示我的解析器输入失败的哪一行,如real world haskell中显示的那些(对于Parsec)?

(我对哈斯克尔来说相当新,顺便说一句。)

1 个答案:

答案 0 :(得分: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

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

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