5

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

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

4

1 回答 1

5

您似乎在这里有两个问题。一个是关于增量解析的,一个是关于增量阅读的。

Attoparsec 直接支持增量解析。请参阅 中的IResult类型Data.Attoparsec.Text。秒差距,唉,没有。你可以在你拥有的东西上运行你的解析器,如果它给出了一个错误,添加更多的输入然后再试一次,但是你真的不知道这个错误是一个不可恢复的解析错误,或者只是需要更多的输入。

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

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

于 2013-04-02T14:08:12.680 回答