○FIHalfTreeConverterの変換ルールの記述方法 FileIO\BySpirit\VrmlParser\FIVrmlParserTest.cpp:51 の辺りに記述します。 conv.Add(変換元の属性列パターン, 変換先の属性列パターン); の形で書きます。変換元パターンはSA,SN,SS,S1〜S4などの組み合わせ、変換先パターンはDA,DN,DS,D1〜D4などの組み合わせで記述します。 ・属性列パターンと値列パターン パターンには、属性列パターン(attributesPattern)と値列パターン(valuesPattern)の2種類が有ります。それぞれ、「0個以上の属性」と「0個以上の値(ノードor文字列)」にマッチします。 SA,DAと、これらを>>で繋いだものは属性列パターンです。他は全部、値列パターンです。 この2種類は(C++上で)別の型になるのが自然ですが、実装上の手抜きで、同じ型になってます。ので、SA("hoge", SA(…))とか書いてもコンパイルエラーにはならないので、注意してください。実行時にassertion failedになるはずですけど。 ・SN(attributesPattern) / DN(attributesPattern) 「attributesPatternにマッチする属性列を持つノード」にマッチする、値列パターン。 ・SS(str) / DS(str) 「文字列str」にマッチする、値列パターン。 ・S1〜S4 / D1〜D4 「任意の1つの値」にマッチする、値列パターン。変数として働き、S1とD1、S2とD2、…が対応している。 ・S::Any() / D::Any() 「任意個の任意の値」にマッチする、値列パターン。 ・SA(key, valuesPattern) / DA(key, valuesPattern) 「キーがkeyで、値がvaluesPatternとマッチするような属性(列)」にマッチする、属性列パターン。 value"s"となっている所に注意。例えば SA("key", SS("value1") >> SS("value2")) [1] という書き方も可能で、これは実は、 SA("key", SS("value1")) >> SA("key", SS("value2")) [2] と等価。同様に、 SA("key", S::Any()) [3] と書くと、「キーが"key"である連続した0個以上の属性」にマッチする。 [3]のパターンを[2]の形に書き直せない、というのが、この変な書き方を受け付けている理由の1つ(もう1つの理由は、実装上の都合)。 ・valuesPattern >> valuesPattern / attributesPattern >> attributesPattern パターンの連結。 ・!valuesPattern / !attributesPattern 省略可能なパターン。 ○Traitsについて補足 TInNode, TInValue, TInAttributeは、Converter内部で「値渡し」されるので、効率を考えると、「イテレータやポインタなどの軽い型」へのtypedefにするのが良さそうです。 ○ビルド環境 VC7.1(VS.NET2003)が必要です。VC7(とたぶんVC6)では動きません。 Boostにインクルードパスを通しておく必要が有ります。 Boost.Regexライブラリがインストールされている必要が有ります。 http://village.infoweb.ne.jp/~fwhk9290/behind/regex.htm のVC.NET用の説明のフォルダ名を読み替えてインストールしてください。 インストールしておけば、必要に応じて自動で.libファイルがリンクされます。