如何使用 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
就可以了。
抱歉,这是一件微不足道的事情,但我真的无法自己找到它。
预赛
我有一个包含许多条目的文件,例如 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
就可以了。