2

私は C++ でプロジェクトをコーディングしています。テキスト ファイル ( usergrammar.txt ) に、人間が読み書きできる形式で、オブジェクトを定義するユーザー定義の文法を配置する方法を探しています。

これが完了したら、これらのオブジェクトの一部をコードでインスタンス化し、作成したインスタンスを別のファイル ( instances.txt ) に、常に人間がアクセスできる形式で保存できるようにしたいと考えています。この 2 番目のファイルは、正しく読み取られる最初のファイルに明らかに依存しています。

私が問題を抱えているのは、文法を定義して解析する方法です。私はBoost::Spiritを見てきましたが、最初のファイルを読むのはうまくいきますが(そのルールは事前に定義されているため)、Spiritの文法は定義されているだけなので、2番目のファイルには適用できないと思いますコンパイル時であり、実行時にロードできません(少なくともそれは私が理解したことです)。

今私は ENBF フォームについて読んでいますが、言語規則があるだけでなく、各オブジェクトが別のオブジェクトに含まれるたびに特定の異なる名前/説明/オプションを持っているという問題もあります (たとえば、オブジェクトの色がある場合、その中の整数は赤、青、黄色と呼ばれますが、オブジェクトが定規の場合、その整数は長さと呼ばれます)、これらの情報をファイルに含める方法もあります。それらを対応する値に正しく関連付けます。

このようなプロジェクトのために、何を見て、何を学び、何を使用し、何をするべきかについての指針はありますか? 前もって感謝します。

4

2 に答える 2

1

実行時に提供される文法から抽出された事実を使用して文脈自由言語を解析するEarley パーサーを参照してください。

もう 1 つの方法は、ほぼすべての C++ コンパイラ システムがプロセスをフォークできるライブラリを提供しているという事実を利用することです。これを使用してシェル スクリプトをフォークし、対応する文法形式に基づいて任意のパーサー ジェネレーター スキーム (Boost:Spirit を含む、スクリプトから C++ コンパイラーを呼び出す必要がありますが、それは難しいことではありません) を実行し、そのスクリプトを作成します。生成されたパーサーを呼び出します。処理するドキュメントが大きい場合、これはおそらく Earley パーサーよりも効率的です。確かに実装ははるかに簡単です。

于 2012-04-25T21:43:01.663 に答える
0

ファイルの形式に何らかの制限を設けても構わない場合は、XML または JSON を使用して文法を記述することを検討できます。

次のような文法ファイルを作成できます

{
    "ObjectTypes" : {
        "ruler" : { "properties" : [ "length" ] },
        "color" : { "properties" : [ "red", "green", "blue" ] }
    }
}

このファイルを読み取った後 (既存のライブラリを使用する可能性が最も高い)、実際のオブジェクトを含む別のファイルを読み取ることができます。次のようになります。

{
    "Objects" : [
        { name : "object1", "type" : "ruler", "length" : 5 },
        { name : "object2", "type" : "color", "red" : 5, "blue" : 127, "green" : 150, }
    ]
}

などなど。JSON のよりわかりやすい概要は、こちらに記載されており、JSON を処理するいくつかの C++ ライブラリへのリンクが含まれています (私の個人的なお気に入りはJsonCpp です)。

于 2012-04-25T18:21:59.123 に答える