2015-06-21 70 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'约束,看看尽管可以通过。当我将解析器分发给最终用户时,在这种情况下并不能真正帮助我。但我想我不能做太多。好吧,无论如何,谢谢你,这就是答案! –