Haskell中Handle的增量解析

时间:2013-04-01 21:30:31

标签: parsing haskell parsec attoparsec

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

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

1 个答案:

答案 0 :(得分:4)

你好像在这里有两个问题。一个是关于增量解析,一个是关于增量读取。

Attoparsec直接支持增量解析。请参阅IResult中的Data.Attoparsec.Text类型。 Parsec,唉,没有。你可以运行你的解析器,如果它给出了错误,添加更多输入并重试,但你真的不知道错误是不可恢复的解析错误,还是只需要更多的输入。

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

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