簡體   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