0

我有一个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 []

这是来自那个测试

4

1 回答 1

2

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

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

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

然后parseNoteDocument根据它来定义。然后,您可以parseNoteDocument'通过定义一个帮助器来在测试中使用,该帮助器使用

parseNoteDocument' <* endOfInput

以确保消耗整个输入。

于 2015-06-21T19:14:33.200 回答