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)]
,但我希望解析器失败。
答案 0 :(得分:3)
您应该在解析器的末尾匹配EOF。使用提供的eof
来执行此操作。如果没有eof
,解析器将与文件末尾不匹配,并且将很乐意仅解析部分输入。
在do
区块中:
do
res <- {- Your parser code here -}
eof
return res
或者只使用&lt; *运算符:parser <* eof
即可。