Parsing 如何调试ReadP解析器?
我已经使用编写了一个简单的解析器。它可以工作,但我将它用作一种验证解析器,因为输入是手动编写的,有时会偏离规范。为了纠正输入,我想知道解析器在哪一行失败,所以我的问题是: 如何获得显示解析器在哪一行输入中失败的调试消息,如(对于Parsec)中所示Parsing 如何调试ReadP解析器?,parsing,haskell,Parsing,Haskell,我已经使用编写了一个简单的解析器。它可以工作,但我将它用作一种验证解析器,因为输入是手动编写的,有时会偏离规范。为了纠正输入,我想知道解析器在哪一行失败,所以我的问题是: 如何获得显示解析器在哪一行输入中失败的调试消息,如(对于Parsec)中所示 (顺便说一句,我对haskell是相当陌生的。)ReadP不提供错误报告功能。从ReadP解析器的类型可以看出: newtype ReadP a = R (forall b . (a -> P b) -> P b) data P a
(顺便说一句,我对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
构造函数没有存储任何信息
为此,您需要使用不同的解析器组合器库(或构建您自己的库)。嗯,好吧!谢谢你告诉我如何找到答案,我会记住:)嗯,好的!谢谢你告诉我如何找到答案,我会记住:)