2015-06-21 68 views
0

我有一個attoparsec解析器,並測試它,讓我很煩惱的是,如果我註釋部分解析器並運行測試,解析器不會返回Left "parse error at line ..."但相反,我得到Right []attoparsec:成功輸入的一部分,而不是失敗

請注意,我使用parseOnly來說明不會有更多的輸入。

否則,獲得部分解析的輸入是非常好的,它絕對有用,我很樂意擁有它。不過,我希望被告知整個輸入未被消耗。也許要獲得最後一次消費字母的字符偏移量,或者如果這是需要的,至少要返回一個選項Left

如果相關,解析器可以找到there

如果我比如註釋行:

  <|> PlainText <$> choice (string <$> ["[", "]", "*", "`"]) 

並運行測試,我得到例如:

1) notes parsing tests parses notes properly 
     simple test 
     expected: Right [NormalLine [PlainText "one line* # hello world"]] 
     but got: Right [] 

這是that test

回答

2

根據是否消耗整個輸入應該是parseNoteDocument的屬性或者只是測試,我會延長一個或另一個endOfInputatEnd

我建議定義文檔適當Parser,像

parseNoteDocument' :: Text -> Parsec NoteDocument 
parseNoteDocument' = many parseLine 

,然後在它來定義parseNoteDocument。然後,你可以通過定義解析使用

parseNoteDocument' <* endOfInput 

,以確保整個輸入被消耗文本的一段給定的輔助使用的測試parseNoteDocument'

+0

對,隨着你的建議改變,而不是'Right []'我得到'Left「endOfInput」'。我記得用'attoparsec'讀了這個,你沒有得到用''parsec''包得到的精確錯誤報告。爲了調試的目的,我想可以暫時刪除'endOfInput'約束,看看盡管可以通過。當我將解析器分發給最終用戶時,在這種情況下並不能真正幫助我。但我想我不能做太多。好吧,無論如何,謝謝你,這就是答案! –