問題タブ [attoparsec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
360 参照

parsing - エントロピー符号化された JPEG ブロックを効率的に解析するには?

.JPEG ファイルの SOS_MT ブロックをジャンプしようとしています。データを何にも使用したくありません。データがどこで終了するかを知りたいだけです。ウィキペディアの JPEG の記事から私が理解していることによると 、JPEG ファイル内の他のすべてのブロックはブロックの長さを示す数バイトで始まりますが、SOS_MT ブロックは ... まあ、解析するしかない邪悪な沼地です。最後に到達するまでバイトごとに。

だから私はそれを行うために次のコードを用意しました:

このコードはAtoparsecを使用しており、検証する機会があった限り、正しいです。ただ遅いです。このパーサーをパフォーマンス面で改善するためのヒントはありますか?

0 投票する
1 に答える
192 参照

haskell - Attoparsec: Data.Word と Data.Int からデータ型を解析する簡単な方法は?

私は現在、ゲームのネットコードでシリアル化と逆シリアル化に と を丁重に使用bytestringattoparsecています。私はもともとこれらのライブラリを使用することに惹かれていました。cerealこれは、有用な割り当て戦略低レベルのプリミティブbytestringなど、ビルダーをかなり細かく制御できるためです。プロジェクトの後半で発生する可能性のあるレイテンシや GC の問題に対処するための準備が整うので、これは良い選択だと思いました。

またbytestring、パケット フィールドで遭遇する一般的なデータ型 (主に 、、、およびData.WordData.Intある型) に多くのコンビネータを提供していますが、 に補完的なコンビネータが見つからなかったときはがっかりしました。何か不足していますか?提供されたコンビネータと同等のものをモックアップできますか?Word16Word16Int8attoparsec

機能が欠落している場合、この機能を追加する通常の方法は何ですか? ライブラリを使用して署名されたショーツをデコードする必要があるのは、私が初めてではありません。この機能が存在しない理由はありますか? attoparsec私が知らない、補足すべき共通ライブラリはありますか? または、次のようにする必要があります。

これは内部で行うことcerealbinaryあり、当面この機能を取得するために現在行っていることですが、 APIで既に提供されていることbytestringを行うためにアドホックで安全でない関数を使用する必要がないのは良いことです。 .cerealbinary

低遅延のネットワーク環境で attoparsec を使用して、、、 、 、Int64Int32取り組む必要がある場合、ほとんどの人は何をしますか?Int16Int8Word64Word32Word16

(初心者向けの注意) ここには、素朴な仮定があります。およびcerealでの実装よりも、ネットワーク パケットの処理が高速ではないと暗黙的に想定しています。この仮定は、binary-serialise-cborでかなり大量の割り当てが行われていることを指摘するいくつかの講演を見てから生まれました。bytestringattoparseccerealbinaryこれは、バッファ内のバイナリ データのエンコードとデコードに対する継続的なアプローチによるものです。私は、エンコード/デコード サブルーチンが以前に見たフィールドの値に依存する時折のフィールドを使用して、非常に簡単でステートレスな方法でエンコードおよびデコードできることが多いネットワーク パケットを扱っています。ここでリアリティチェックが必要なのかもしれませんが、仕事に間違ったツールを使用していますか? 状況を改善するために、この高レベルでできることはあまりないのではないでしょうか? この場合、「時期尚早に最適化しない」は当てはまらないと仮定します。

0 投票する
1 に答える
248 参照

haskell - attoparsec の条件付き先読み

内部にコメントを含むテキストを表すデータ構造があるとします。

したがって、文字列のように

としてエンコードできます

コメント チャンクと for のパーサーEは非常に簡単です。

このような簡単な方法でテキスト チャンクのパーサーを実装する

貪欲な性質のため、コメントセクションをテキストとして消費させます

では、問題は、入力の最後まで、またはコメント セクションまでの解析のロジックをどのように表現するかということです。つまり、条件付き先読みパーサーを実装する方法は?

0 投票する
3 に答える
300 参照

haskell - リストの代わりにベクターを返すカスタム Attoparsec パーサー コンビネーターを作成するには?

上記は単なる例ですが、Haskell で大量のプリミティブ値を解析する必要があり、リストの代わりに配列を使用する必要があります。これはF# の Fparsecで可能なことなので、Attoparsec のソースを調べてみましたが、それを行う方法がわかりません。実は、 Haskell ライブラリでmanyfromControl.Applicativeが定義されている場所がわかりません。baseHackage のドキュメントが指し示している場所なので、そこにあると思いましたが、そのような運はありません。

また、Haskell でサイズ変更可能な配列ほど便利なものが見つからないため、ここで使用するデータ構造を決定するのに苦労していますが、効率の悪いツリー ベースの構造は使用したくありません。

Attoparsec をスキップして ST モナド内にパーサー全体を実装するという選択肢もありますが、最後の手段以外では避けたいと思います。

0 投票する
1 に答える
177 参照

haskell - 先頭に空白がない単語の最初の出現を解析する

設定

いくつかの .txt ファイルで、先頭に空白がない単語の最初の出現箇所を見つける必要があります。考えられるケースは次のとおりです。

私のパーサーは hello に到達するまで任意の文字を消費するため、失敗するはずですが、現在 t6 は成功しています。これが私のパーサーです:

私の解決策

0 投票する
1 に答える
85 参照

haskell - パーサー: 順序が不明な場合に単一性を強制する

Attoparsec を使用して、正確に 1 つの 'x'、1 つの 'y'、および 1 つの 'z' と、任意の数の 'a'、'b'、または 'c' を含む文字列を、順序に制約なしで一致させようとしています。各文字の。

たとえば、「abbb z ac y aaa x cba」と「abbb z ac x aaa y cba」は一致するはずですが、次のものは一致しません。

  • "abbb z ac y aaacba" (理由: no 'x')
  • "abbb z ac y aaa x cb x a" (理由: 重複 'x')

これまでに私ができる最高のことはこれです:

(任意に、'\n' で解析を停止することにしましたが、それは単純な例を選ぶためです)。

次にghciで試します:

しかし、それは非常に不格好に見え、一意の文字のリストに簡単に拡張することはできません (たとえば、与えられた givenchars :: [Char] リストが重複していない場合、すべての givenchars と任意の 'a で構成される任意の文字列に一致させたい','b','c は任意の順序で間にあります)。

これを行うための、より優れた、よりエレガントでスケーラブルな方法はありますか?

PS: 正規表現のソリューションは、実際の問題には当てはまらないため、探していません。パーサーを使用する必要があります。

0 投票する
0 に答える
234 参照

parsing - attoparsec がバックトラックしないようにする方法はありますか?

Attoparsecを使用していくつかのパーサーを作成しましたが、失敗時に常にバックトラックする必要はなく、attoparsec パーサーは常に失敗時にバックトラックすることに気付きました。

パーサーがバックトラックしないようにする方法はありますか?

たとえば、この attoparsec パーサーは、入力 "for" が与えられたときに成功します。

parsec パーサーはその入力に対して成功しないため、attoparsec パーサーを使用してこの動作をエミュレートしたいと考えています。

0 投票する
2 に答える
257 参照

haskell - シンプルなパーサーのメモリ不足

この単純なパーサーが大きなファイルに対してメモリ不足になる理由を理解したいと思います。私は何が間違っているのか本当にわかりません。

私はプログラムを実行しています:

出力:

x.log のサイズは約 500MB です。私のマシンには 16GB の RAM があります。