相关疑难解决方法(0)

如何在parsec中给指定位置失败消息

我需要给失败消息以秒为单位的给定位置。

在给出意外错误消息之前,我尝试通过设置位置来进行操作,但是它没有用:

runParser ( do pos0 <- getPosition
               id <- many1 alphaNum
               if (id == reverse id) then return id
                                     else setPosition pos0 >> unexpected id
               eof )
          () "" "abccbb"
Run Code Online (Sandbox Code Playgroud)

回馈

Left (line 1, column 7):
unexpected end of input
expecting letter or digit
Run Code Online (Sandbox Code Playgroud)

正确的答案是:

unexpected abccbb
expecting letter or digit
Run Code Online (Sandbox Code Playgroud)

通过省略可以生产(位置错误) setPosition pos0 >>代码。

我的解决方法是进行解析,将正确和实际的错误位置保存在parsec的用户状态下,并更正错误位置,但是我想要一个更好的解决方案。

正如AndrewC所要求的那样,它是向用户提供带有更多信息的错误消息的一部分。例如,在某些地方,我们需要特殊的标识符,但是如果在解析器中对其进行编码,parsec将给出错误消息,例如“期望的ag,得到一个r,位置在标识符的中间”。正确的消息应该是“标识符应采用特殊格式,但位置为'abccbb',位置在标识符之前”。如果有更好的方法可以发出这样的错误消息,那将是对我们问题的正确答案。但是我也很好奇为什么parsec会那样,为什么我不能引发自定义错误消息,指向我想要的位置。

haskell parsec

5
推荐指数
1
解决办法
157
查看次数

标签 统计

haskell ×1

parsec ×1