如何在manyAccum解析器中触发错误

时间:2014-10-15 00:50:04

标签: haskell parsec parser-combinators

我想编写一个Parsec解析器来解析一系列数字,返回一个排序列表,但是遇到重复的数字时失败(错误应该指向副本的位置)。对于已排序的部分,我可以简单地使用:

manySorted = manyAccum insert

但如果列表中已有数字,如何触发 Parsec 错误。看起来很多人都不会允许这样做,而且我无法弄清楚如何制作我自己的manyAccum克隆(实现使用的unParser似乎不会暴露在Parsec库之外)。

2 个答案:

答案 0 :(得分:1)

您可以尝试通过

获取当前解析器的位置
sourcePos :: Monad m => ParsecT s u m SourcePos
sourcePos = statePos `liftM` getParserState

然后将位置与已解析的值一起累积,以便您可以报告原始位置。

答案 1 :(得分:0)

如果您确定希望解析器执行此操作,则可以使用带有错误消息的fail方法从解析器中失败。 (完成错误位置,并尝试其他<|>种可能性,等等。)