Parsing 如何调试ReadP解析器?

Parsing 如何调试ReadP解析器?,parsing,haskell,Parsing,Haskell,我已经使用编写了一个简单的解析器。它可以工作,但我将它用作一种验证解析器,因为输入是手动编写的,有时会偏离规范。为了纠正输入,我想知道解析器在哪一行失败,所以我的问题是: 如何获得显示解析器在哪一行输入中失败的调试消息,如(对于Parsec)中所示 (顺便说一句,我对haskell是相当陌生的。)ReadP不提供错误报告功能。从ReadP解析器的类型可以看出: newtype ReadP a = R (forall b . (a -> P b) -> P b) data P a

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

如何获得显示解析器在哪一行输入中失败的调试消息,如(对于Parsec)中所示


(顺便说一句,我对haskell是相当陌生的。)

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
构造函数没有存储任何信息


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

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
构造函数没有存储任何信息


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

嗯,好吧!谢谢你告诉我如何找到答案,我会记住:)嗯,好的!谢谢你告诉我如何找到答案,我会记住:)