繁体   English   中英

如何使用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"返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM