問題タブ [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 を使用して単純な todo リスト言語 (実際には TaskPaper のデータ) を解析しようとしています。しかし、私はパズルを解くことができないように見えるバグに遭遇しました。私はパーサー コンビネータを初めて使用し、FParsec は私が Parsec を知っていることに依存しているようですが、パーセックのドキュメントは不可解です。
課題用紙言語のルールは単純です (今のところ @tags は無視しています)
- プロジェクトは「:」で終わります
- タスクは「-」で始まります
- その他のテキスト行は、プロジェクトまたはタスクに関するプレーン テキストのメモです。
したがって、文字列 "Project 1:\nSome note\nProject 2:" は parseFile から [ProjectName("Project 1");NoteText("Some note");ProjectName("Project 2")] として返されるはずですが、代わりに、 get [ProjectName("プロジェクト 1");ProjectName("メモ\nプロジェクト 2")]
以下は私のパーサーコードです。
編集済み
構文は、Hogbay Software の TaskPaper アプリケーションTaskPaper の Web サイトから引用され ています 構文の例
f# - F#リストからデータを抽出する方法
前の質問に続いて、私はゆっくりとFParsecのコツをつかんでいます(私は特に理解するのが難しいと思いますが)。
次の初心者のF#の質問は、パーサーが作成するリストからデータを抽出するにはどうすればよいですか?
たとえば、前の質問のサンプルコードをParser.fsというモジュールにロードし、別のモジュールに非常に単純な単体テストを追加しました(適切な参照を使用)。XUnitを使用しています:
インタラクティブに、解析「1」を実行すると、応答は次のようになります。
有効な演算子のリストを微調整することで、解析「1+1」を実行して以下を取得できます。
私の代わりに何を置く必要がありますか?上記のスニペットで?また、演算子などではなく、数値であることを確認するにはどうすればよいですか?
f# - FParsec:fparsecで日付を解析する方法(初心者)
区切られたファイルをfparsecで解析する方法について、 Bill Casarinの投稿を使用しています。コードがどのように機能するかを理解するために、ロジックを理解しています。複数行で区切られたドキュメントを(今のところ)セルリストリスト構造に解析しています。ここで、セルは文字列または浮動小数点数です。私はこれについては完全な初心者です。
フロートの解析に問題があります-一般的なケース(タブによって配信されるセル、数値を含む)では機能します。ただし、セルがたまたま数字で始まる文字列である場合、セルはバラバラになります。
pFloatCellを変更して、(タブを通過する途中で)floatとして解析するか、何も解析しないようにするにはどうすればよいですか?
ありがとうございました
おっと昨夜私のために遅れました。データを投稿するつもりでした。この最初のものは動作します
これはエラーを返しますが:
ChaosPの推奨事項がある場合とない場合の両方で返品されます。
ErrorMsg = "エラーのLn:1列:3 \ r \n102011年3月18:28:11GMT\ r \ n ^ \ r \ n期待:ファイルの終わり、改行、または'\ t'\ r \ n"
試みはうまく機能しているように見えます。2番目のケースでは、10までしか取得できず、 pfloatのコードは最初の空白のみを検索します。前にスペースがあるかどうかに関係なく、次のタブまたは改行までずっと調べる必要があることをpfloatに納得させる必要があります。Double.Parseを実行して独自のバージョンのpfloatを作成しますが、ライブラリに依存したいと思います。
parsing - FParsecの再帰文法
私はFParsecをチェックすることにし、λ式のパーサーを書こうとしました。結局のところ、熱心さは再帰的な構文解析を困難にします。どうすればこれを解決できますか?
コード:
ありがとう!
f# - if / else/ifステートメントの解析
単純なifステートメントの構造を複製しようとしています。
if(paren)ブロックの場合、IfBlockASTノードを作成します。それ以外の場合は、IfElseBlockノードを再帰的に埋めます。
私はかなりの数の代替構造を試しました
提案?
f# - fparsecの位置情報
私のASTモデルは、位置情報(ファイル名、行、インデックス)を保持する必要があります。この情報にアクセスするための組み込みの方法はありますか?リファレンスドキュメントから、ストリームは位置を保持しているように見えますが、位置を保存するためだけにダミーパーサーを実装する必要はなく、どこにでも追加することをお勧めします。
前もって感謝します
recursion - オプションでそれ自体で(無限に)繰り返されるF#で型を表現するにはどうすればよいですか?
学習演習として、機能パーサーライブラリfparsec(FParsec )を使用してgraphvizドット言語( DOT言語)のパーサーを実装しようとしています。言語はグラフを記述します。
言語の定義を見て、私は次の定義を書き留めることを余儀なくされました。
ここpstmt
で、およびpchar ';'
はパーサーで.>>
あり>>.
、左側のパーサーの出現と右側のパーサーの出現を組み合わせ、opt
オプション値としてその引数パーサーのオプションの出現をパーサーします。ただし、この定義は「...結果の型は無限になります...」と文句を言っても機能しません。
この例は、上記のリンク先のDOT言語を見るとおそらく最も簡単に理解できます。
私は次の一見リンクされた質問を知っています:
しかし、私のF#の知識は、それらがここに当てはまるとしても、まだそれらを翻訳するには十分ではないかもしれません。
f# - FParsec で単純型を解析する
FParsec を使用して標準の単純型 (ラムダ計算の意味で) を解析しようとしていますが、特に再帰的な定義に関して、Lex/Yacc スタイルから FParsec で使用されるスタイルに移行するのに苦労しています。
私が解析しようとしている型の例は次のとおりです。
- o
- o -> o
- (o -> o -> o) -> o
そして、ここに私の試みがあります:
これをインタラクティブにロードすると、最後の行でスタック オーバーフローが発生します (皮肉なことに、最近では検索が非常に困難です)。再帰参照があることを考えると、その理由は想像できますが、1 つのトークンの先読みでは、stype
. したがって、それは を選択しているに違いないと思いarr
ますstype
。しかし、このループを防ぐにはどうすればよいでしょうか?
ライブラリの慣用的な使用に関するコメントと、試みた解決策の修正に興味があります。
f# - fsyacc/fslex と FParsec のどちらを選択しますか?
次のような単純な DSL 言語を解析する必要があります。
この種の言語を解析するのに最も適したツールは何ですか?
.net - F# Interactive で FParsec を実行しようとしたときの問題
F# Interactive でFParsecコードを実行しようとしていますが、成功しません。このファイルをビルドして実行することはできtutorial.fs
ますが、FSI では認識されなかったため、同じことは起こりませんFParsec.dll
。
すでに FSI でコマンドを実行しようとしました#r "Parsec"
が、役に立ちませんでした。
ここで何が問題なのか、誰にも手がかりがありますか?