F#の既知のパーサーコンビネーターライブラリのファイルを解析できる既知のパーサーコンビネーターライブラリはありますか?

StackOverflow https://stackoverflow.com/questions/7800586

質問

私はFPARSECの基本のいくつかに精通していますが、テキストファイルやストリームに向けられているようです。

バイナリファイルを効率的に解析できる他のF#ライブラリはありますか?または、FPARSECを簡単に変更して、バイナリストリームで効率的に作業することができますか?

役に立ちましたか?

解決

あなたは興味があるかもしれません ピックラーの組み合わせ. 。これらはパーサーの組み合わせに少し似ていますが、よりシンプルなバイナリ形式に焦点を当てています(ピックラー バイナリデータを作成できるようにします 未洗浄業者 それらを解析します)。があります このアイデアについては非常に読みやすい記事 (PDF)Andrew Kennedy(測定単位の著者)。

私はこれらの経験はあまりありませんが、私はそれがあなたに関連しているかもしれないことに気づきました。このアイデアは、いくつかのバイナリリソース(リソースに保存されている引用など)を生成するためにF#コンパイラで使用されます。しかし、私はそれがかどうかはわかりません F#コンパイラの実装 どんな良いことですか(F#コンパイラの初期の時代のものの1つです)。

他のヒント

バイナリストリームの操作に関する問題はパーサーの問題自体ではなく、徴収の問題です。レクサーは、生データを解析が処理できる要素に変えるものです。

ほとんどの解析システムには、独自のレクサーを供給できる問題がほとんどありません。もしそうなら、理想的には、バイナリストリームで動作する準拠したレクサーを容易に書くことができます。

ただし、問題は、今日のほとんどの解析システムとレキシングシステム自体がより高いレベルのツールから作成されていることです。そして、そのツールは、おそらくバイナリストリームで動作するように設計されていない可能性が高いです。つまり、後続のパーサーとlexerを作成するために使用できるバイナリストリームのトークンと文法を指定することは実用的ではありません。また、バイナリストリームで遭遇する可能性が高いマルチバイトバイナリ数(ショートパンツ、ロング、フロートなど)のより高いレベルの概念については、サポートはまったくありません。実際に実際の値に取り組む必要がある場合、システムは主にテキストベースのトークン用に設計されているため、基礎となるランタイムはマシンが使用できるテキストを変換する詳細を処理します(ASCII数値のシーケンスなどが実際のものになります。バイナリ整数)。

とはいえ、パーサーはレクサーによって供給される抽象的なトークンにもっと作業するため、おそらく実際にツールの解析セクションを使用できます。シンボリックレベルで文法を作成したら、レクサーをやり直して、バイナリストリームから問題のあるトークンを作成してパーサーに送り込む必要があります。

パーサーは基本的なレクサーよりもはるかに複雑になる傾向があるため、これは実際には良いことです。そのため、ツールキットはあなたのために「難しい部分」の多くを処理します。ただし、独自のレクサーを作成し、生成されたパーサーに適切にインターフェースすることに対処する必要があります。乗り越えられない仕事ではなく、文法が真の複雑さである場合、長期的にはあなたの努力に値する可能性があります。

それがすべてほぼ単純であれば、手作業で自分でやる方が良いでしょう。私の頭の上部のうち、バイナリ形式の主要なセールスポイントはマシンにはるかに近いことであり、ほとんどのパーサーが動作するように設計されているテキストに矛盾していることです。しかし、私はあなたのユースケースを知りません。

しかし、分解者の場合を考慮してください。それは、異なる命令タイプ(議論のないオペランド、単一のバイトを引数として取るオペランド、または単語など)を高レベルに立てることができる可能性のある単純なレクサーであり、それをパーサーに与えますその後、通常のアセンブラー構文で指示をニーモニックとオペランドに変換し、ラベル参照などを処理するために使用できます。

それは不自然なケースであり、分解者は通常、レクシングと解析の段階を分離しないため、通常は気にするほど複雑ではありませんが、問題を見る1つの方法です。

補遺:

バイナリストリームをテキストに変換してエンジンにフィードするのに十分な情報がある場合は、テキストを作成する代わりに十分な情報がある場合は、パーサーがレクサーから表示したい実際のトークンを作成できます。

とはいえ、テキスト形式を取得し、それを解析ツールと文法の基礎として使用し、レクサーとパーサーのマシンを作成してもらうことです。 「テキストテスト」を使用した処理。

ただし、テキストを作成するのではなく、バイナリを読むことになったら、レックスにして解析するのではなく、lexerが作成するトークン(これらは単純なオブジェクトである必要があります)を作成し、パーサーを直接ポンプで送ります。これにより、Lexのステップを節約し、処理時間を節約できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top