Attoparsec:在部分输入上成功而不是失败



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

请注意,我使用 parseOnly 来明确表示不会再有输入。

否则,获得部分解析的输入很好,它绝对有用,我很高兴拥有它。但是,我希望被告知整个输入没有被消耗。也许是为了获得最后一个消耗的字母的字符偏移量,或者如果这是需要的,至少要返回的选项Left.

如果相关,可以在此处找到解析器。

例如,如果我评论该行:

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

并运行测试,例如:

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

这是来自那个测试。

根据消耗整个输入应该是parseNoteDocument的属性还是只是测试的属性,我会用endOfInputatEnd扩展一个或另一个。

我建议为您的文档定义一个适当的Parser,例如

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

然后根据它定义parseNoteDocument。然后,您可以在测试中使用parseNoteDocument',方法是定义一个帮助程序,该帮助程序使用以下方法解析给定的文本片段

parseNoteDocument' <* endOfInput

以确保消耗整个输入。

相关内容

  • 没有找到相关文章

最新更新