2012-04-25 12 views
2

私はC++でプロジェクトをコーディングしています。私はテキストファイル(usergrammar.txt)、人が読める/書込み可能な形式、ユーザー定義の文法オブジェクトを定義します。実行時に文法をロードする

これを実行したら、コード内のこれらのオブジェクトの一部をインスタンス化し、作成したインスタンスを別のファイル(instances.txt)に保存することができます。この第2のファイルは、第1のファイルに正確に依存することは明らかである。

私が問題を抱えているのは、文法を定義して構文解析する方法です。私はBoost :: Spiritを見てきましたが、最初のファイルを読むのはうまくいくのですが(ルールはあらかじめ定義されているので)、Spiritの文法しか定義されていないので、2番目のファイルには当てはまりませんコンパイル時に実行時に読み込むことはできません(少なくとも私が理解したことです)。

ENBFフォームについて読んでいますが、言語ルールだけでなく、それぞれのオブジェクトに別の名前/説明/オプションが含まれているという問題もあります(例えば、私はオブジェクトの色を持っている場合、その内部の整数は赤、青、yelloと呼ばれますが、オブジェクトが定規であればその整数は長さと呼ばれます)、これらの情報をファイルを作成し、それらのファイルを適切な値に正しく関連付けるようにします。

あなたはこのようなプロジェクトのために何を見て/勉強し/使用する/するべきかについての指針を持っていますか? ありがとうございます。

+0

一般的なフォーマットは何ですか? XMLを使用するのがあなたのために働くでしょうか? –

答えて

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の詳細な説明はhereで、JSONを扱ういくつかのC++ライブラリへのリンクが含まれています(個人的にお気に入りはJsonCppです)。

+0

私はJSONとXMLを使用しようとしましたが、私が理解する限り、オプションのパラメータや互換性のあるパラメータ(これまたはその)はサポートしていません。また、別のオブジェクトの内部で定義されたオブジェクトを使用することはできません。 'オブジェクト1: \tアイテム1:例えば \t \t型: \t \t \t番号 \t \t説明: \t \t \tまず説明 \t \tオプション: \t \t \tオプション1 \t \t \tオプション2 \tアイテム2 : \t \t型: \t \t \t Object2に \t \t説明: \t \t \t第二の記述 \t ITEM3: \t \t型: \t \t \tオブジェクト3 \t \t説明: \t \t \t第二の記述 オブジェクト1構成: \tオプション(Item1)+(Item2 OR Item3) ' など。私はそれを行う方法を見逃した場合、私は喜んで再度試してみます。 – Svalorzen

+0

残念ながら、私はそれを編集するのに十分な文字がありませんが、内容が理解できることを願っています。 @Datalore – Svalorzen

+0

「オプションのパラメータ」または「相互交換可能なパラメータ」の意味を理解できません。 JSONオブジェクト内の任意のキーと値のペアと、JSON配列内の任意のリスト(互いに入れ子になっています)を持つことができます。あるJSONオブジェクトから何らかの仕様を読み込み、その仕様を使用してC++プログラムに別のJSONオブジェクトのセットを読んで指示を与えることができます。 – Datalore

1

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

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

+0

あなたのフォークの解決策はかなり不便です。残念ながら(私は間違っているかもしれません)。私は、Earleyパーサーを見て、リンクのおかげで! – Svalorzen

+0

あなたがどこに向かうかによって異なります。 Flex/Bisonは広く入手可能で、forkはかなり標準的なプリミティブです。 –

関連する問題