2011-07-13 15 views
10

ハスケルに反応性のあるParsec(またはその他の純粋な機能パーサ)がありますか(または持っている可能性はありますか?Haskell:FRP Reactive Parsec?

簡単に言えば、私はパーサー自身をcharでフィードし、出力を得るのに十分なだけの結果を得たいと思っています。

もっと単純ですが、foldrまたは少なくともmapでどうすればいいですか?

このような反応的な動作をサポートするには、別のバージョンが必要ですか?

EDIT

私の質問は、特にFRPについてです。私は例としてパーサーを使用しました。これは私の質問を明確にし、私が必要とするものを大きく描写するために考えた最高のものでした。

私はFRPがUIだけではないと信じています。

+5

解析されたデータ構造のストリームにバイトのストリームを変換する便利な方法することができAttoparsecは、増分解析をサポートしていますか? – Masse

答えて

8

Parsecでオンライン解析を行うことはできません。有効な解析があるかどうかを判断するには、すべての入力を消費する必要があります。

しかし、選択肢があります。 1つの可能性は、Utrecht parser combinatorsを使用することです。その機能の中でオンライン解析が可能です。私はそれがこの「FRP」、この種のもののために右の名前をコールする権利はないと思う

8

は、パーサが、すぐにそれが入力を受け取るような出力を生成することを意味し、online algorithmです。 (オフラインアルゴリズムとは対照的に、パーサーは入力全体を受け取り、そこから出力を生成します)。

遅延テストでは、オンラインアルゴリズムを簡単に記述できます。 Malcom Wallaceは、レイジー評価を使用するオンライン解析用の特別なパーサーコンビネータを開発しました。

6

Parsecでオンライン解析を行うことはできますが、そうするにはiterateeのようなものの上に重ねる必要があります。

Parsec 3は任意のストリームタイプで動作できるため、現在のストリームを位置として表示するStreamのインスタンスを作成し、iterateeを使用してその位置の値を取得できます。

このような例の1つはiteratee-parsec packageです。

別のアプローチがparsing trifecta talk on iteratees and parsec(警告PDF)で提供されています

妥協ではなく、それらのすべての有界空間の利用率を維持することを可能にするよりも、最後のいくつかのチャンクの断片をバッファiterateeのような形を構築することです

、それを越えるバックトラックのためのiteratee機構に依存しています。これは私が現在使用しているものですが、私はそれのためのオンラインコードはありません。

Iterateeの上でParsecを実行してコントロールを反転させると、一度に1文字ずつ入力し、まだ何かを認識できたかどうかを確認するのは非常に簡単です。それはあなたが望むかどう

+0

@ KA100あなたはこの回答に同意する必要があります。 –

1

がattoparsec-コンジットを見てください、正しいパーサと、それは

関連する問題