問題タブ [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 - OperatorPrecedenceParserを使用してFParsecで関数アプリケーションを解析しますか?
質問はこれに似ていますが、 OperatorPrecedenceParser
inを使用して関数適用で式を解析したいと思いますFParsec
。
これが私のASTです:
次の入力があります。
そして、パーサーコードは次のとおりです。
expr
ここでの問題は、関数の引数も式であり (演算子、変数などを含めることができます)、パーサーを拡張して引数リストを式のリストとして解析する方法がわからないことです。ここでパーサーを作成しましたが、既存のパーサーと組み合わせる方法がわかりません:
現在、パーサーから次の出力があります。
私が欲しいのは、次のものを取得することです:
sql - 論理を他の中置演算子から区別する
SQL検索条件を解析しようとしていますが、パーサーが論理(AND
、OR
)を他の中置演算子と区別するのに問題があります。私はそれらを異なるノードとして解析しています(おそらくそれを行うのは難しいです)が、評価フェーズを単純化します。関連するコードスニペットは次のとおりです(必要に応じてさらに含めることができます)。
"1 = 1"
正しく解析しますComparison (Eq,Constant (Int32 1),Constant (Int32 1))
しかし、論理演算子を使用して2つの比較を結合しようとすると、たとえば、次"1 = 1 or 2 = 2"
のように解析できません。
Lnのエラー:1列:7
1=1または2=2
^
期待:入力の終わりまたは中置演算子
:7
1
エラーの前をスカラー式として解析し、or
バックトラックを押すと、中置演算子ではないこと1
を認識し、完全なスカラーとして戻り、論理演算子で結合された条件の左側を解析していることを認識しますor
。
1
代わりに、おそらく中置演算子を含む、より複雑なスカラー式が始まると仮定し続けるようです。
コードに問題がありますか、または(同じを使用して)中置演算子としてAND
/を解析するための解決策はありますか?私はそのルートに行きたくないので、どこかで単純な間違いを犯したことを望んでいます。OR
OperatorPrecedenceParser
完全なコードは要点です。
f# - OperatorPrecedenceParser を使用して大文字と小文字を区別しない演算子を解析する
を使用して、大文字と小文字を区別せずに非記号演算子 (例: , ) を解析することは可能AND
ですか?OR
OperatorPrecedenceParser
parsing - FParsec の OperationPrecedenceParser の演算子で識別子パーサーを停止するにはどうすればよいですか?
Unicode シンボルを使用する識別子名のパーサーを実装しています。私が直面している問題は、ユニコード記号で書かれたいくつかの演算子があり、これらは識別子の直後に配置される可能性があることです。次に例を示します。
ここで、矢印記号は中置演算子であり、これを演算子の優先順位パーサーに追加します。
演算子として OPP に追加されたすべての記号の組み合わせを自動的に除外できればいいのですが。現時点では、識別子に次の実装を使用して手動で実行しています。
ただし、これは機能しないようです。コードを解析しようとすると、次のエラー メッセージが表示されます。
variable
パーサーを中置演算子で停止させるにはどうすればよいですか?
parsing - FParsecの識別子パーサーで前処理関数を使用していますか?
identifier
FParsecのパーサーを使用して、通常は Unicode と ASCII 文字が混在している変数と関数の名前を解析しています。\u03C0
しかし、先頭 ( など) または識別子内( など)で Unicode 文字をエスケープすることがありswipe_board\u003A_b
ます。isAsciiIdStart
オプションとオプションを使用して解析可能にするisAsciiIdContinue
ことはできますが、正規化前の前処理用に独自のカスタム関数を定義することはできません。ここで解決策は何ですか?
f# - 括弧で囲まれた式の解析
SQL検索条件(のわずかに変更された形式)について、次のfsyacc文法があります。
FParsecで再実装しました(前の質問の助けを借りて)。関連するビットは次のとおりです。
これは解析し1 = 1 or 2 = 2
ますが、定数または検索条件全体を括弧でラップすると失敗します(奇妙なことに、比較を括弧でラップすると機能します)。失敗する例を次に示します。
スカラー、比較、および検索条件はすべて同じように開始できますが(open paren-> constant-> infix演算子)、最終的に遭遇する演算子のタイプによって本質的に区別されます。たとえば、ヒットしたor
場合、オープニングパレンは条件全体に属し、左側の比較ではないことがわかります。これはバックトラックによって適切に処理されていますか?もしそうなら、入力を消費しないような方法で、複雑な式を解析しているときに、どのように失敗しますか?
スカラー、比較、および検索条件のオプションの括弧の処理は、fsyacc文法の左再帰によって処理されます。これはFParsecで考慮に入れる必要があることを理解しています。しかし、上記のエラーから、私は、それにもかかわらず、大規模なバックトラックから逃れる方法を想像することはできません。
.net - FParsec による基本的なエラー回復
私がこのパーサーを持っていると仮定します:
今、"2+3;2*4;3*4;3+3;"
約 のエラーで失敗します2*4;
。2*4;
しかし、との両方のエラーが必要な場合のベスト プラクティスは何3+3;
ですか? 基本的には一番近い「;」までスキャンしたい ただし、致命的なエラーが発生した場合のみ。その場合は、エラーを集計したいと思います。
敬具、 ラッセ・エスペホルト
更新: recoverWith
いい解決策です、ありがとう! しかし、与えられた:
[]
エラーなしで取得できると思います。または、もう少し「公平」に:
.net - FParsec の末尾再帰
2 つの再帰分岐を持つパーサーで問題が発生しました。問題を簡単に説明するために、例としてLuca Bolognese によって書かれた記事からラムダ計算の単純な文法を使用します。
この記事のパーサーは非常に簡潔です。
pApplication
それらは 2 つの で構成されてpExpr
おり、それがs でもある可能性があるため、私は興味がありpApplication
ます。次のベンチマークでは、パーサーがスタック領域を使い果たしています。
パーサーを末尾再帰に書き換えるにはどうすればよいですか?
Lisp に似た言語用のパーサーを作成して実際のベンチマークでテストしようとしたときに、この問題を認識しました。私はTerm
、VarBinding
相互に再帰的な型であり、上記let
と同じ問題を示すパーサーを持っていpApplication
ます。末尾再帰ではない問題に関して分析が間違っている場合に備えて、私のパーサーはgithubにあります。
f# - FParsec識別子とキーワード
キーワードを含む言語の場合、たとえば「if」が識別子として解釈されないようにし、「ifSomeVariableName」がトークンストリームでキーワード「if」の後に識別子「SomeVariableName」になるのを防ぐために、特別なトリックが必要です。
再帰下降とLex/Yaccについては、レクサーとパーサーの間でトークンストリームを変換するというアプローチを(役立つ指示に従って)単純に採用しました。
ただし、FParsecは実際には別のレクサーステップを実行していないように見えるので、これに対処するための最良の方法は何であるか疑問に思います。と言えば、HaskellのParsecはレクサーレイヤーをサポートしているようですが、FParsecはサポートしていませんか?
f# - FParsec リアクティブの例
データがある種の着信ライブ ストリームに基づいている FParsec の使用例を誰かが潜在的に投稿できることを期待しています。
いくつかの例としては、マウス ジェスチャに基づいて結果を生成したり、特定の株価ティック シーケンスに基づいてアラートまたは通知を生成したりできます。
誰かが例を投稿できれば、それは大歓迎です。
ありがとう!