問題タブ [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.
f# - FParsec を使用して自己記述型入力を解析する
FParsec を使用して、独自の形式を記述する入力を解析しています。たとえば、次の入力を検討してください。
入力の最初の部分 (コロンの前) は、入力の 2 番目の部分の形式を記述します。この場合、形式はint
, str
,ですint
。これは、実際のデータが指定された型の 3 つのカンマ区切りの値で構成されることを意味するため、結果は4
, "hello"
, になり3
ます。
FParsec でこのようなものを解析する最良の方法は何ですか?
以下に最善を尽くしましたが、満足していません。parse
よりクリーンで、ステートフルでなく、モナドへの依存度が低い、これを行うためのより良い方法はありますか? これは UserState のよりスマートな管理にかかっていると思いますが、その方法がわかりません。ありがとう。
f# - サブパーサーから返された関数を fparsec で適用する
ヌーブアラート!
わかりました、fparsec で簡単な数式パーサーを構築しようとしています。今私がやりたいことは、この "1+2-3*4/5" のような文字列を処理し、評価の結果として double を返すことだけです。スペース、改行、または括弧は使用せず、左から右への操作順序で問題ありません。
これが私がこれまでに持っているものです:
式パーサーの最初の選択では、op パーサーによって返された関数をどのように適用するかがわかりません。
f# - 解析された数値が FParsec で満たさなければならない条件を追加するには?
FParsec で int32 を解析しようとしていますが、数値が最大値未満でなければならないという追加の制限があります。私自身のカスタムパーサー(以下のように)を書かずにこれを実行する方法ですか、および/または私のカスタムパーサー(以下)は要件を達成する適切な方法ですか。
組み込みライブラリ関数のほとんどは、特定の述語を満たすcharを中心に展開しているように見え、他の型ではないようです。
アップデート
以下は、以下のコメントで与えられた方向に基づいた、より適切な FParsec ソリューションの試みです。
これは正しい方法ですか?
parsing - インデントベースのステートメント (Python など) に FParsec を使用するにはどうすればよいですか?
だから、私は自分の言語用の基本的なパーサーを持っています.Is possible to parse "off-side" (indentation-based) languages with fparsec?
Pythonのように、インデントベースの構文を組み込みたいです。
ただし、indentationParser を私のものに組み込む方法を確認するのに苦労しています。型の不一致で衝突します。
私の言語では、「do」の後のものはすべて新しいスコープであり、識別が必要です。
エラーは次の行にあります。
f# - fparsec は、異なるデータ型のキーと値のペアを解析します
値のデータ型によって異なるキーと値のペアを解析できるパーサーを作成しようとしています。
キー1:1,2,3
KEY2:abc
キー3:123
次のコードで
上記では、次のエラーが発生します。
numList
最初のキーの取り出しは期待どおりに機能するため、これはパーサーと関係があると思います。
どんな助けにも感謝します!前もって感謝します!
f# - FParsec を使用して float または int*float を解析する
FParsec をいじり始めたばかりで、次の形式で文字列を解析しようとしています。
たとえば、3*0.1 を 0.1 0.1 0.1 に展開したい
私がこれまでに持っているものは次のとおりです
製品パーサーは、フォーマットのエントリを正しく解析し、int*float
それを float のリストに展開します。ただし、フロートまたはフロートのみを解析できるソリューションを思い付くのに苦労していますint*float
。私は次のようなことをしたいと思います
もちろん、パーサーの戻り値の型が異なるため、これは機能しません。これを機能させる方法についてのアイデアはありますか?float_ws を変更して、float が 1 つだけのリストを返すようにラップすることは可能ですか?
f# - FParsec を使用した int または float の解析
float または int 値で構成される FParsec を使用して、ファイルを解析しようとしています。適切な解決策が見つからない 2 つの問題に直面しています。
1
pint32
とはどちらもpfloat
同じ文字列を正常に解析しますが、異なる答えpint32
を返します。たとえば3
、文字列"3.0"
を解析するpfloat
と戻り3.0
、同じ文字列を解析すると戻ります。を使用して浮動小数点値の解析を試みpint32
、文字列が の場合に失敗することは可能"3.0"
ですか?
つまり、次のコードを機能させる方法はありますか。
このコードはすべての浮動小数点値をfloatvalues
リストに正しく配置しますが、文字列を解析するときにpfloat
返されるため、すべての整数値もリストに配置されます。"3.0"
"3"
floatvalues
2
上記のコード例は私には少し不器用に思えるので、もっと良い方法があるに違いないと思います。を使用してそれらを結合することを検討しましたchoice
が、両方のパーサーが同じ型を返す必要があります。pint32
float 用と int 用の 1 つのオプションを使用して判別共用体を作成し、演算子からの出力と演算子をpfloat
使用して変換できると思います|>>
。しかし、より良い解決策があるかどうか疑問に思っていますか?