(57)【特許請求の範囲】
【請求項１】
EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームをデコードするためのEXIデコーダを生成するコンピュータ装置であって、
所定のXMLスキーマで定義されたXML文書構造における箇所と、変数の名前とを互いに対応づけた対応情報を読み込む第1読み込み部と、
前記XML文書構造の各要素を表現するイベントと、EXIイベントコードと、次に用いるべき文法と、の関係を定めた複数の文法を含むEXI文法書を読み込む第2読み込み部と、
開始文法から前記EXI文法書の各文法を順次辿るように選択する文法選択部と、
前記文法を選択するごとに前記XML文書構造上の位置を特定する文法スタックを逐次更新し、更新された文法スタックが、前記対応情報で示される箇所を示すかどうかを判断する更新判定部と、
前記更新された文法スタックが前記箇所を示さないとき、選択した文法に対して前記文法スタックが示す位置に対応する前記EXIストリームの値を読み飛ばす、読み飛ばし関数を設定する、読み飛ばし関数設定部と、
前記更新された文法スタックが前記箇所を示すとき、前記文法スタックが示す位置に対応する前記EXIストリームの値を読み出して、前記箇所に対応する前記変数に与える、読み出し関数を設定する、読み出し関数設定部と、
各前記文法に対しそれぞれ選択された前記読み飛ばし関数および前記読み出し関数を含むEXIデコーダを生成するコードコンポーザと、
を備えたコンピュータ装置。
【請求項２】
前記変数は、構造体の要素である
ことを特徴とする請求項1に記載のコンピュータ装置。
【請求項３】
前記対応情報は、前記XML文書構造において前記箇所に対して定義された型と、前記変数の型との情報を含み、
前記読み出し関数は、読み出した値の型を前記変数の型に変換して、前記変数に与えるものである
ことを特徴とする請求項１または２に記載のコンピュータ装置。
【請求項４】
EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームをデコードするためのEXIデコーダを生成するためのプログラムであって、
所定のXMLスキーマで定義されたXML文書構造における箇所と、変数の名前とを互いに対応づけた対応情報を読み込む第1読み込みステップと、
前記XML文書構造の各要素を表現するイベントと、EXIイベントコードと、次に用いるべき文法と、の関係を定めた複数の文法を含むEXI文法書を読み込む第2読み込みステップと、
開始文法から前記EXI文法書の各文法を順次辿るように選択する文法選択ステップと、  前記文法を選択するごとに前記XML文書構造上の位置を特定する文法スタックを逐次更新し、更新した文法スタックが、前記対応情報で示される箇所を示すかどうかを判断する更新判定ステップと、
前記更新された文法スタックが前記箇所を示さないとき、選択した文法に対して前記文法スタックが示す位置に対応する前記EXIストリームの値を読み飛ばす、読み飛ばし関数を設定する、読み飛ばし関数設定ステップと、
前記更新された文法スタックが前記箇所を示すとき、前記文法スタックが示す位置に対応する前記EXIストリームの値を読み出して、前記箇所に対応する前記変数に与える、読み出し関数を設定する、読み出し関数設定ステップと、
各前記文法に対しそれぞれ選択された前記読み飛ばし関数および前記読み出し関数を含むEXIデコーダを生成するステップと、
をコンピュータに実行させるためのプログラム。
【請求項５】
請求項1ないし4のいずれか一項に従って生成された前記EXIデコーダと、前記EXI文法書を記憶する記憶部と、
前記EXIデコーダを実行する実行部と、
前記EXIストリームを受信する受信部と、を備え、
前記EXIストリームは、複数のEXIイベントコードと、前記EXIイベントコードの全部または一部にそれぞれ関連づけられた値とのシーケンスであり
前記実行部は、
前記EXIストリームの先頭から順次EXIイベントコードを特定し、前記EXIイベントコードと、事前に選択された文法とに基づき、次に用いる文法を選択し、
前記EXIイベントコードに値が関連づけられているとき、前記EXIイベントコードが特定されたときの文法に対応づけられた、前記読み飛ばし関数または前記読み出し関数により、前記値を処理し、
前記読み出し関数により取得された前記変数の値を出力する
ことを特徴とする通信機器。  
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、EXI（EXI（Efficient XML(Extensible Markup Language) Interchange））デコーダを生成するためのデコーダコンパイラおよびプログラム、ならびにEXIデコーダを搭載した通信機器に関する。
【背景技術】
【０００２】
特開10-240652号公報では、ASN.1 のデコーダの構成について開示している。ASN.1 の有限状態機械による解釈により、デコーダプログラムの生成を行っている。
【０００３】
ASN.1 では、一般に通信に記載される所望の情報が限定されており、全ての情報を取得することが前提である。従って、組込み機器においても全ての可能性に対して構文解析を行うことができる。
【０００４】
一方、EXI は、より計算資源の豊富な環境向けのXML に基づく技術であり、XML の文書構造を規定するXML スキーマの解釈を含め、正常な情報のデコードのためには、機器にとっての所望の情報以外の情報の解釈が必要となる。したがってデコーダのコーディングが複雑になるとともに、機器の処理負荷やメモリに対する負荷が高くなる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開10-240652号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の一側面は、所望の情報のみを低負荷で抽出可能なEXIデコーダを生成することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一態様としてのデコーダコンパイラは、EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームをデコードするためのEXIデコーダを生成するデコーダコンパイラであって、第1読み込み部と、第2読み込み部と、文法選択部と、更新判定部と、読み飛ばし関数設定部と、読み出し関数設定部と、コードコンポーザとを備える。
【０００８】
前記第1読み込み部は、所定のXMLスキーマで定義されたXML文書構造における箇所と、変数の名前とを互いに対応づけた対応情報を読み込む。
【０００９】
前記文法選択部は、前記XML文書構造の各要素を表現するイベントと、EXIイベントコードコードと、次に用いるべき文法と、の関係を定めた複数の文法を含むEXI文法書を読み込む。
【００１０】
前記文法選択部は、開始文法から前記EXI文法書の各文法を順次辿るように選択する。
【００１１】
前記更新判定部は、前記文法を選択するごとに前記XML文書構造上の位置を特定する文法スタックを逐次更新し、更新された文法スタックが、前記対応情報で示される箇所を示すかどうかを判断する。
【００１２】
前記読み飛ばし関数設定部は、前記更新された文法スタックが前記箇所を示さないとき、選択した文法に対して前記文法スタックが示す位置に対応する前記EXIストリームの値を読み飛ばす、読み飛ばし関数を設定する。
【００１３】
前記読み出し関数設定部は、前記更新された文法スタックが前記箇所を示すとき、前記文法スタックが示す位置に対応する前記EXIストリームの値を読み出して、前記箇所に対応する前記変数に与える、読み出し関数を設定する。
【００１４】
前記コードコンポーザは、各前記文法に対しそれぞれ選択された前記読み飛ばし関数および前記読み出し関数を含むEXIデコーダを生成する。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施形態を説明するための背景知識として、EXI デコーダの内容を説明するための図である。
【図２】本発明の実施形態で生成される専用EXIデコーダの動作イメージを示す。
【図３】本発明の実施形態に係るデコーダコンパイラと、それに対する入出力の関係を示す。
【図４】EXI ストリームを構成するXML 文書の内容と、専用EXI デコーダの内部構成との関係について説明する。
【図５】本発明の実施形態に係るデコーダコンパイラの構成を示す図である。
【図６】本発明の実施形態に係るデコーダコンパイラの処理の流れの例を説明したフローチャートである。
【図７】専用EXIデコーダによるデコード処理の流れを示す。
【図８】図7のステップS122で行う処理の詳細な流れを示すフローチャートである。
【図９】図7のステップS124で行う処理の詳細な流れを示すフローチャートである。
【図１０】本発明の実施形態により生成した専用EXIデコーダを組み込んだ通信機器の構成例を示す。
【発明を実施するための形態】
【００１６】
以下、図面を参照しながら、本発明の実施形態について説明する。
【００１７】
図1は、本発明の実施形態を説明するための背景知識として、EXI デコーダの内容を説明するための図である。
【００１８】
EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームは、元はXML文書から生成されたイベントの列であり、XML文書のタグ開始・終了・属性(attribute)などの構造（イベントコード）と、構造に含まれる値（データ）とが、一列に配置されたイベントストリームである。このようなEXIストリームがEXIデコーダに与えられ、デコードされる。
【００１９】
XML文書 では、タグは入れ子構造になっている。XML の特性(スキーマ等) から、ストリームにおいて、許されるイベントの順序が決定される。EXIデコーダは、これを解釈するための状態機械の形で、構成される。
【００２０】
EXIデコーダの処理として、タグが開始されるとそのタグの内部の構文を解釈するための状態機械が生成され、タグの終了とともにその状態機械は終了する。そして、タグの入れ子関係が状態機械のスタックとなり、ストリームの内容に応じてこのスタックを構成する仕組みを備えることにより、EXI デコーダは構成される。通常のEXIデコーダでは、この状態機械における状態遷移から、元となるXML文書を復元する。
【００２１】
本発明の実施形態では、特に組込み機器への搭載などの限定的な用途を想定したEXIデコーダを提供する。つまり、自由度の高い構造化文書であるXML 文書をそのまま利用（復元）するのではなく、EXIストリームから、用途に関係ある部分（後述する構造体の値）のみを出力するEXIデコーダの生成を目的とする。このようなEXIデコーダ（専用EXIデコーダ）を生成するための、デコーダコンパイラ（デコーダ生成器）を、本実施形態では、提案する。
【００２２】
図2に、本実施形態で生成される専用EXIデコーダの動作イメージを示す。
【００２３】
専用EXIデコーダは、EXIストリームを入力として、一定の構造を持つ構造体(メモリイメージ) を出力する。たとえば図1の例において、「内容1」、「内容2」、「内容3」が定義された構造体をターゲットとしたデコーダは、「内容1」、「内容2」、「内容3」の値のみを出力し、XML文書全体の復元は行わない。つまり、EXI ストリームとして入力されたXML文書全体情報のうち、機器が想定する用途に合致しない部分は捨てる。
【００２４】
これにより、専用EXIデコーダを利用するアプリケーション(組み込み機器の動作プログラム等) は、XMLの自由度を無視して処理を記述でき、また不要な処理に対処するためのコードをデコーダに搭載しなくて良いという効果が得られる。
【００２５】
図3に、本実施形態に係るデコーダコンパイラと、それに対する入出力の関係を示す。
【００２６】
本デコーダコンパイラ11は、対象XML文書の構造を決定するXMLスキーマから生成したEXI文法木、スキーマと出力構造体とを対応づけるスキーマ−構造体対応情報、デコーダのコードテンプレート（コード断片辞書）を入力として受ける。EXI 文法木は、XML スキーマがスキーマ分析モジュール31により変換されたものである。デコーダコンパイラ11は、これらの入力に基づき、専用EXIデコーダを生成する。
【００２７】
付録A.1に、説明のための利用するXML文書を示す。
XML文書は、タグ名、属性、属性値、本文など、様々な要素により記述される。本実施形態に係る専用EXIデコーダは、このようなXML文書がエンコードされたEXIストリームを入力としてデコードし、必要な情報のみを抽出する。
【００２８】
付録A.2 に、本説明で用いるXML スキーマの例を示す。
XMLスキーマは、XML文書の許容される構造を定める。このスキーマ例は、参考文献1（John Schneider and Takuki Kamiya. Efficient XML Interchange (EXI) Format 1.0. W3C  Candidate Recommendation, December 2009. http://www.w3.org/TR/exi/）より引用したものである。付録A.1のXML文書は、付録A.2のXMLスキーマに準拠している。
【００２９】
付録A.3に、付録A.2のスキーマから生成したEXI文法の例を示す。
XML文書構造の各要素を表現するイベントと、EXIイベントコードと、次に用いるべき文法との関係を定めた複数の文法を含む。本実施形態では、XMLのイベントとして、SAXイベントを想定している。
【００３０】
XML文書をSAXイベント列に変換するSAXパーサは広く知られているものである。エンコード側の装置では、XML文書をSAXイベント列に変換し、SAXイベント列とEXI文法とからEXIストリームを生成する。EXIストリームはEXIイベントコードと、EXIイベントコードに関連づけられた値とを含むストリームである。
【００３１】
エンコード側でどのようにEXIストリームを生成するかは任意でよいが、一例を示すと次のようになる。SAXイベント列の先頭から順番に、EXI文法木における現在の文法から、対応するEXIイベントコードを特定するとともに、SAXイベントが値を指定するときはその値を取得し、さらに次に用いる文法をEXI文法木に基づき特定する。これをSAXイベント列の末尾まで繰り返すことで、EXIイベントコードと値とを含むEXIストリームを得ることができる。
【００３２】
付録A.4 に、スキーマ-構造体対応情報の例を示す。
スキーマ構造体対応情報の必須構成要素は、以下の通りである。
（1）出力となるべき構造体とその型
例では、struct product の部分と、各行の要素宣言(w_char* sku など) の部分にあたる。より詳細に、struct productは構造体の名前、skuなどは要素の名前、w_char*などは型である。  
（2）構造体が対応するXML タグの開始位置を示すXPath (あるいはXPath と同等の文書位置の指示子)。例では、/order/product が、タグ開始位置を示すXPathにあたる。これは、XML文書の<order>の下位の<product>から、対応する</product>までの範囲が、ひとつの構造体に対応する情報が存在する範囲（後述するBODY部）であることを意味する。  
（3）構造体の要素の箇所を特定するための、上記XPath 位置からの相対Path (あるいは同等の指示子)  
例では、「@sku;」 や「quantity/text();」が、相対Pathにあたる。前者の例の場合、productタグの属性の値の箇所が、構造体の要素(skuなど)の箇所である。また後者の例の場合、quantityタグで囲まれた本文の箇所が、構造体の要素（quantity）の箇所である。
（4）XML 文書に含まれる値（EXIストリームで送られてきた値）を、上記（1）の構造体の各要素に格納するために用いる型変換関数
【００３３】
例では、utf2wchar やutf2floatが、型変換関数にあたる。utf2wcharは、上記値の型を、utfからwcharに変換する関数である。utf2floatは、上記値の型を、utfからfloatに変換する関数である。utfは、XMLスキーマで用いることが定められた型である。
【００３４】
なお要素が1つのときは、構造体を用いなくてもよく、この場合は変数を定義すればよい。また本実施形態において構造体の各要素のことをそれぞれ変数と称することもある。
【００３５】
図4 を用いて、EXI ストリームを構成するXML 文書の内容と、本実施形態により生成される専用EXI デコーダの内部構成との関係について説明する。
【００３６】
専用EXIデコーダの処理において、入力となるXML 文書（EXIストリーム）は、「スキーマ-構造体対応情報」の開始位置タグ（<order>の下位の<product>）が登場するまで読み飛ばされる。
【００３７】
開始位置タグから順に必要な要素のみを読み取り、一つひとつ構造体の形でデコード結果を出力する。そして、それらの要素を、読み終えたらデコード終了となる。
【００３８】
より詳細に、XML文書は、図示のように、HEAD 部・BODY 部・TAIL 部の3つに分けることができる。HEAD部は、「スキーマ-構造体対応情報」の開始位置タグ（<order>の下位の<product>）が登場する直前までの部分である。TAIL部は、当該タグが終了した直後（本例では</product>の直後>から文書の末尾までの部分である。BODY部は、開始位置タグから終了タグまでの部分（<product>〜</product>）である。付録A.1の例では、BODY部は3回繰り返されている。
【００３９】
このようにHEAD 部・BODY 部・TAIL 部に分ける処理が簡単になる。HEAD部と、TAIL部には、構造体に対応する情報は含まれないため、すべて読み飛ばせばよい。BODY部についてのみ、必要な要素を読み出す処理ができるように、デコード処理を工夫する。この工夫された処理を行うのが、図示のBODY部デコーダ関数である。なお、HEAD 部・BODY 部・TAIL 部に分けることは本実施形態の必須要件ではなく、これらに分けることなく後述の処理を行っても良い。
【００４０】
図5は、本実施形態に係るデコーダコンパイラ11の構成を示す図である。
【００４１】
デコーダコンパイラ11は、文法選択部12、更新判定部13、コードコンポーザ14を備える。コードコンポーザ14は、読み飛ばし関数設定部15と、読み出し関数設定部16を備える。
【００４２】
デコーダコンパイラ11は、EXI文法木、スキーマ−構造体対応情報、コードテンプレート（コード断片辞書）を入力として受ける。デコーダコンパイラ11は、スキーマ−構造体対応情報を読み込む第1読み込み手段と、EXI文法木を読み込む第2読み込み手段とを含む。各読み込み手段の読み込み先は、同じまたは異なる記憶装置である。読み込みは、ネットワークを介して行っても良い。
【００４３】
文法選択部12は、所定の開始文法から、EXI文法木の各文法を順次辿るように選択する。
【００４４】
更新判定部13は、文法選択部12により文法を選択するごとに、XML文書構造上の位置を示す文法スタックを逐次更新する。更新判定部13は、更新した文法スタックが、スキーマ−構造体対応情報で指定される箇所を示すかを判断する。
【００４５】
コードコンポーザ14は、更新判定部13の判断結果に応じて、上記選択された文法に対して関数を設定する。
【００４６】
上記文法スタックが、スキーマ−構造体対応情報で指定される箇所を示さないとき、読み飛ばし関数設定部15を用いて、選択した文法に対して、文法スタックに示される位置の値を読み飛ばす、読み飛ばし関数を設定する。
【００４７】
上記文法スタックが、スキーマ−構造体対応情報で指定される箇所を示すとき、文法スタックに示される位置の値をEXIストリームから読み出して、その値を、当該箇所に対応する構造体要素（メンバ）に与える、読み出し関数を設定する。
【００４８】
コードコンポーザ14は、各文法に対しそれぞれ選択された読み飛ばし関数および読み出し関数を含むEXIデコーダを生成する。なお、EXIデコーダには、これらの関数の他、デコードに当然に必要とされる命令コードも含める。たとえば、開始文法を起点に、EXIストリームの先頭から順次EXIイベントを取り出し、EXI文法木と現在の文法に基づき、取り出したEXIイベントに応じて次に用いる文法を選択する命令コード、EXIイベントコードに値が関連づけられているときは、現在の文法に対応づけられた関数（読み飛ばし関数または読み出し関数）を実行して、取り出したEXIイベントに関連づけられた値を処理する命令コード、読み出し関数の実行により読み出した構造体の値を出力する命令コード等も含む。
【００４９】
以下、コードコンポーザ14が行う処理の動作について、さらに詳細に説明する。
【００５０】
図6は、本実施形態に係るデコーダコンパイラ11の処理の流れの例を説明したフローチャートである。
【００５１】
デコーダコンパイラ11は、文法スタックs と、デコーダ辞書D を持ち、これらを初期化する（S101、S102）。
【００５２】
デコーダ辞書D は、EXI 文法とイベントコードに基づき、生成する専用EXIデコーダ用のコード断片を格納する辞書である。
【００５３】
文法スタックは、文法のスタックであり、各文法解析木がXML 文書のどの部分に対応するのかを示す手がかりとなる。具体的には、各文法スタックは、タグや属性などのイベントに対応するが、タグの内容を示すラベルを、各スタックから集めて並べると、XPath によるタグのパス表記に近いものとなる(順序等は記述しない)。
【００５４】
また、処理済の文法を示す文法セットGs を初期化する（S103）。入力されたEXI 文法には開始文法(XMLのStartDocument に相当する文法) が必ず一つ含まれ、Gs は開始文法を初期値として持つ。また、開始文法に対応するスタック状態は空である。
【００５５】
ここで、「到達可能」という概念を定義する。
【００５６】
EXI の文法は、LeftHandSide, Terminal, NonTerminal,EventCode の4 つから構成される。LeftHandSide の状態の時、Terminal のイベントが発生したら、EventCode を出力し、NonTerminal の状態に移行する。LeftHandSide g1 からNonTerminalg2 の状態に以降する文法が存在する場合、状態g1 からg2 に到達可能である、と定義する。
【００５７】
たとえば付録A.3の例に則して説明する。XMLのイベントをEXIイベントに変換する例で説明すると、<product>に対する文法において、Use_color0状態のとき、AT(“color”)イベントが発生したら、イベントコード0（1ビットのゼロ）を出力し、Use_color1状態に遷移する。
【００５８】
デコーダコンパイラ11のメインプロセスは、Gs に含まれる文法から到達可能で、Gs に含まれない文法を、文法選択部12により一つ選択し（S104）、その文法に対してデコーダ辞書を作成することの繰り返しである。選択できる文法が複数あるときは、次回以降のループで選択する。これにより、EXI文法（付録A.3参照）に含まれる、全ての文法を処理し終えるまで、以下の処理を繰り返す（S105〜S109）。
【００５９】
選択した文法をg と置き、更新判定部13により、g に到達した文法の文法スタックs に、g に対応する文法を積むことで文法スタックs を更新する。ここで、文法スタックs の更新はEXI と同様に、タグ開始のSE(StartElement) に相当する時は一つ上に新しいスタックを生成し、タグ終了のEE(EndElement)に相当する時は最上位のスタックを消滅させる。
【００６０】
文法スタックs ならびに文法g から、現在の文法がXML のどの部分に対応するかを、更新判定部13により特定する。具体的には、文法スタックは各々XML タグの階層に対応し、文法g のTerminal （付録A.3の例では、ATやSEといったSAXイベントで指定される括弧内の値）が、構造体の要素や、文字列などに対応する。
【００６１】
「スキーマ-構造体対応情報」の構造体の各要素について、開始タグ位置と各要素の相対位置を加算すると、各要素のXML 文書中の位置が得られる。
【００６２】
開始タグが文法スタックs に含まれ、各要素の相対位置が文法スタックs あるいは文法g に対応する場合（S106のtrue）、読み出し関数設定部16により、デコーダ辞書D[g] として「読み出し関数」をセットする。読み出し関数は、該当する値を読み出し、変換関数により型変換して出力する関数である。スキーマ−構造対応情報に示される変換関数を利用する。
【００６３】
文法スタックs あるいは文法g に、対応する要素が存在しない場合（S106のfalse）、読み飛ばし関数設定部15により、デコーダ辞書D[g]として、「読み飛ばし関数」をセットする。
【００６４】
文法gを、文法セットGsに追加し、Gsに全ての文法が格納されているかを判断する（S109）。まだ格納されていないときは(false)、ステップS104に戻る。全ての文法が文法セットGsに格納されたら (true)、ステップS110に進む。
【００６５】
ステップS110では、文法セットGs内のすべての文法の各々に対するデコーダ辞書D[g] を、デコーダのコードテンプレートにセットし、必要な関数をリンクすることにより、EXI専用デコーダを得る。
【００６６】
以上の手続きを、付録A.3 のEXI 文法と、付録A.4 のスキーマ-構造体対応情報を事例として説明する。
【００６７】
スキーマ-構造体対応情報の開始タグは/order/product である。文法スタックs がTerm_order/Term_productとなった際に/order/product に対応する。なお、Term_orderは、SE（”order”）に対応するEXIイベントが読み出された状態を示し、Term_product は、SE(“product”)に対応するEXIイベントが読み出された状態を示すとする。
【００６８】
ここで、アトリビュート（属性）に対応する構造体要素を含む文法は、以下の2つの文法（Use_color0 :と、Use_color1 :）である。
Complete grammar for element <product>
Use_color0 :
AT("color") [schema-typed value] Use_color1  0
AT("sku") [schema-typed value] Use_sku1      1
AT("color") [untyped value] Use_color1       2.4.0
AT("sku") [untyped value] Use_sku1           2.4.1
Use_color1 :
AT("sku") [schema-typed value] Use_sku1      0
AT("sku") [untyped value] Use_sku1           1.2.0
それぞれ、AT("color") が、@color に対応し、AT("sku") が@sku に対応する。
【００６９】
したがって、Use_color0 :の文法に対して、productタグの属性color, skuの値を読み出して、utfからwcharへの型変換を行った上、構造体要素「w_char* sku」,「w_char* color」に、変換された値を入力する、読み出し関数を設定する。Use_color1 :の文法についても同様に、読み出し関数を、当該文法に対するデコーダ辞書D[g]として、設定する。
【００７０】
また、quantity/text(); およびprice/text(); は次の文法に対応する。
Complete grammar for element <product>
Term_quantity0,1 :
CH [untyped value] Term_quantity0,1         2.1
Term_price0,1 :
CH [untyped value] Term_price0,1            3.1
Term_quantity1,1 :
CH [untyped value] Term_quantity1,1         2.1
Term_price1,1 :
CH [untyped value] Term_price1,1            1.1
text() は、CH(Character) に対応するので、以上の文法が各要素に対応する。
【００７１】
したがって、Term_quantity0,1 :の文法に対して、SE(quantity)に相当するEXIイベントの値（XML文書でいうところのquantityタグの本文の値）を読み出して、intからutfへの型変換を行った上、構造体要素「int quantity」に変換された値を入力する、読み出し関数を設定する。Term_price0,1 :、Term_quantity1,1 :、Term_price1,1 :の文法についても同様に、読み出し関数を、デコーダ辞書D[g]として、それぞれ設定する。
【００７２】
つまり、EXI ストリームでは、イベントコードに続いて、存在する場合は値が与えられるが、この値を構造体に入力するための関数が、対応する文法のデコーダ辞書D に記載される。
【００７３】
つまり、utf2wchar あるいはutf2int / utf2floatにより、読み取った値（utf型を有する）を、charあるいはint/floatに変換する関数を、対応する文法のデコーダ辞書にDに記載する。
【００７４】
スキーマ-構造体対応情報に対応しない文法については、イベントコードを読み出した後、値（必要としない情報）を読み飛ばす関数が、デコーダ辞書D に記載される(値が存在しない場合は、読み飛ばし関数の代わりに、ヌルを記載しても良い)。
【００７５】
以下、本実施形態により生成された専用EXIデコーダがどのように動作するかを説明する。
【００７６】
図7に、専用EXIデコーダによるデコード処理の流れを示す。専用EXIデコーダはデコーダ辞書Dをもとに、デコード処理を行う。
【００７７】
専用EXIデコーダは、EXI 文法に対応したデコーダ機能を含む。ただし、通常の(知られている方式の) デコーダと、次の3 点で異なる。  
1. 構造体-スキーマ対応情報に記載されたデコード開始位置までのストリーム（HEAD部に相当）は、単に読み飛ばす（S121のfalse、S122、S123）
2. BODY 部(XML 文書のうち構造体-スキーマ対応情報が対応する部分) のデコードは、繰り返し要素（たとえば<product>〜</product）がこれに相当）を一つデコードするたびに構造体r を生成し、デコーダ呼び出し元に返す（S121のtrue、S124、S125、S126のS127のt）
3. BODY 部を読み終わったら、残りのストリーム（TAIL部に相当）は捨てる（S127のfalse）
【００７８】
より詳細には、まずEXIストリームを先頭から読み込み、BODY開始位置（<product>）かを判断し、BODY開始位置でないときは（S121のfalse）、図8の「EXIデコーダ：：処理」を実行し（S122）、次に、現在の文法に対応する辞書デコーダにより、値を読み飛ばす（S123）。
【００７９】
BODY開始位置になったときは（S121のtrue）、図9のBODY部処理を実行し（S124）、処理結果として構造体rを生成し、BODY部がさらに存在すれば（S127のtrue）、すなわちBODY開始位置（<product>）を示すEXIイベントが検出されれば、ステップS124に戻る。
【００８０】
BODY部がもはや存在しなければ（S127のfalse）、その時点で処理を終了し、TAIL部に対するEXIイベントの処理は行わない。
【００８１】
図8 は、図7のステップS122、または後述する図9のステップS142で行う「EXIデコーダ：：処理」の流れを示す。
【００８２】
現在の文法に従って理解されるEXIイベントコードが、タグ終了イベント（EE）またはタグ開始イベント（SE）を示すかを判断する（S131、S132、S133、S135）。タグ開始イベントおよびタグ終了イベントを示すときに限って、状態機械スタックを操作する。つまり、タグ開始イベントを示すときは、開始イベントに対応する状態機械を、状態機械スタックにプッシュ（puch）し、タグ終了イベントを示すときは、状態機械スタックから状態機械をポップ(pop)する（S136、S134）。そして、現在のスタック状態sを返す。この操作により、デコード処理が文書のどこに相当するかを、デコード処理の各ステップで確認できる。
【００８３】
図9 は、図7のステップS124で行うBODY部処理の流れを示す。
【００８４】
EXI ストリームから読み出されるべき構造体r を、構造体-スキーマ対応情報に含まれる構造体定義に従って初期化し（S141）、図8の「EXIデコーダ：：処理」を行い（S142）、現在の文法スタックが、スキーマ−構造体対応情報の要素が持つXPathに対応するかを判断する（S143）。
【００８５】
要素がもつXpathに対応するときは(true)、EXIストリームの値部分を、現在の文法に対応する辞書デコーダを用いて読み出し、読み出した値を、構造体rの要素のうち該当する要素に書き込む（S144,S145）。
【００８６】
一方、要素がもつXpathに対応しないときは（false）、現在のEXIイベントが、BODY部タグを閉じるイベントかを検査し、trueであるときは、本処理を終了し、falseであるときは、ステップS142に戻る。
【００８７】
図10に、本実施形態により生成した専用EXIデコーダを組み込んだ通信機器の構成例を示す。
【００８８】
本実施形態で生成した専用EXIエンコーダは、スマートメータおよび移動体機器等、資源制約の厳しい通信機器に組み込まれる。
【００８９】
通信機器21は、相手機器との間で効率的なXML文書のやりとりを行うため、相手機器（図示せず）からに、XML文書の内容がエンコードされたEXIストリームを受信部23で受信する。EXIストリームは、上述したように、複数のEXIイベントと、EXIイベントの全部または一部にそれぞれ関連づけられた値とのシーケンスである。
【００９０】
デコード実行部であるCPU24が、記憶部22内の専用EXIデコーダをメモリ25に展開して実行する。実行により、EXI文法木もメモリ25に読み出され用いられる。なお、EXI文法木がEXIデコーダに含まれていても良い。専用EXIデコーダの実行により、構造体の各要素の値のみが、EXIストリームから取得される。
【００９１】
つまり、EXIストリームの先頭からEXIイベントコードを特定し、当該EXIイベントコードと、事前に選択された文法（最初は開始文法）に基づき、次に用いる文法を選択する。そして、EXIイベントコードに値が関連づけられているときは（EXIイベントコードの次に値が格納されているとき、つまりEXIイベントコードがCHイベントあるいはATイベントに相当するとき）、EXIイベントコードが得られたときの文法に対応づけられた関数（読み出し関数または読み飛ばし関数）により、当該値を処理する。例えば、一つの応用事例として、読み出し関数の実行により読み出した構造体の各要素(変数)の値を、表示部26に出力する、などといった応用が考えられる。各要素の値を記憶部22または他の記録媒体に格納してもよい。EXIデコーダの動作の詳細な説明は既に、図7、図8、図9および図2を用いて述べた通りである。
【００９２】
以上に説明したEXI デコーダコンパイラ11により、任意のXML スキーマに対応するEXI デコード処理に関して、組み込み向けのような特定用途の環境において、その用途に対応する専用のデコーダを生成できる。このデコーダは、出力に無関係な不要な部分を読み飛ばし、出力に関係する部分のみを読み出して、構造体の形で返す。これにより、デコーダ利用側(組み込み機器などの機器制御プログラム)は、XML が持つ高い自由度に対応する必要がなくなる。よってデコーダのみならず周辺の構成が、公知なEXI デコード方式に比べて簡素とすることができる。また、デコーダ利用側の処理負荷が低くて済む。
【００９３】
なお、以上に説明した実施形態におけるデコーダコンパイラ11は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、デコーダコンパイラ11における文法選択部12、更新判定部13およびコードコンポーザ14は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、デコーダコンパイラ11は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
【００９４】
A サンプルデータ
A.1 想定するXML文書の具体例
<?xml>
<order>
<product sku="1JB339" color="white">
<quantity>40</quantity>
<price>339.50</price>
</product>
<product sku="1JB340" color="black">
<quantity>25</quantity>
<price>155.0</price>
</product>
<product sku="1JB341" color="green">
<quantity>30</quantity>
<price>183.95</price>
</product>
</order>
A.2 XMLスキーマの例(参考文献1より引用)
<xs:element name="product">
<xs:complexType>
<xs:sequence maxOccurs="2">
<xs:element name="description" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:integer" />
<xs:element name="price" type="xs:float" />
</xs:sequence>
<xs:attribute name="sku" type="xs:string" use="required" />
<xs:attribute name="color" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element ref="product" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
A.3 EXI 文法の例(参考文献1より引用)
Complete grammar for element <product>
Event Code
Use_color0 :
AT("color") [schema-typed value] Use_color1      0
AT("sku") [schema-typed value] Use_sku1          1
EE                                               2.0
AT(xsi:type) Use_color0                          2.1
AT(xsi:nil) Use_color0                           2.2
AT (*) Use_color0 2.3
AT("color") [untyped value] Use_color1           2.4.0
AT("sku") [untyped value] Use_sku1               2.4.1
AT (*) [untyped value] Use_color0                2.4.2
SE(*) Use_sku1_copied 2.5
CH [untyped value] Use_sku1_copied               2.6
Use_color1 :
AT("sku") [schema-typed value] Use_sku1          0
EE                                               1.0
AT (*) Use_color1                                1.1
AT("sku") [untyped value] Use_sku1               1.2.0
AT (*) [untyped value] Use_color1                1.2.1
SE(*) Use_sku1_copied                            1.3
CH [untyped value] Use_sku1_copied               1.4
Use_sku1 :
SE("description") Term_description0,1            0
SE("quantity") Term_quantity0,1                  1
EE                                               2.0
AT (*) Use_sku1                                  2.1
AT (*) [untyped value] Use_sku1                  2.2.0
SE(*) Use_sku1_copied                            2.3
CH [untyped value] Use_sku1_copied               2.4
Use_sku1_copied :
SE("description") Term_description0,1            0
SE("quantity") Term_quantity0,1                  1
EE                                               2.0
SE(*) Use_sku1_copied                            2.1
CH [untyped value] Use_sku1_copied               2.2
Term_description0,1 :
SE("quantity") Term_quantity0,1                  0
EE                                               1
SE(*) Term_description0,1                        2.0
CH [untyped value] Term_description0,1           2.1
Term_quantity0,1 :
SE("price") Term_price0,1                        0
EE                                               1
SE(*) Term_quantity0,1                           2.0
CH [untyped value] Term_quantity0,1              2.1
Term_price0,1 :
SE("description") Term_description1,1            0
SE("quantity") Term_quantity1,1                  1
EE                                               2
SE(*) Term_price0,1                              3.0
CH [untyped value] Term_price0,1                 3.1
Term_description1,1 :
SE("quantity") Term_quantity1,1                  0
EE                                               1
SE(*) Term_description1,1                        2.0
CH [untyped value] Term_description1,1           2.1
Term_quantity1,1 :
SE("price") Term_price1,1                        0
EE 1
SE(*) Term_quantity1,1                           2.0
CH [untyped value] Term_quantity1,1              2.1
Term_price1,1 :
EE                                               0
SE(*) Term_price1,1                              1.0
CH [untyped value] Term_price1,1                 1.1
Complete grammar for element <order>
Event Code
Term_product 0,0 :
SE("product") Term_product 1,0                   0
EE                                               1.0
AT(xsi:type) Term_product 0,0                    1.1
AT(xsi:nil) Term_product 0,0                     1.2
AT (*) Term_product 0,0                          1.3
AT (*) [untyped value] Term_product 0,0          1.4.0
SE(*) Term_product 0,0_copied                    1.5
CH [untyped value] Term_product 0,0_copied       1.6
Term_product 0,0_copied :
SE("product") Term_product 1,0                   0
EE                                               1.0
SE(*) Term_product 0,0_copied                    1.1
CH [untyped value] Term_product 0,0_copied       1.2
Term_product 1,0 :
SE("product") Term_product 1,0                   0
EE                                               1
SE(*) Term_product 1,0                           2.0
CH [untyped value] Term_product 1,0              2.1
A.4 スキーマ-構造体対応情報
/order/product <= struct product {
w_char* sku   <- utf2wchar | @sku;
w_char* color <- utf2wchar | @color;
int quantity  <- utf2int   | quantity/text();
float price   <- utf2float | price/text();
};
【図１】
0005325921.tif 000002
【図２】
0005325921.tif 000003
【図３】
0005325921.tif 000004
【図４】
0005325921.tif 000005
【図５】
0005325921.tif 000006
【図６】
0005325921.tif 000007
【図７】
0005325921.tif 000008
【図８】
0005325921.tif 000009
【図９】
0005325921.tif 000010
【図１０】
0005325921.tif 000011