使用Haskell从句柄进行递增解析

5
我正在尝试将Haskell与具有读取-求值-打印循环的命令行程序进行接口连接。我想把一些文本放到输入句柄中,然后从输出句柄中读取,直到找到提示符(然后重复)。读取应该阻塞,直到找到提示符,但时间不应过长。使用Parsec或Attoparsec很好,而不是编写自己的小状态机,每次只读取一个字符,直到构造出提示符为止(其中一个问题是提示符会随着时间而改变,所以我不能只检查一串恒定的字符)。哪种方法最好读取适当量的数据并将其馈送给解析器?我感到困惑,因为大多数句柄读取基元要求我事先决定要读取多少数据。但应该由解析器决定何时停止。

你有没有看过 Attoparsec 中的 parseWith 函数? - kputnam
如果您能描述或提供您期望的提示类型的示例,那将非常有帮助。 - AndrewC
1个回答

5
您似乎将两个问题放在了一起。其中一个是关于增量解析,另一个是关于增量阅读。
Attoparsec直接支持增量解析。请参见Data.Attoparsec.Text中的IResult类型。而Parsec则不支持。您可以在已有的输入上运行解析器,如果出现错误,请添加更多输入并重试,但您真的不知道错误是否是无法恢复的解析错误,还是只需要更多输入。
在您的情况下,通常REPL一次读取一行。因此,您可以使用hGetLine读取一行 - 将其传递给Attoparsec,如果它解析成功,则进行评估,否则获取另一行。
如果您想看到所有这些的实际操作,请参考Plush.Job.Output,但有三个小区别:1)我正在解析字节流,而不是字符串。 2)我已经设置了尽可能从输入中拉取并解析尽可能多的项目。 3)我直接从文件描述符中读取。 但相同的结构应该帮助您在您的情况下完成它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接