Parsec和自定义解析错误类型

时间:2013-05-16 19:13:11

标签: haskell parsec

是否有可能以某种方式获得某些自定义类型的解析错误?例如,从错误中获取有关解析上下文的更多信息会很酷。以文本消息的形式出现错误信息似乎不太方便。

1 个答案:

答案 0 :(得分:8)

正如Rhymoid观察到的那样,不幸的是,这是不可能的。

Parsec与您自己的Either结合使用 - 就像monad一样 - 也会过早退出(ParsecT超过Either)或太晚({} {1}}超过EitherT)。

如果你想要它,你可以这样做:使用ParsecT而不是ParsecT。 (您不能使用Parsec的用户状态,因为错误将被回溯。)

每次您想要发出结构化错误值时,请将其记录在当前位置的状态中,但如果当前位置比已记录的位置更远,则仅 。 (如果位置相同,您可能想要以某种方式合并错误。也许保留它们的列表。)

最后,当您运行monad堆栈时,您将获得最终状态以及包含State (SourcePos, YourErrorType)的{​​{1}}。只需检查两个位置是否重合。如果他们没有(即Parsec的ParseError更远),那么你没有这个错误的错误值。