【问题标题】:Incremental Parsing from Handle in HaskellHaskell 中的句柄增量解析
【发布时间】:2013-04-01 21:30:31
【问题描述】:

我正在尝试将 Haskell 与具有 read-eval-print 循环的命令行程序连接。我想将一些文本放入输入句柄中,然后从输出句柄中读取,直到找到提示(然后重复)。读取应该阻塞,直到找到提示,但不再阻塞。与其编写我自己的小型状态机,每次读取一个字符直到它构造一个提示符,不如使用 Parsec 或 Attoparsec。 (一个问题是提示会随着时间而变化,所以我不能只检查恒定的字符串。)

从输出句柄中读取适当数量的数据并将其提供给解析器的最佳方法是什么?我很困惑,因为大多数句柄读取原语都要求我事先决定要读取多少数据。但应该由解析器决定何时停止。

【问题讨论】:

  • 你看过Attoparsec中的parseWith函数了吗?
  • 如果您能描述或举例说明您期望的提示类型,这将很有帮助。

标签: parsing haskell parsec attoparsec


【解决方案1】:

您似乎在这里总结了两个问题。一种是增量解析,一种是增量阅读。

Attoparsec 直接支持增量解析。请参阅Data.Attoparsec.Text 中的IResult 类型。秒差距,唉,没有。您可以根据已有的内容运行解析器,如果出现错误,请添加更多输入并重试,但您真的不知道该错误是不可恢复的解析错误,还是只是需要更多输入。

在您的情况下,通常 REPL 一次读取一行。因此,您可以使用hGetLine 读取一行 - 将其传递给 Attoparsec,如果它解析则评估它,如果没有,则获取另一行。

如果您想看到这一切的实际效果,我在Plush.Job.Output 中做了这种事情,但有三个小区别:1) 我解析的是字节流,而不是字符串。 2) 我已将其设置为尽可能多地从输入中提取并解析尽可能多的项目。 3)我直接从文件描述中读取。但同样的结构应该可以帮助你在你的情况下做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2011-03-15
    相关资源
    最近更新 更多