問題タブ [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 - Attoparsec: 複数文字の区切り文字までスキップする (ただし含まない)
ほとんどすべての文字を含むことができる文字列があります。文字列の中に delimiter があり{{{
ます。
例: afskjdfakjsdfkjas{{{fasdf
.
attoparsec を使用して、 のParser ()
前のすべての文字をスキップするが、 ?{{{
を消費しないa の慣用的な書き方は何{{{
ですか?
haskell - Attoparsec はユーザー状態の保存と変更をサポートしていますか?
私は Attoparsec を使用しており、解析タスク全体でユーザー状態値を追跡したいと考えています。
私は Parsec のモナド関数 getState、putState、および modifyState に精通していますが、Attoparsec 内で類似物を見つけることができないようです。Attoparsec の内部で、または State モナドを使用してこれを行う簡単な方法はありますか?
haskell - attoparsec: 失敗するのではなく、入力の一部で成功する
私はattoparsec
パーサーを持っていて、それをテストしていますが、パーサーの一部にコメントしてテストを実行すると、パーサーが返されずLeft "parse error at line ..."
、代わりにRight []
.
parseOnly
これ以上入力がないことを明確にするために使用していることに注意してください。
それ以外の場合は、部分的に解析された入力を取得すると便利です。これは間違いなく便利であり、私はそれを持っていることをうれしく思います。ただし、入力全体が消費されていないことをお知らせしたいと思います。たぶん、最後に消費された文字の文字オフセットを取得するか、それが必要な場合は、少なくともオプションが返されLeft
ます。
関連する場合、パーサーはそこにあります。
たとえば、次の行にコメントすると:
テストを実行すると、たとえば次のようになります。
これはそのテストからのものです。
haskell - attoparsec の takeWhile1 のより一般的な (しかし効率的な) バージョンを作成するにはどうすればよいですか?
Data.Attoparsec.Text
エクスポートtakeWhile
とtakeWhile1
:
述語が を返す限り入力を消費し
True
、消費された入力を返します。このパーサーは失敗しません。
False
入力の最初の文字で述語が返される場合、空の文字列が返されます。[...]
述語が を返す限り入力を消費し
True
、消費された入力を返します。このパーサーは、入力の少なくとも 1 文字で成功する述語を必要とします。述語が返されない場合、
True
または入力が残っていない場合、失敗します。
attoparsec
のドキュメンテーションは、ユーザーに
の代わりに、
Text
可能な限り 指向のパーサーを使用してください。2 種類のパーサーのパフォーマンスには約 100 倍の違いがあります。takeWhile1
many1 anyChar
takeWhile1
これらの 2 つのパーサーは非常に便利ですが、より一般的なバージョンの、より具体的には、仮説パーサーの必要性を常に感じています。
predicate を満たす文字を少なくとも 解析します。ここで、 は任意の非負の整数です。lo
f
lo
takeWhile1
の実装を見てみましたが、プライベートな関数がたくさん使用されており、Data.Attoparsec.Text.Internal
簡単に一般化できるようには見えません。
私は次の適用可能な実装を思いつきました:
それは宣伝どおりに機能し、
しかし、 によって返された結果の中間リストをパックする必要性はcount
、特に が大きい場合に心配ですlo
... への推奨に反するようです
Text
可能な限り 指向のパーサーを使用してください [...]
何か不足していますか?takeWhileLo
そのようなコンビネータを実装するより効率的/慣用的な方法はありますか?
haskell - 行末シーケンスが CRLF の場合、このパーサーが常に失敗するのはなぜですか?
この単純なパーサーは、次の形式のメッセージを解析することが期待されています
1 つの EOL はフィールド セパレータとして機能し、2 つの EOL はメッセージ セパレータとして機能します。EOLセパレーターが の場合は完全に正常に動作し\n
ますが、 のparseWith
場合は常に失敗を返します\r\n
。