attoparsec:成功完成部分输入而不是失败

时间:2015-06-21 18:24:28

标签: haskell attoparsec

我有一个attoparsec解析器,并对它进行测试,让我烦恼的是,如果我评论部分解析器并运行测试,解析器不会返回Left "parse error at line ..."而是我得到Right []

请注意,我使用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

1 个答案:

答案 0 :(得分:2)

根据消费的整个输入应该是parseNoteDocument的属性还是只是测试的属性,我会使用endOfInputatEnd扩展其中一个。

我建议为您的文档定义合适的Parser,例如

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

然后根据它定义parseNoteDocument。然后,您可以在测试中使用parseNoteDocument',通过定义使用

解析给定文本的帮助程序
parseNoteDocument' <* endOfInput

确保消耗整个输入。