[英]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"
返回Right []
,但是我希望解析器失败。
例如: parse parseFoos "" "FOO 5\\nBAR 7\\n"
返回Right [("FOO", 5)]
,但是我希望解析器失败。
您应该在解析器的末尾匹配EOF。 使用提供的eof
进行操作。 没有eof
的解析器将不匹配文件的结尾,并且将很高兴地仅解析输入的一部分。
在do
块中:
do
res <- {- Your parser code here -}
eof
return res
或仅使用<*运算符: parser <* eof
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.