Haskell 如何在manyAccum解析器期间触发错误
我想编写一个Parsec解析器,它将解析一个数字序列,返回一个排序列表,但在遇到重复的数字时失败(错误应该指向重复的位置)。对于已排序的部分,我可以简单地使用:Haskell 如何在manyAccum解析器期间触发错误,haskell,parsec,parser-combinators,Haskell,Parsec,Parser Combinators,我想编写一个Parsec解析器,它将解析一个数字序列,返回一个排序列表,但在遇到重复的数字时失败(错误应该指向重复的位置)。对于已排序的部分,我可以简单地使用: manySorted = manyAccum insert 但是,如果该数字已经在列表中,如何触发Parsec错误呢。manyAccum似乎不允许这样做,我也不知道如何制作我自己的manyAccum克隆(实现使用的是未暴露在Parsec库之外的unParser)。如果您确定希望解析器这样做,您可以使用带有错误消息的fail方法退出解析
manySorted = manyAccum insert
但是,如果该数字已经在列表中,如何触发Parsec错误呢。manyAccum似乎不允许这样做,我也不知道如何制作我自己的manyAccum克隆(实现使用的是未暴露在Parsec库之外的unParser)。如果您确定希望解析器这样做,您可以使用带有错误消息的
fail
方法退出解析器。(填写错误位置,并尝试其他可能性,等等。)您可以通过
sourcePos :: Monad m => ParsecT s u m SourcePos
sourcePos = statePos `liftM` getParserState
然后将这些位置与解析的值一起累加,以便报告原始位置。您确定这是解析器的工作吗?通常,这种类型的行为会出现在流程的不同部分。请尝试首先解析所有数字,然后检查所有必要的条件。通过这种方式,您可以轻松地抛出异常或返回
Left
,例如。这就是我现在正在做的,但是如果能在错误消息中找到重复项的位置就好了。我猜数字解析器可以从解析器状态中获取位置,并将其与结果一起返回,以便稍后用于错误。这种模式适合这种情况吗?