我有一个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。
答案 0 :(得分:2)
根据消费的整个输入应该是parseNoteDocument
的属性还是只是测试的属性,我会使用endOfInput
或atEnd
扩展其中一个。
我建议为您的文档定义合适的Parser
,例如
parseNoteDocument' :: Text -> Parsec NoteDocument
parseNoteDocument' = many parseLine
然后根据它定义parseNoteDocument
。然后,您可以在测试中使用parseNoteDocument'
,通过定义使用
parseNoteDocument' <* endOfInput
确保消耗整个输入。