Specification of mapping definition
1. mapping definition の仕様
mapping definition は 大きく分けて3つの部分の定義から構成されます。
- データ構造
- プログラミング言語の処理
- データ構造とプログラミング言語の処理の対応(マッピング)
それぞれの部分を 空間 と呼びます。 mappingSchema の0.4版では、 以下のURIをそれぞれの 空間 に割り当て、 それぞれに対して接頭辞を対応させています。
定義 | 名前空間 URI | 名前空間接頭辞 | |
---|---|---|---|
データ構造 | http://ums.isas.jaxa.jp/0.4/dat | dat | |
C言語 | http://ums.isas.jaxa.jp/0.4/clng | clng | |
プログラミング言語の処理 | Java | http://ums.isas.jaxa.jp/0.4/java | java |
Perl | http://ums.isas.jaxa.jp/0.4/perl | perl | |
マッピング | http://ums.isas.jaxa.jp/0.4 | (接頭辞なし) |
1.1 データ構造の定義
データ構造を定義するためには、 byte 要素、 bit 要素、 list 要素の子に、 data 要素または value 要素を記述します。
以下の定義は、1バイトの符号あり整数からなるデータ構造を表します。 この定義に登場する いずれの XML 要素 も データ構造の空間に属しています。
<dat:byte enocde="signed" length="1">
<dat:data type="byte"/>
</dat:byte>
1.2 プログラミング言語の処理の定義
現在、プログラミング言語の処理の定義として二つの syntax が存在します。
- XML-XML syntax
- XML-language syntax
データ構造の記述に XML-XML syntax と XML-language syntax の区別はありません。
1.2.1 プログラミング言語の処理の定義(XML syntax)
XML syntax において、プログラミング言語の処理を定義するためには、 'lang:value-of'要素 の子に、 'lang:data'要素 または 'lang:value'要素 を記述します。
以下の定義は、1バイトのデータの値を持つ変数 var を表します。 この定義に登場する いずれの XML 要素 も 言語の空間に属しています。
<lang:value-of select="var">
<lang:data type="byte"/>
</lang:value-of>
1.2.2 プログラミング言語の処理の定義(Language syntax)
Language syntax において、言語での処理を定義するためには、 変数の代入式の形式で、 'lang:data'要素 または 'lang:value'要素 を記述します。
以下の定義は、1バイトのデータの値を持つ変数 var を表します。 この定義に登場する XML 要素 、XML 要素の外側に書かれた 部分のいずれも言語の空間に属しています。
var = <lang:data type="byte"/>;
<lang:data type="byte"/> = var;
1.3 データ構造とプログラミング言語の処理の対応の定義
データ構造の定義と、プログラミング言語の処理の定義を組み合わせ、両者の対応を定義します。
1.3.1 データ構造とプログラミング言語の処理の対応の定義(XML syntax)
XML syntax において、データ構造とプログラミング言語の処理の対応を定義するためには、 byte 要素、 bit 要素、 list 要素の子に lang:value-of 要素 を記述し、この要素の子に、 lang:data 要素 または lang:value 要素 を記述します。
以下の定義は、1バイトのデータの値を持つ変数 var に1バイトの符号あり整数からなる データ構造を対応させています。 この定義に登場する dat:byte 要素 は データ構造の空間、 lang:value-of 要素 は 言語の空間、 data 要素 は マッピングの空間に属しています。
<dat:byte enocde="signed" length="1">
<lang:value-of select="a">
<data type="byte"/>
</lang:value-of>
</dat:byte>
XML syntax の、デコード/エンコードについての mapping definition は以下のようになります。
定義 | data | value |
---|---|---|
データ構造 |
<dat:byte enocde="signed" length="1"> <dat:data type="byte"/> </dat:byte> |
<dat:byte enocde="signed" length="1"> <dat:value type="byte">1</dat:value> </dat:byte> |
プログラミング言語の処理 |
<lang:value-of select="var"> <lang:data type="byte"/> </lang:value-of> |
<lang:value-of select="var"> <lang:value type="byte">1</lang:value> </lang:value-of> |
マッピング |
<dat:byte enocde="signed" length="1"> <lang:value-of select="a"> <data type="byte"/> </lang:value-of> </dat:byte> |
<dat:byte enocde="signed" length="1"> <lang:value-of select="a"> <value type="byte"></value> </lang:value-of> </dat:byte> |
1.3.2 データ構造とプログラミング言語の処理の対応の定義(Language syntax)
Language syntax において、データ構造とプログラミング言語の処理の対応を定義するためには、 byte 要素、 bit 要素、 list 要素の子に 変数の代入式の形式で、 lang:data 要素 または lang:value 要素 を記述します。
以下の定義は、1バイトのデータの値を持つ変数 var に1バイトの符号あり整数からなるデータ構造を対応させています。 このパターンに登場する dat:byte 要素 は データ構造の空間、 data 要素 は マッピングの空間、その他の部分が言語の空間に属しています。
<dat:byte enocde="signed" length="1">
a = <data type="byte"/>;
</dat:byte>
<dat:byte enocde="signed" length="1">
<data type="byte"/> = a;
</dat:byte>
Language syntax の、デコードについての mapping definition は以下のようになります。
定義 | data | value |
---|---|---|
データ構造 |
<dat:byte enocde="signed" length="1"> <dat:data type="byte"/> </dat:byte> |
<dat:byte enocde="signed" length="1"> <dat:value type="byte">1</dat:value> </dat:byte> |
プログラミング言語の処理 |
<lang:data type="byte"/> = a; |
<lang:value type="byte">1</lang:value> = a; |
マッピング |
<dat:byte enocde="signed" length="1"> <data type="byte"/> = a; </dat:byte> |
<dat:byte enocde="signed" length="1"> <value type="byte">1</value> = a; </dat:byte> |
エンコードについての mapping definition は以下のようになります。
定義 | data | value |
---|---|---|
データ構造 |
<dat:byte enocde="signed" length="1"> <dat:data type="byte"/> </dat:byte> |
<dat:byte enocde="signed" length="1"> <dat:value type="byte">1</dat:value> </dat:byte> |
プログラミング言語の処理 |
a = <lang:data type="byte"/>; |
<lang:value type="byte">1</lang:value> = a; |
マッピング |
<dat:byte enocde="signed" length="1"> a = <data type="byte"/>; </dat:byte> |
<dat:byte enocde="signed" length="1"> a = <value type="byte">1</value>; </dat:byte> |
2. RELAX NG との違い? - 2005/06/28追記
RELAX NG は XML 文書に "限定" して使用するものです。 mappingSchema は、より広い文書で使用するためのものです。 第1に、このことにより差が生じます。
2つ目の違いは、"実装" をどう意識するかで生じます。 複数の実装が存在する場合、その相互運用のために、適用範囲を絞りこむ必要が出てきます。 - 今のところ - mappingSchema には、そういう制約は設けておらず、 適用範囲を明示するのはツールの義務であり、使用範囲を選択するのはユーザに任されています。
これらの違いの多くは "制約" の違いとなって現れます。 - 今のところ - mappingSchema の文法自身は"制約" を極力設けないないようにしています。 以下には、mappingSchema では許容されるが RELAX NG では 許容されないパターンの例を列挙します。
2.1 注釈 (外来の属性及び要素の取り扱い) - 2005/07/21追記
RELAX NG では外来の属性及び要素は取り除かれます (see RELAX NG 4.1)。 mappingSchema では外来の属性及び要素は「無視されます」。以下の例は
<element name="A">
<other:comment>
<element name="B">
<text/>
</element>
</other:comment>
</element>
RELAX NG では
<element name="A"/>
と、等価ですが mappingSchema では
<element name="A">
<element name="B">
<text/>
</element>
</element>
と、等価になります。
2.2 難解な書式 - 2005/08/01更新
mappingSchema では下記の記述が「可能」です。
<byte encode="txt">
<data type="int"/>
</byte>
<byte encode="txt">
<data type="int"/>
</byte>
たとえば、これは '123456' という文字列にマッチします。 2 つのデータ項目がそれぞれどの部分文字列にマッチするかは 一意に決まりません。以下の 5 通りの可能性があります。
- '12345' 及び '6'
- '1234' 及び '56'
- '123' 及び '456'
- '12' 及び '3456'
- '1' 及び '23456'
このようなデータのデコードには労力がかります。 そして、なにより、取り扱える処理系が限られてきてしまうため、 使うべきではありません。
なお、下記のパターンは RELAX NG (see 7.2) でも mappingSchema でも許容されません (list の子として現れる場合を除く)。
<data type="int"/>
<data type="int"/>
3. 制約事項
umsCodeGenerator で処理するにあたり、mapping definition では以下の制約があります。
- optional 要素、oneOrMore 要素、zeroOrMore 要素のネストの深さは、最大 32 です。
- list 要素のネストの深さは、最大 32 です。
- define/ref の再帰定義はできません。
- define 要素の子孫に、optional 、oneOrMore、zeroOrMore を記述することはできません。
- dat:*//ums:* という経路は許されません。
- XML syntax において、デコード/エンコード関数のインターフェースは固定です。
- Language syntax においてコード記述可能な部分は、XML syntax の <package>、<class>、<function>、<arg>、<return>、<var>、<array>、 <value-of>、<callFunction>の部分です。 $TABLETOOLS_HOME/sample/tutorial に含まれる Language syntax の例を参考にしてください。