問題タブ [fparsec]
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 - fparsec - コンビネータ「多く」が文句を言います...なぜこのようにブロックコメントを解析しないのですか?
この質問は、まず、私の質問と重複していません。実は3つ質問があります。
以下のコードでは、入れ子になっている可能性のある複数行のブロック コメントを解析するパーサーを作成しようとしています。引用された他の質問とは対照的に、再帰関数を使用せずに簡単な方法で問題を解決しようとします(他の投稿への受け入れられた回答を参照してください)。
私が遭遇した最初の問題は、FParsec の skipManyTill パーサーもストリームから end パーサーを消費することでした。そこで、skipManyTillEx (「endp を除く」の Ex ;) ) を作成しました。skipManyTillEx は機能しているようです-少なくとも、fsxスクリプトにも追加した1つのテストケースでは。
しかし、示されているコードでは、「消費せずに成功するパーサーにコンビネーター 'many' が適用されました...」というエラーが表示されます。私の理論は、commentContent
パーサーがこのエラーを生成する行であるということです。
ここで、私の質問:
- 私が選択したアプローチが機能しない理由はありますか? 1のソリューションは、残念ながら私のシステムではコンパイルできないようで、(ネストされた) 複数行のコメントに対して再帰的な低レベルのパーサーを使用します。
- 私が実装した方法に問題がある人はいます
skipManyTillEx
か?skipManyTill
私がそれを実装した方法は、主に解析フローを制御する方法の面で、実装されている方法とはある程度異なります。元skipManyTill
の では、Reply<_>
p および endp の が とともに追跡されstream.StateTag
ます。対照的に、私の実装では、ステータス コードstream.StateTag
のみに依存して、を使用する必要はありませんでした。Reply<_>
解析に失敗した場合はskipManyTillEx
、ストリームの初期状態に戻り、エラーを報告します。バックトラッキング コードが原因で「多数」のエラーが発生する可能性はありますか? 代わりに何をしなければなりませんか? - (そしてそれが主な質問です)-この「多くの...」エラーメッセージが消えるようにパーサーを修正する方法を誰かが見ていますか?
コードは次のとおりです。
f# - fparsec キー値パーサーが解析に失敗する
次のようなファイルでキーと値のペアを解析するパーサーを作成する必要があります。
as235 242kj25klj ペア:A=a1|B=b1|C=c1
kjlkjlkjlkj ペア:A=a2|B=b2|C=c2
行にはゴミ、ラベル、キーと値のペアが含まれていることに注意してください。
私が書いた F# コードは次のとおりです。
期待される結果は次のとおりです。
...しかし、代わりに次のエラーが表示されます。
このパーサーを修正する方法についてのアイデアはありますか?
ありがとう!
更新: ステファンのコメントの後、私はそれを修正しようとしましたが、成功しませんでした。これは、うまくいくと思っていた最後の試みの1つですが、うまくいきません。
エラーメッセージは次のとおりです。
sdp - FParsec を使用してレコードまたはオブジェクトに解析する方法は?
FParsec チュートリアルを完了した後、SDP (Session Description Protocol RFC 4366) 用のパーサーを作成してみることにしました (少なくとも最初の 3 行)。SDP は ABNF (RFC 4234) で指定されています)。だから、私はそこから仕事をしようとしています。
ユーザーズ ガイドのセクション 5.1 の最後にある注記は、「文法のリーフ ノード用の単純なパーサーから始めて、最終的に完全な文法用のパーサーを取得するまで段階的に作業を進める」方法を示しています。その方向性とパイプを使用するためのステファンの答えからのヒントで、これが私が今持っているものです:
そして、これは機能します (ただし、getAddress は FQDN または外部アドレスをまだ処理していません)。結果は次のとおりです。
これがターゲットのレコード タイプ Sdp です。しかし、いくつかのタプルを経由して結果を出力に入れるには、少し複雑な方法です。
ユーザーズ ガイドをセクション 5.4 まで読みましたが、すべての例は判別共用体に解析されます。結果の照合にはレコード型が最適ですか。または、より良い方法はありますか?
f# - 繰り返しパターンの後に右が来る可能性があるときの間をどのように解析しますか?
既存の FParsec 機能を使用して、右端のタグで繰り返される連続したパターンを見つけるにはどうすればよいでしょうか?
この文脈では、それは正当な可能性です。事前解析 + エスケープが機能する可能性がありますが、より良い解決策はありますか? 新しいフォワードコンビネータを書く必要がありますか? もしそうなら、それはどのように見えますか?
f# - F#、FParsec、およびストリーム パーサーの再帰呼び出し
F# と FParsec を使用してマルチパート MIME パーサーを開発しています。私は繰り返し開発しているので、これは非常に洗練されていない、もろいコードです。これは、私の最初の問題を解決するだけです。赤、緑、リファクタリング。
文字列ではなくストリームを解析する必要があるため、実際にループに陥っています。その制約を考えると、私の理解では、パーサーを再帰的に呼び出す必要があります。それを行う方法は、少なくとも私がこれまで進めてきた方法では、私の理解を超えています.
POST の例の最初の行は次のとおりです。
content-type: Multipart/related; boundary="RN-Http-Body-Boundary"; type="multipart/related"
ファイル内の 1 行にまたがります。コンテンツのさらにサブパートには、content-type
複数行にわたる値が含まれているため、パーサーを再利用する場合は、パーサーを改良する必要があることはわかっています。
どういうわけか、ストリームの残りを適切な境界で分割し、投稿のコンテンツの複数の部分を返すことができるようpContent
に、(文字列?) の結果を呼び出す必要があります。pBoundary
ヘッダーとコンテンツ (明らかに文字列以外のものである必要があります) を含む投稿。私の頭がクラクラします。このコードはすでに複雑すぎて、1 行を解析できません。
洞察と知恵に感謝します!
recursion - F#、FParsec、およびストリーム パーサーの再帰呼び出し、セカンド テイク
このプロジェクトの最初の投稿と2 番目の投稿に返信していただきありがとうございます。この質問は基本的に最初の質問と同じですが、これら 2 つの質問に対して受け取ったフィードバックに従ってコードが更新されています。パーサーを再帰的に呼び出すにはどうすればよいですか?
私は頭をかきむしりながら、ぼんやりとコードを見つめています。ここからどこへ行けばいいのかわからない。そんなときは、stackoverflow に目を向けます。
受け取ったコンパイル時エラーをコード コメントに含めました。つまずきのブロックの 1 つは、私の差別された組合かもしれません。私は差別された組合とあまり仕事をしたことがないので、私の使い方が間違っているかもしれません。
私が取り組んでいる POST の例 (前の 2 つの質問にその一部を含めた) は、新しい境界を持つ 2 番目の投稿を含む 1 つの境界で構成されています。その 2 番目の投稿には、2 番目の境界で区切られたいくつかの追加パーツが含まれています。これらのいくつかの追加部分はそれぞれ、ヘッダーと XML で構成される新しい投稿です。
このプロジェクトでの私の目標は、C# ソリューションで使用するライブラリを構築することです。このライブラリは、ストリームを受け取り、ヘッダーとパーツに再帰的に解析された POST を返します。ここで F# を輝かせたいと思っています。
編集
これまでに受け取ったフィードバック (ありがとう!) に応えて、次の調整を行い、注釈付きのエラーを受け取りました。
s を投げてみましReply ()
たが、パーサーが返されただけで、c
上記は.Parser<...>
ではなくa になりましたContent
。それは一歩後退したか、少なくとも間違った方向に進んでいたようです. しかし、私は自分の無知を認め、訂正を歓迎します!
parsing - 「オフサイド」(インデントベース) 言語を fparsec で解析することは可能ですか?
インデントベースの Python ライクな言語に FParsec を使用したいと考えています。
これは字句解析フェーズで行う必要があることは理解していますが、FParsec には字句解析フェーズがありません。FParsec を使用することは可能ですか? または、lexing 後にどのようにフィードできますか?
PD: F# は初めてですが、他の言語の経験があります。
f# - 乗算の優先順位で「xy z」を解析する
FParsec を使用して F# で Mathematica 言語のパーサーを作成しようとしています。
f x y = (f(x))(y)
関数適用の優先順位が高い構文をサポートする MiniML 用に作成しました。ここで、同じ構文を意味に使用する必要があるf*x*y
ため、乗算と同じ優先順位が必要です。特にx y + 2 = x*y + 2
、x y ^ 2 = x * y^2
.
これはどのように達成できますか?