manyTill charLiteral (char '"')用于解析字符串文字(-6ren">
gpt4 book ai didi

haskell - 为什么 "between (char ' "') (char ' "') (many charLiteral)"不能用于解析字符串文字?

转载 作者:行者123 更新时间:2023-12-03 20:25:45 25 4
gpt4 key购买 nike

Text.Megaparsec.Char.Lexer.charLiteral 的文档建议使用 char '"' *> manyTill charLiteral (char '"')用于解析字符串文字(其中 manyTill 在模块 Control.Applicative.Combinators 中定义在 parser-combinators 库中)。

但是,Control.Applicative.Combinators还定义了 between ,据我所知,在这样使用时应该与上述建议相同:between (char '"') (char '"') (many charLiteral) .

但是,使用 between上面的解析器不适用于解析字符串文字 - 以“输入意外结束”失败。
期待 '"' 或文字字符"(表示从未检测到结尾引号)。为什么不?

此外,更一般地说,为什么不是 between pBegin pEnd (many p)相当于 pBegin *> manyTill p pEnd ?

最佳答案

between l r m没有做任何壮观的事情,它真的只是尝试l然后 m然后 r并返回 m 的结果.所以,在 between (char '"') (char '"') (many charLiteral) , many charLiteral不知道它不应该消耗 " . many只是不断消耗它的参数解析器接受的任何东西......因为charLiteral只接受任何东西,这意味着它会在所有内容中搅动,直到输入结束。第二个char '"'没有办法阻止它,它只需要处理剩下的东西......即,失败,因为什么都没有了!

相比之下,manyTill实际上检查“直到”是否匹配,并且仅在不匹配时才应用内容解析器的每次迭代。因此,终止 "未传递给 charLiteral ,然后您将获得所需的行为。

关于haskell - 为什么 "between (char ' "') (char ' "') (many charLiteral)"不能用于解析字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61631282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com