【发布时间】:2019-01-07 23:50:48
【问题描述】:
我正在使用 Parsec 制作解析器,并尝试在解析期间返回特定错误。
这是一个暴露我的问题的最小解析器示例:
parseA = try seq1
<|> seq2
seq1 = do
manyTill anyChar (try $ string "\n* ")
many1 anyChar
fail "My error message"
seq2 = do
manyTill anyChar (try $ string "\n- ")
many1 anyChar
我想在第一个try $ do 序列中执行一些测试并停止解析并返回特定的错误消息。
当我不使用fail 时,我得到:
ghci> parse parseA "" "aaaaaa\nbbbb\n* ccccc\n- ddd"
Right "ccccc\n- ddd"
当我使用fail 或unexpected 时,我的解析器不会停止(由于try 函数)并执行下一个do 序列:
ghci> parse parseA "" "aaaaaa\nbbbb\n* ccccc\n- ddd"
Right "ddd"
这不是我想要的!
我考虑使用基本的error 函数来停止我的解析器的执行,但我希望解析函数返回一个“干净”的错误,如下所示:
ghci> parse parseA "" "aaaaaa\nbbbb\n* ccccc\n- ddd"
Left "My error message"
您知道如何正确停止解析器并返回自定义错误吗?
【问题讨论】:
-
如果
seq1失败,它会打印出错误信息并尝试seq2?还是在seq1失败时停止解析?
标签: haskell error-handling text-parsing parsec