我想编写一个Parsec解析器来解析一系列数字,返回一个排序列表,但是遇到重复的数字时失败(错误应该指向副本的位置)。对于已排序的部分,我可以简单地使用:
manySorted = manyAccum insert
但如果列表中已有数字,如何触发 Parsec 错误。看起来很多人都不会允许这样做,而且我无法弄清楚如何制作我自己的manyAccum克隆(实现使用的unParser似乎不会暴露在Parsec库之外)。
答案 0 :(得分:1)
您可以尝试通过
获取当前解析器的位置sourcePos :: Monad m => ParsecT s u m SourcePos
sourcePos = statePos `liftM` getParserState
然后将位置与已解析的值一起累积,以便您可以报告原始位置。
答案 1 :(得分:0)
如果您确定希望解析器执行此操作,则可以使用带有错误消息的fail
方法从解析器中失败。 (完成错误位置,并尝试其他<|>
种可能性,等等。)