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
以确保消耗整个输入。
我有一个 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
以确保消耗整个输入。