問題タブ [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# - 複合型への解析
私はF#とFParsecに慣れていないので、これまでに得たものを見せて困惑することすらしたくありません。
FParsecの例では、ASTのすべてのタイプ(私が見る)は、単一の値、リスト、またはタプルのタイプの省略形です。
たとえば、解析された関数名とそのパラメーターを保持することになっている複合型がある場合はどうなりますか?
したがって、文字列メンバーとリストメンバーを持つf(a, b, c)
タイプのオブジェクトに解析されます。一致するパーサーからどのようにすればよいですか?PFunction
Name
PParameter
Parameters
f(a, b, c)
|>>
PFunction
これまでにできることは、複合パーサーを作成することだけですが、それを何にも変えることはできません。電卓の例は、Termのようなタイプを含むASTを作成した場合も同様ですが、代わりに、パーサーではなくインタープリターのように見えるため、ASTはありません。その上、Termはおそらく他のタイプの省略されたコンポーネントのタプルにすぎません。
ありがとう!
f# - FParsecを使用したオプションで複数行の式の解析
私はこの形式の文字列用のFParsecパーサーを書いています:
言い換えると、これはオプションの時間数量詞を含む「do」ステートメントであり、単一の「action」ステートメントまたは最後に「enddo」を含む「action」のリスト(それぞれ新しい行)のいずれかです(I簡単にするためにインデント/末尾のスペースの処理を省略しました)。
有効な入力の例は次のとおりです。
これはそれほど複雑には見えませんが、次のようになります。
なぜこれが機能しないのですか?
この式の正しいパーサーは何ですか?
parsing - FParsecエラーの解決方法「コンビネータ「many」が、消費せずに成功するパーサーに適用されました...」
私は十分に単純に見えるパーサーを持っています。他のすべてのサブパーサーが失敗したため、一般的な解析エラーに関する情報を提供するために、このサブパーサーを最後に追加しました-
ただし、選択肢としてreadErrorを追加すると、実行時のストリーム消費に関する恐ろしいFParsecエラーが発生します-The combinator 'many' was applied to a parser that succeeds without consuming input and without changing the parser state in any other way.
解析された残りの行を使用して使用済みエラーを作成するため、なぜこれが発生するのかわかりません(ここでは「違反」)構造。
誰かが私がこれを理解するのを手伝ってもらえますか?パーサーエラーを間違った方法でユーザーに通知しようとしていますか?そうでない場合、どうすればこれを修正できますか?
よろしくお願いします!
* より詳しく *
関連する可能性のあるコードをさらにいくつか示します-
私は知らないよ。おそらく問題は、readErrorパーサーを実行しようとすると、すでにストリームの最後にあることです。それにより、restOfLineは入力を消費せず、空白さえも消費しませんか?
* 結論 *
readErrorパーサーを使用したエラー報告へのアプローチが間違っていることが判明しました。正しいアプローチは、次のように「最後まで」パーサーを使用することです-
ここで、入力ストリーム内のすべてのexprを取得する必要があるときに、readExprsTillEndを実行します。
もう一度ありがとう、グスタボ!
parsing - FParsec で左再帰を処理する方法
私の言語では、配列または構造体の要素にアクセスするためのドット演算子という 1 つの追加機能を備えた s 式を使用しています。
現在、私のパーサーは、access
演算子を使用してこのコードで動作します -
ただし、次のようなドット演算子を使用して代替解析を追加したい-
どちらも同等の AST に解析されます。ここで左再帰が問題になるのは、式 like(f x).y
が同様に解析されるためです(access :m:y (f x))
しかし、FParsec でこの種の左再帰解析を処理する方法や、左再帰に代わる方法がわかりません。
parsing - FParsecを使用したチャンク解析
ソケットからのように、入力をFParsecパーサーにチャンクで送信することは可能ですか?そうでない場合、これを達成するために、入力ストリームの現在の結果と解析されていない部分を取得することは可能ですか?SocketAsyncEventArgs
メッセージ全体をバッファリングせずに、入力のチャンクを実行しようとしています。
アップデート
の使用に注意する理由はSocketAsyncEventArgs
、にデータを送信するCharStream
と、基になるに非同期アクセスが発生する可能性があることを示すためStream
です。具体的には、ソケットから入ってくるデータをプッシュするために循環バッファを使用することを検討しています。FParsecのドキュメントで、基になるStream
ものに非同期でアクセスしてはならないことに注意していたので、チャンク解析を手動で制御することを計画していました。
究極の質問:
Stream
に渡されたものの下で循環バッファを使用できますCharStream
か?- このシナリオでチャンクを手動で制御することを心配する必要はありませんか?
f# - FParsec で chainl1 を使用する例を教えてください。
これは FParsec の中で最も不可解なコンビネータです...
http://www.quanttec.com/fparsec/reference/primitives.html#members.chainl1
...しかし、ドキュメントやインターネット上の Web ページでの使用方法の例はありません。私はそれを必要とするように見える左再帰解析を持っていますが、私の人生では、それを呼び出す方法やそれに何を渡すかを理解できません。
助けてください :)
parsing - FParsecのサンプル文法はサンプルを超えていますか?
プロジェクトリポジトリのサンプルを超える、FParsecで記述されたサンプル文法を探しています。
このGLSLの非常に優れた文法を見つけましたが、これが私が見つけた唯一のサンプルです。必要なのは、CやJavaScriptに似た言語の文法です。
f# - FParsecでの数値の解析
私はFParsecを学び始めました。数値を解析するための非常に柔軟な方法があります。使用したい数値形式のセットを提供できます。
しかし、私が解析しようとしている言語は少し奇妙です。数値は、数値(非負int
)、10進数(非負float
)、16進数(接頭辞付き#x
)、または2進数(接頭辞付き)のいずれか#b
です。
今のところ、次を使用するために(必要に応じて)を置き換え#
て、 2回解析を行う必要があります。0
pnumber
この場合の解析のより良い方法は何ですか?CharStream
または、条件付き解析を簡単にできるようにFParsecを変更するにはどうすればよいですか?
parsing - FParsecを使用して文字列リテラルを解析しますか?
FParsecを使用して文字列リテラルを解析したいと思います。「文字列リテラル」とは、引用符の開始と終了の間の何かを意味します(私の場合は一重引用符)。
私が現在行っていることは次のとおりです。
しかし、これは最初の文字が消費された後に停止します。それを貪欲にする方法はありますか?