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

attoparsec: succeeding on part of the input instead of failing

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

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

否则很高兴获得部分解析的输入,它绝对有用,我很高兴拥有它。但是我想知道整个输入没有被消耗。也许是为了获得最后使用的字母的字符偏移量,或者如果需要的话,至少可以选择 returned 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.

取决于消耗整个输入是否应该是 parseNoteDocument 的 属性 或只是测试,我会用 endOfInput 或 [=14= 扩展一个或另一个].

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

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

然后根据它定义parseNoteDocument。然后,您可以在测试中使用 parseNoteDocument',方法是定义一个使用

解析给定文本片段的助手
parseNoteDocument' <* endOfInput

以确保消耗整个输入。