[英]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.