这是我的玩具文件:
import Text.Megaparsec
import Text.Megaparsec.Char
import Data.Void (Void)
type Parser = Parsec Void String
myParser :: Parser String
myParser = do
d <- digitChar
c <- letterChar
return $ replicate (read [d]) c
现在,从 ghci 开始,如果我输入,parseTest (myParser <?> "foo") "3a"
我会得到"aaa"
预期的结果,但如果我输入parseTest (myParser <?> "foo") "33a"
,我会得到:
1:2:
|
1 | 33a
| ^
unexpected '3'
expecting letter
在这个简单的情况下,错误消息是有意义的(我必须输入一个字母而不是另一个数字),但在编写更复杂的解析器时,letterChar
可能会出现在任意数量的复合解析器中,因此不清楚哪个 letterChar
是失败的。由于我为解析器传递了一个标签foo
,因此如果错误消息显示如下内容,我会希望它:
1:2:
|
1 | 33a
| ^
error while parsing foo:
unexpected '3'
expecting letter
更一般地说,只要我使用 给解析器标签<?>
,我就希望显示错误的整个回溯,例如:
error while parsing grandparent:
error while parsing parent:
unexpected '3'
expecting letter
有没有办法在百万秒差距中做到这一点?