5

read-eval-print ループを持つコマンド ライン プログラムと Haskell を接続しようとしています。入力ハンドルにテキストを入力し、プロンプトが見つかるまで出力ハンドルから読み取ります (その後、繰り返します)。プロンプトが見つかるまで読み取りはブロックされますが、それ以上はブロックされません。プロンプトを作成するまで一度に 1 文字ずつ読み取る独自の小さなステート マシンをコーディングする代わりに、Parsec または Attoparsec を使用すると便利です。(問題の 1 つは、プロンプトが時間の経過とともに変化することです。そのため、一定の文字列をチェックすることはできません。)

出力ハンドルから適切な量のデータを読み取り、それをパーサーに渡す最良の方法は何ですか? ほとんどのハンドル読み取りプリミティブでは、読み取るデータの量を事前に決定する必要があるため、混乱しています。しかし、いつ停止するかを決定するのはパーサーです。

4

1 に答える 1

5

ここに 2 つの質問がまとめられているようです。1 つは増分解析に関するもので、もう 1 つは増分読み取りに関するものです。

Attoparsec は増分解析を直接サポートしています。IResultのタイプを参照してくださいData.Attoparsec.Text。残念ながら、パーセクはそうではありません。持っているものに対してパーサーを実行し、エラーが発生した場合は、さらに入力を追加して再試行できますが、エラーが回復不能な解析エラーなのか、それとも入力が必要なだけなのかはわかりません。

あなたの場合、通常の REPL は一度に 1 行ずつ読み取ります。したがってhGetLine、行を読み取るために使用できます-それを Attoparsec に渡し、解析する場合は評価し、そうでない場合は別の行を取得します。

これらすべての動作を確認したい場合は、Plush.Job.Outputでこのようなことを行いますが、3 つの小さな違いがあります。1) 文字列ではなく、バイト ストリームを解析しています。2) 入力から可能な限り多くの項目を取得し、可能な限り多くの項目を解析するように設定しました。3) ファイル記述子から直接読んでいます。しかし、同じ構造があなたの状況でそれを行うのに役立つはずです.

于 2013-04-02T14:08:12.680 に答える