我有一个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
的属性还是只是测试的属性,我会用endOfInput
或atEnd
扩展一个或另一个。
我建议为您的文档定义一个适当的Parser
,例如
parseNoteDocument' :: Text -> Parsec NoteDocument
parseNoteDocument' = many parseLine
然后根据它定义parseNoteDocument
。然后,您可以在测试中使用parseNoteDocument'
,方法是定义一个帮助程序,该帮助程序使用以下方法解析给定的文本片段
parseNoteDocument' <* endOfInput
以确保消耗整个输入。