如何用parsec解析许多失败?

时间:2018-04-11 08:53:49

标签: parsing haskell parsec

Apoligies如果这是一件微不足道的事情,但我真的无法自己找到它。

预赛

我有一个包含许多条目的文件,例如FOO <value>,例如:

# example.txt
FOO 5
FOO 9

这样一个字符串读取的文件是FOO 5\nFOO 9\n。我试图用

解析这些
parseFoo :: ParsecT String u Identity (String, Int)
parseFoo = do
    k <- string "FOO"
    _ <- space
    v <- many1 digit
    return (k, read v)

parseFoos :: ParsecT String u Identity [(String, Int)]
parseFoos = parseFoo `endBy` newline

testFOO :: Either ParseError [(String, Int)]
testFOO = parse parseFoos "" "FOO 5\nFOO 6\n"

这给了Right [("FOO",5),("FOO",6)]预期的效果。

我的问题

如何解析无效输入?

例如:parse parseFoos "" "BLAH"返回Right [],但我希望解析器失败。

例如:parse parseFoos "" "FOO 5\nBAR 7\n"返回Right [("FOO", 5)],但我希望解析器失败。

1 个答案:

答案 0 :(得分:3)

您应该在解析器的末尾匹配EOF。使用提供的eof来执行此操作。如果没有eof,解析器将与文件末尾不匹配,并且将很乐意仅解析部分输入。

do区块中:

do
    res <- {- Your parser code here -}
    eof
    return res

或者只使用&lt; *运算符:parser <* eof即可。