如何使用 parsec 解析许多失败?

How to fail on parse many with parsec?

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

预赛

我有一个包含许多条目的文件,例如 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" returns Right [],但我希望解析器失败。

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

您应该匹配解析器末尾的 EOF。使用提供的 eof 来完成它。如果没有 eof,解析器将不会匹配文件末尾,并且会愉快地只解析部分输入。

do块中:

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

或者只使用 <* 运算符:parser <* eof 就可以了。