Haskell 中的句柄增量解析

dav*_*dsd 5 parsing haskell parsec attoparsec

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

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

Mtn*_*ark 5

你似乎有两个问题在这里。一种是增量解析,一种是增量读取。

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

就您而言,REPL 通常一次读取一行。因此,您可以用来hGetLine读取一行 - 将其传递给 Attoparsec,如果它解析则评估它,如果没有,则获取另一行。

如果您想查看所有这些操作,我会在Plush.Job.Output中执行此类操作,但有三个细微差别:1)我正在解析字节流,而不是字符串。2)我已将其设置为从输入中提取尽可能多的内容并解析尽可能多的项目。3)我直接从文件描述中读取。但相同的结构应该可以帮助您在您的情况下做到这一点。