問題タブ [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 の再帰文法が StackOverflowException をスローする
私はこのコードを持っています
評価されると、StackoverflowExcpetion がスローされます。問題は、無限再帰なしでどのように書くことができるかということです。
parsing - 括弧付きの FParsec 構文解析式
私は最初のパーサーをコーディングしています。それは F# にあり、私は FParsec で使用しています。
私のパーサーはtrue and false
、(true and false or true)
、true
、(((true and false or true)))
などを解析しますが、これは正しいです。
しかし、次のような場合は解析しません(true and false) or true
。テキストの途中に括弧があると失敗します。
どうすれば解決できますか?
サンプルコード:
parsing - OperatorPrecedenceParser が Optional (opt) 式を解析するようにする
私のプロジェクト用に特定のドメイン固有言語を実装するパーサーを実装しています。
私が苦労している側面の 1 つは、式全体がオプションになるような式 (FParsec の OperatorPrecedenceParser を使用して実装される) を作成することです。
ネット上の多くの例とほぼ同じ方法で、パーサー OPP を実装しました。また、行末コメントの空白が消費される場所をずらしてみました。ただし、ボットの場合、私の試みはどれも機能しないようです(式と行末コメントの両方がオプションです)
具体的には(以下の例で実装されているように)、以下を正常に解析できるようにしようとしています。
ここで、式はオプションであり、式の後にオプションのコメントがあります。「KeyValue:」はこの例ではハードコードされていますが、私が持っているメインのパーサー コードでは、これは識別子です。
注: 以下のサンプルについて。2 つの float の単純な中置加算を解析する最小限の式を実装しました。完全なパーサーはさらに多くの機能を実装しています。
NB2。式には、: と式の間に少なくとも 1 つの空白が必要です。# コメント文字は、式にはまったく表示されません。
「オプション」という表現をどのようにすればよいですか。以下の eKeyValue FParsec パーサー タイプを参照してください。
以下の例には、6 つの事例が含まれています。すべてのケースが機能するはずです。wsBeforeEOL を用語の最後に追加して、オプション (opt) という式を追加しようとしましたが、何も機能しないようです。OPP は常に消費され、失敗することはないようです。
以下のサンプル プログラムの出力は次のようになります。
サンプル プログラムは次のとおりです (上記のテスト ケースは Main() 関数にあります。
parsing - FParsec で同種のリストを解析するにはどうすればよいですか?
FParsec で同種の json のような配列を解析しようとすると問題が発生します。問題を再現する短い例に分解しました。
関数を使用しtest
て試してみると、次の結果が得られます。
演算子を使用するときにP_INT_VALUE
との順序を入れ替えると、解析は成功しますが、同様のエラーで失敗します。基本的に、私が最初に使用するパーサーは、使用しようとするものです。P_BOOL_VALUE
<|>
[true,false]
[1,2,3]
LHS がユーザー状態を変更した場合、オペレーターが RHS パーサーを試行しないことは理解して<|>
いますが、それがどのように発生するのかわかりません。P_BOOL_VALUE と P_INT_VALUE には共通の開始文字がないため、間違ったデータ型を解析しようとすると、両方ともすぐに失敗するはずです。Int が「false」または「true」で始まることはなく、bool が数字で始まることもありません。
私は何を間違っていますか?