感谢您发布的附加代码,不幸的是我无法重现该错误。
但你为什么不尝试删除最后一个attempt
?我认为这没有意义,而且可能会引起问题。
do readExprRef :=
choice
[attempt readBoolean
attempt readCharacter
attempt readString
attempt readInt
readError]
我不是 FParsec 专家,但我认为最后一个解析器的选择不应该是一种尝试。
UPDATE:
The readError
如果在某个时刻您调用了,即使不消耗任何输入,解析器也会成功readExpr
作为 a 的参数many
它永远不会结束。
我的意思是如果你打电话
run (many readError) "" ;;
您会收到该错误消息,因为many
将继续应用该解析器直到它失败,但它永远不会失败。
查看restOfLine 函数规范:http://www.quanttec.com/fparsec/reference/charparsers.html#members.restOfLine http://www.quanttec.com/fparsec/reference/charparsers.html#members.restOfLine它会警告您这一点。
现在有很多方法可以解决它,但我想说你必须重新考虑处理解析器错误的方式。
你可以做的一件事就是取出readError
函数,然后当你调用 readExpr
解析器你这样称呼它
let readExprs = many readExpr .>> eof
这样做可以强制执行 eof,如果在 eof 之前的选择中解析器未处理某些内容,FParsec 将自动为您生成一条不错的错误消息。
如果您想处理该错误,请查看http://www.quanttec.com/fparsec/users-guide/customizing-error-messages.html http://www.quanttec.com/fparsec/users-guide/customizing-error-messages.html