获取 Parsec 的左输入

Get Parsec's left input

我想知道是否有办法在 Parsec 停止解析后从它获取剩余输入,无论是解析成功还是失败,也许这个签名:

parseRemaining :: Stream s Identity t => Parsec s () a -> SourceName -> s -> (s, Either ParseError a)

我们得到的不是 Either ParseError a,而是另外得到剩余的 Stream s

您可以使用 getInput,这是一个 returns 剩余输入的解析器。

我深入了解了 Parsec 的内部结构,但未能找到一种简单的方法来恢复状态信息(其中包含流)。

一个临时解决方案是检查您收到的错误,然后使用其位置信息推断解析停止的位置。 (当然,这只有在您的流支持搜索时才有效。)

看看Megaparsec — Parsec 的现代分支,从 4.2.0 版开始它允许提供 在解析开始时自定义状态并在结束时提取解析器状态(它 解析器成功或失败都没有关系)。这允许部分解析 输入,恢复解析,指定 non-standard 初始文本位置, 等见 runParser'runParserT'.


披露:我是 Megaparsec 的作者之一。