是否有可能以某种方式获得某些自定义类型的解析错误?例如,从错误中获取有关解析上下文的更多信息会很酷。以文本消息的形式出现错误信息似乎不太方便。
答案 0 :(得分:8)
正如Rhymoid观察到的那样,不幸的是,这是不可能的。
将Parsec
与您自己的Either
结合使用 - 就像monad一样 - 也会过早退出(ParsecT
超过Either
)或太晚({} {1}}超过EitherT
)。
如果你想要它,你可以这样做:使用ParsecT
而不是ParsecT
。 (您不能使用Parsec的用户状态,因为错误将被回溯。)
每次您想要发出结构化错误值时,请将其记录在当前位置的状态中,但如果当前位置比已记录的位置更远,则仅 。 (如果位置相同,您可能想要以某种方式合并错误。也许保留它们的列表。)
最后,当您运行monad堆栈时,您将获得最终状态以及包含State (SourcePos, YourErrorType)
的{{1}}。只需检查两个位置是否重合。如果他们没有(即Parsec的ParseError
更远),那么你没有这个错误的错误值。