問題タブ [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.
parsing - エントロピー符号化された JPEG ブロックを効率的に解析するには?
.JPEG ファイルの SOS_MT ブロックをジャンプしようとしています。データを何にも使用したくありません。データがどこで終了するかを知りたいだけです。ウィキペディアの JPEG の記事から私が理解していることによると 、JPEG ファイル内の他のすべてのブロックはブロックの長さを示す数バイトで始まりますが、SOS_MT ブロックは ... まあ、解析するしかない邪悪な沼地です。最後に到達するまでバイトごとに。
だから私はそれを行うために次のコードを用意しました:
このコードはAtoparsecを使用しており、検証する機会があった限り、正しいです。ただ遅いです。このパーサーをパフォーマンス面で改善するためのヒントはありますか?
haskell - Attoparsec: Data.Word と Data.Int からデータ型を解析する簡単な方法は?
私は現在、ゲームのネットコードでシリアル化と逆シリアル化に と を丁重に使用bytestring
しattoparsec
ています。私はもともとこれらのライブラリを使用することに惹かれていました。cereal
これは、有用な割り当て戦略や低レベルのプリミティブbytestring
など、ビルダーをかなり細かく制御できるためです。プロジェクトの後半で発生する可能性のあるレイテンシや GC の問題に対処するための準備が整うので、これは良い選択だと思いました。
またbytestring
、パケット フィールドで遭遇する一般的なデータ型 (主に 、、、およびData.Word
にData.Int
ある型) に多くのコンビネータを提供していますが、 に補完的なコンビネータが見つからなかったときはがっかりしました。何か不足していますか?提供されたコンビネータと同等のものをモックアップできますか?Word16
Word16
Int8
attoparsec
機能が欠落している場合、この機能を追加する通常の方法は何ですか? ライブラリを使用して署名されたショーツをデコードする必要があるのは、私が初めてではありません。この機能が存在しない理由はありますか? attoparsec
私が知らない、補足すべき共通ライブラリはありますか? または、次のようにする必要があります。
これは内部で行うことcereal
でbinary
あり、当面この機能を取得するために現在行っていることですが、 APIで既に提供されていることbytestring
を行うためにアドホックで安全でない関数を使用する必要がないのは良いことです。 .cereal
binary
低遅延のネットワーク環境で attoparsec を使用して、、、 、 、Int64
にInt32
取り組む必要がある場合、ほとんどの人は何をしますか?Int16
Int8
Word64
Word32
Word16
(初心者向けの注意) ここには、素朴な仮定があります。およびcereal
での実装よりも、ネットワーク パケットの処理が高速ではないと暗黙的に想定しています。この仮定は、binary-serialise-cborでかなり大量の割り当てが行われていることを指摘するいくつかの講演を見てから生まれました。bytestring
attoparsec
cereal
binary
これは、バッファ内のバイナリ データのエンコードとデコードに対する継続的なアプローチによるものです。私は、エンコード/デコード サブルーチンが以前に見たフィールドの値に依存する時折のフィールドを使用して、非常に簡単でステートレスな方法でエンコードおよびデコードできることが多いネットワーク パケットを扱っています。ここでリアリティチェックが必要なのかもしれませんが、仕事に間違ったツールを使用していますか? 状況を改善するために、この高レベルでできることはあまりないのではないでしょうか? この場合、「時期尚早に最適化しない」は当てはまらないと仮定します。
haskell - attoparsec の条件付き先読み
内部にコメントを含むテキストを表すデータ構造があるとします。
したがって、文字列のように
としてエンコードできます
コメント チャンクと for のパーサーE
は非常に簡単です。
このような簡単な方法でテキスト チャンクのパーサーを実装する
貪欲な性質のため、コメントセクションをテキストとして消費させます
では、問題は、入力の最後まで、またはコメント セクションまでの解析のロジックをどのように表現するかということです。つまり、条件付き先読みパーサーを実装する方法は?
haskell - リストの代わりにベクターを返すカスタム Attoparsec パーサー コンビネーターを作成するには?
上記は単なる例ですが、Haskell で大量のプリミティブ値を解析する必要があり、リストの代わりに配列を使用する必要があります。これはF# の Fparsecで可能なことなので、Attoparsec のソースを調べてみましたが、それを行う方法がわかりません。実は、 Haskell ライブラリでmany
fromControl.Applicative
が定義されている場所がわかりません。base
Hackage のドキュメントが指し示している場所なので、そこにあると思いましたが、そのような運はありません。
また、Haskell でサイズ変更可能な配列ほど便利なものが見つからないため、ここで使用するデータ構造を決定するのに苦労していますが、効率の悪いツリー ベースの構造は使用したくありません。
Attoparsec をスキップして ST モナド内にパーサー全体を実装するという選択肢もありますが、最後の手段以外では避けたいと思います。
haskell - 先頭に空白がない単語の最初の出現を解析する
設定
いくつかの .txt ファイルで、先頭に空白がない単語の最初の出現箇所を見つける必要があります。考えられるケースは次のとおりです。
私のパーサーは hello に到達するまで任意の文字を消費するため、失敗するはずですが、現在 t6 は成功しています。これが私のパーサーです:
私の解決策
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: 正規表現のソリューションは、実際の問題には当てはまらないため、探していません。パーサーを使用する必要があります。
parsing - attoparsec がバックトラックしないようにする方法はありますか?
Attoparsecを使用していくつかのパーサーを作成しましたが、失敗時に常にバックトラックする必要はなく、attoparsec パーサーは常に失敗時にバックトラックすることに気付きました。
パーサーがバックトラックしないようにする方法はありますか?
たとえば、この attoparsec パーサーは、入力 "for" が与えられたときに成功します。
parsec パーサーはその入力に対して成功しないため、attoparsec パーサーを使用してこの動作をエミュレートしたいと考えています。
haskell - シンプルなパーサーのメモリ不足
この単純なパーサーが大きなファイルに対してメモリ不足になる理由を理解したいと思います。私は何が間違っているのか本当にわかりません。
私はプログラムを実行しています:
出力:
x.log のサイズは約 500MB です。私のマシンには 16GB の RAM があります。