![]() |
忍坂2.リファレンス |
||||||||||||||||||||||||||||||||||||||
|
チューニング |
|||||||||||||||||||||||||||||||||||||||
| akaxiso2.0-beta2 | |||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||
忍坂2は、設定ファイル、もしくは、XMLスキーマ文書中に設定項目を追加することにより、ソースの生成時の詳細なオプションを設定することが可能です。 XMLスキーマ文書中における指定 XMLスキーマ文書中の<xs:appinfo>要素以下に、名前空間 http://akaxiso.sourceforge.jp/osixaka2/beta2 (最終リリースで変更あり)に属する要素を書くことで
の設定が可能です。 ・名前空間に対する名前空間プレフィックスの指定(osx:namespace) 以下の形式にて指定を行います。 <osx:namespace prefix="名前空間プレフィックス" uri="名前空間URI"> uri属性は省略することができます。その場合、xs:schema要素の属性である@targetNamespace属性の値が用いられます。ここで指定される名前空間プレフィックスがC++ソースの名前空間名になります。 <osx:namespace>は、<xs:appinfo>の子要素として書いてください。また、<xs:annotation>は、最初の<xs:complexType>、もしくは、<xs:simpleType>の前に書いてください。 例: my_uriで指定される名前空間に対して、名前空間プレフィックス、my_prefixを対応付ける。 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2">
<osx:namespace prefix="my_prefix" uri="my_uri"/>
<xs:appinfo>
</xs:annotation>
<!-- xs:complexType、xs:simpleTypeの定義 などなど-->
</xs:schema>
・インクルードファイルの指定(osx:include、osx:xiso_include、osx:ximpl_include) 値クラスファイル(osx:include)、leafクラスの宣言ファイル(osx:xiso_include)、leafクラスの実装ファイル(osx:ximpl_include)ファイル中でファイルをインクルードするための指定を行います。 <!-- 値クラスヘッダへのインクルード --> <osx:include system="true|false">インクルードファイル名</osx:include> <!-- leafクラスヘッダへのインクルード --> <osx:xiso_include system="true|false">インクルードファイル名</osx:xiso_include> <!-- leafクラス実装ファイルへのインクルード --> <osx:ximpl_include system="true|false">インクルードファイル名</osx:ximpl_include> それぞれ、@system属性(xs:boolean型)を持ち、この指定により、#includeの形式を以下に示すように選択することができます。 /* @system="true"が指定された時、 */ #include <ファイル名> /* @system="false"が指定された時、*/ #include "ファイル名" xs:include、xs:xiso_include、xs:ximpl_includeは、XMLスキーマ文書の<xs:appinfo>の子要素として書いてください、また、<xs:annotation>は、最初の<xs:complexType>、もしくは、<xs:simpleType>の前に書いてください。 <xs:schema xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<osx:include name="filename.h" system="true"/>
</xs:appinfo>
</xs:annotation>
<!-- xs:complexType、xs:simpleTypeの定義などなど。 -->
</xs:schema>
・生成されるクラス名の指定(osx:classname) xs:complexType、xs:simpleType、xs:sequence、xs:choice、xs:allの属性として使用可能です。 通常、忍坂2は、XMLスキーマの@name属性で与えられる名前、もしくは、無名パーティクルに与えられる自動生成された名前を、C++のクラス名として用います。この名前を、osx:classname属性で上書きすることができます。 例1: xs:complexTypeにosx:classnameを適用する。XMLスキーマ型の名前を"schema_type"、C++のクラス名を"cpp_type"とする。 <xs:complexType name="schema_type" osx:classname="cpp_type" xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2"/> 例2: ネストした無名のxs:sequenceに、C++のクラス名(cpp_sequence)を指定する。 <xs:complexType name="schema_type" xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2">
<xs:choice>
<xs:sequence osx:classname="cpp_sequence"/>
</xs:choice>
</xs:complexType>
・手実装によるleafクラスの使用(osx:leaf) 単純型のクラス、leafクラスを別ファイルにて、宣言、実装しており、この定義を引用する際に用います。<xs:simpleType>の属性として使用可能です。 <xs:simpleType osx:leaf="leafクラス名"/> osx:leafを使用する際には、単純型のC++値クラス名は、単純型の値クラスに対して忍坂2が与える名前と一致している必要があります。(例を参照) 例: スキーマ中に単純型(my_simpleType)があり、この型に対して、妥当性検証、もしくは、特殊な追加処理を実装した値クラス(struct my_simpleType、struct my_simpleType_leaf"が、すでに実装されているものとする。XMLスキーマ文書中で、これらのクラスを引用し、ソース生成を行います。他のファイルに実装されている単純型のクラス、leafクラスを#includeにより読み込むため、<osx:include>、<osx:xiso_include>と併せて用います。 ・C++側の実装
ファイル:my_simpleType.h----------------------------------------------
typedef long my_simpleType; // my_simpleTypeは、long型の変数で表される。
------------------------------------------------------------------
ファイル:my_simpleType_xiso.h -------------------------------------------
#include "my_simpleType.h"
struct my_simpleType_leaf : aka::simpleType<my_simpleType, my_simpleType_leaf> {
static void read_text(void *e, const std::string &entity, aka::entity_complements &ecomp);
static void _write_text(const void *e, std::ostream &ostm, aka::entity_complements &ecomps);
};
-------------------------------------------------------------------
ファイル:my_simpleType_xiso.cpp------------------------------------------
// my_simpleType_leaf::read_text(), my_simpleType_leaf::write_text()の実装
-------------------------------------------------------------------
・スキーマファイル-------------------------------------------------------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2">
<xs:annotation>
<xs:appinfo>
<osx:include>my_simpleType.h</osx:include>
<osx:xiso_include>my_simpleType_leaf.h</osx:xiso_include>
</xs:appinfo>
</xs:annotation>
<!--例1 トップレベル要素としてのxs:simpleType -->
<!-- トップレベル要素の名前がそのままC++値クラス名として使われる。 -->
<xs:simpleType name="my_simpleType" osx:leaf="my_simpleType_leaf">
<!-- xs:simpleTypeの実際の定義。忍坂2では無視される。
</xs:simpleType>
<!--例2 ローカル要素としてのxs:simpleType>
<xs:complexType>
<xs:sequence>
<xs:attribute name="sample_attr">
<!-- ローカルなxs:simpleTypeは、無名であるため、osx:cleassnameにて名前を与える。 -->
<xs:simpleType osx:classname="my_simpleType" osx:leaf="my_simpleType_leaf"/>
<xs:attribute>
</xs:sequence>
</xs:complexType>
</xs:schema>
設定ファイルによる指定 設定ファイルを用いて、デフォルトの設定を書き換えることができます。-Tオプションを用いて、設定ファイルのテンプレートを生成することができます。 $ osixaka2 -T template.xml 生成されるファイル(template.xml)の内容を以下にしめします。 <?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<preference xmlns="http://akaxiso.sourceforge.jp/osixaka2/beta2">
<format>
<member prefix="" suffix="_"/>
<array container="std::list" prefix="" suffix="_array"/>
<choice container="std::list"/>
<simplecontent valuename="value"/>
<particle_item prefix="" suffix="_item"/>
</format>
<substitutions>
<substitution original="token_to_substitute" substituted="substituted_token"/>
</substitutions>
<escapes>
<escape to_escape="character_to_escape" escaped="escaped_character"/>
</escapes>
<directives/>
</preference>
・メンバ、クラス名のフォーマット(preference/format以下)
・置換(preference/substitutions、preference/escapes以下)
・ディレクティブ(preference/directives)
・内部指定(internal) 実装詳細のチェック中 設定ファイルの使用 -Lオプションを用いて、作成された設定ファイルを使用します。 設定ファイルの使用 $ osixaka2 -L preference.xml <XML Schemaドキュメントファイル名> 仕様、制限、未実装部など
|
|||||||||||||||||||||||||||||||||||||||
