(57)【要約】【課題】　必要なメモリ容量を増加させることなく組み込み制御システムに適用可能なコードの最適化を行うコード生成方法を提供すること。【解決手段】　全体制御部１１０は、記憶装置１０４に記憶されたソフトウエア仕様であるモデル図，動作図を読みだし、仕様解析部１０６を起動させて、字句解析や文法解析を行う。次にオブジェクト指向機能排除部１０７を起動させて、記憶装置１０４に記憶された機能選択項目に基づいて、使用しない機能を決定する。次に、コード生成部１０８を起動させて、仕様解析部１０６で字句解析，文法解析が行われたソフトウエア仕様とオブジェクト指向機能排除部１０７で決定された出力コードパターンに基づいてコード生成を行う。【選択図】図１
2004118865.tif 000002
【特許請求の範囲】
【請求項１】
　入力されたオブジェクト指向に基づく仕様書データを、記憶装置から読み出された仕様記述文法に基づいて字句解析，文法解析を行い、前記仕様書データから文字列を抽出し、
　前記仕様書データからコードを生成するための条件であって、不要な機能が指定された機能排除規則データを記憶装置に記憶し、
　前記抽出された前記文字列を前記記憶装置から読み出された前記機能排除規則データに従って、オブジェクト指向の機能のうち不要な機能を排除したプログラム情報を生成し、
　前記生成された前記プログラム情報に基づいてコードを生成することを特徴とするソフトウエア生成方法。
【請求項２】
　請求項１のソフトウエア生成方法において、
　前記機能排除規則データにより仮想関数の機能を排除することを特徴とするソフトウエア生成方法。
【請求項３】
　請求項１のソフトウエア生成方法において、
　前記機能排除規則データによりインスタンスの動的生成の機能を排除することを特徴とするソフトウエア生成方法。
【請求項４】
　請求項１のソフトウエア生成方法において、
　前記機能排除規則データは、オブジェクト名，メソッド名からなる入力パターンと、オブジェクトの機能と、前記オブジェクトの機能の使用，不使用と、使用に対する出力コードの生成パターン及び不使用に対する出力コードの生成パターンから構成されていることを特徴とするソフトウエア生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
　本発明はソフトウエアの自動生成装置に係り、特にオブジェクト指向仕様書から、コード効率の良いコードを生成するソフトウエア生成装置に関する。
【背景技術】
【０００２】
　コード生成装置は、オブジェクト指向のソフトウエア記述からソフトウエアを生成するものである。これは、一般に、オペレータの記述した仕様書を入力装置から入力し、その仕様を解析し、プログラムコードを生成し出力するものである。
【０００３】
　しかしながらこのようにオペレータの記述した仕様書に基づいて単にコード生成を行うと目的とするコードが非常に大きくなり、大きなメモリ容量が必要になるといった問題が生ずる。
【０００４】
　この問題を解決するものとして、特許文献１には、目的コードの大きさを削減する方式が記述されている。これは、オペレータの記述した仕様書の構文意味解析部において、クラス宣言の意味解析処理時にメソッドの所属するクラス名と入力ファイル名とを比較し、一致すればメソッドアドレス格納テーブルの実体および宣言を出力コード内に生成し、一致しなければメソッドアドレス格納テーブルの宣言のみを出力コード内に生成するものである。
【０００５】
【特許文献１】特開平６−２６６５６２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
　しかしながら、上述のようなコード生成方式では、オブジェクト指向のプログラムのコードを生成する場合のオブジェクト指向の機能については何ら考慮されていない。
【０００７】
　つまり、オブジェクト指向の仕様書からコードを生成する場合、不要となるオブジェクト指向の機能についてもコードを生成してしまう。
【０００８】
　特に組み込み制御システムのソフトウエアに用いるには出力されたコードが大きくなり、それを搭載するためにメモリ容量のおおきい装置を用いることになる、コスト増大をまねくといった問題がある。
【０００９】
　本発明は、上記問題点に鑑みて、必要なメモリ容量を増加させることなく組み込み制御システムに適用可能なコードの最適化を行うコード生成装置を提供することを目的とする。
【課題を解決するための手段】
【００１０】
　上記目的は、入力されたオブジェクト指向に基づく仕様書を解析し、仕様情報を抽出する仕様解析手段と、仕様解析手段により得た仕様情報を予め定められた機能排除規則に従って、オブジェクト指向の機能のうち不要な機能を排除したプログラム情報を生成する機能排除手段と、機能排除手段により得たプログラム情報に基づいてコードを生成するコード生成手段とを有することにより達成することができる。
【発明の効果】
【００１１】
　以上説明したように、本発明によればオブジェクト指向の使用書からコードを生成する際に、オブジェクト指向プログラミング言語の不要な機能を排除することで、この機能を実現するための機構そのものが削減される。その結果、必要なメモリ容量が大幅に減少されたコードが生成されるようになる。
【発明を実施するための最良の形態】
【００１２】
　図１は、コード生成装置の全体構成を示したものである。コード生成装置はソフトウエア仕様や最適なコードを生成するための条件である機能選択項目を入力するためのキーボードやマウスなどの入力装置１０１，入力装置１０１のキーボード等から入力されたソフトウエア仕様や機能選択項目，生成されたコードを表示するＣＲＴなどの表示装置１０２，フロッピー(登録商標)ディスク等の携帯型の記憶装置に記憶されたソフトウエア仕様や機能選択項目を読み出したり、生成されたコードを書き込むための書込／読出装置１０３，入力装置１０１又は書込／読出装置１０３から入力されたソフトウエア仕様や機能選択項目を記憶するための記憶装置１０４，入力装置１０１，記憶装置１０４から送られてくるソフトウエア仕様と機能選択項目に基づいて最適なコードを生成するための処理装置
１０５から構成されている。
【００１３】
　また、処理装置１０５は入力されたソフトウエア仕様に対して字句解析や文法解析を行う仕様解析部１０６，入力された機能選択項目に基づいて使用しない機能を排除するオブジェクト指向機能排除部１０７，オブジェクト指向機能排除部１０７で使用しないとされた機能を排除して仕様解析部１０６で字句解析，文法解析を行ったソフトウエア仕様からコードを生成するコード生成部１０８，入力装置１０１からソフトウエア仕様及び機能選択項目を入力するために表示装置１０２の画面を制御する入力画面制御部１０９，各部の制御を行う全体制御部１１０から構成されている。更に入力画面制御部１０９はクラスインターフェイス記述部１１１，処理詳細記述部１１２，機能選択項目記述部１１３から構成されている。尚、コード生成部１０８で生成されたコードは最終的に表示装置１０２に表示されたり、書込／読出装置１０３からフロッピー（登録商標）ディスク等の携帯型の記憶装置に記憶される。
【００１４】
　図２は、処理装置１０５の全体制御部１１０の動作を示したフローチャートである。本処理装置１０５は、コードを生成するソフトウエア仕様や機能選択項目を入力する入力モードと、入力されたソフトウエア仕様からコードを生成するコード生成モードがある。入力装置１０１からのオペレータの指示により入力モードが選択された場合、全体制御部
１１０は入力画面制御部１０９を起動する。起動された入力画面制御部１０９は、クラスインターフェイス記述部１１１によりオペレータからのソフトウエア仕様の一形態であるモデル図の入力を受け付け、記憶装置１０４にこのモデル図を格納する。
【００１５】
　次に入力画面制御部１０９の処理詳細記述部１１２を起動させ、オペレータがソフトウエア仕様の一形態である動作図の入力を受け付け、この動作図を記憶装置１０４に記憶する。
【００１６】
　最後に、機能選択項目記述部１１３を起動させ、入力されたソフトウエア仕様からコードを生成するための条件である機能選択項目の入力を受け付け、記憶装置１０４に記憶する。
【００１７】
　一方、オペレータによりコード生成モードが選択された場合、全体制御部１１０は、記憶装置１０４に記憶されたソフトウエア仕様であるモデル図，動作図を読みだし、仕様解析部１０６を起動させて、字句解析や文法解析を行う。次にオブジェクト指向機能排除部１０７を起動させて、記憶装置１０４に記憶された機能選択項目に基づいて、仕様しない機能を決定する。次に、コード生成部１０８を起動させて、仕様解析部１０６で字句解析，文法解析が行われたソフトウエア仕様とオブジェクト指向機能排除部１０７で決定された出力コードパターンに基づいてコード生成を行う。尚、生成されたコードは、オペレータの指示により表示装置１０２に表示したり、書込／読出装置１０３により、フロッピー（登録商標）ディスクに書き込まれる出力処理を行う。
【００１８】
　以下、オブジェクト指向の分析・設計においてＯＯＩＥと呼ばれる手法を用いて各処理を具体的に説明する。
【００１９】
　まず、オペレータによって入力モードが選択された場合について説明する。入力モードの選択により、全体制御部１１０はクラスインターフェイス記述部１１１を起動する。これによりオペレータはソフトウエア仕様として図３に示すモデル図を入力装置１０１のキーボードやマウスを使って入力する。なお、図３に示したモデル図は自動車のエンジン制御などの制御の一部であるセンサからの入力値に対する処理を示したものである。
【００２０】
　図３に示したモデル図は、オブジェクト指向のプログラミングにおいて、プログラムの部品となるオブジェクトの構成を記述したものである（なお、ここで示したモデル図はオブジェクト指向の分野において、クラス図，オブジェクト図などと呼ばれることもある）。
【００２１】
　モデル図は静的な情報を詳細に記述したものであり、３つの欄から構成されている。第１欄３０１には、クラスの名称に相当する変数の名前や型を、第２欄３０２にはデータの構造体の定義を、第３欄３０３には行う処理の名称と引数型をそれぞれ記述する。
【００２２】
　図３に示したモデル図は、クラスの名称が第１欄３０１に記述されているように「センサ」であることを示している。また、このクラスが持つデータは第２欄３０２に記述されているように「Ａ／Ｄ変換値」，「更新値」，「前回更新値」であり、それぞれ「Ａ／Ｄ変換値」は「unsigned char」，「更新値」は「signed short」，「前回更新値」は
「signed short」の型で定義されていることを示している。更に、行う処理を示すメソッドは第３欄３０３に記述されているように「判定（）」，「更新（）」であり、「判定」は引数をとらず、返り値の型が「boolean（真理値）」，「更新（）」は引数をとらず、返り値も持たないことを示している。このようにオペレータによって記述されたモデル図の入力が終了するとクラスインターフェイス記述部１１１はモデル図を記憶装置１０４に記憶させる。
【００２３】
　次に、全体制御部１１０は、処理詳細記述部１１２を起動させ、オペレータは図４に示すような動作図をマウス，キーボード等を使って入力する。動作図とはそれぞれのクラスに属するオブジェクトのもつ処理を示すメソッドの詳細を記述したものである（なお、オブジェクト指向において、動作図の他に、コントロールチャート，状態遷移図などと呼ばれることもある）。図４は、図３の第３欄に示したセンサの処理を記述したものであり、「判定（）」４０１でセンサからの入力であるＡ／Ｄ変換値が予め定めた条件を満足するかを判定し、条件を満足する(ＹＥＳ)場合には「更新」を行い、条件を満足しない(ＮＯ)場合には「更新値＝前回更新値」４０３とする処理を行うことを示している。オペレータにより、入力された動作図は、記憶装置１０４に記憶される。
【００２４】
　次に全体制御部１１０により、機能選択項目記述部１１３が起動され出力装置１０２には機能選択の入力画面が表示される。機能選択とは、“インスタンスの動的生成”，“仮想関数”などのオブジェクト指向の機能をコード生成の際に使用するか、使用しないかを選択するためのものである。
【００２５】
　図５に機能選択項目の入力画面の表示例を示す。これは、オペレータによってオブジェクト指向の“インスタンスの動的生成”の機能選択項目が選択された場合の入力画面を示したものである。この機能選択項目は、入力パターン５０１，使用機能項目５０２，設定選択肢５０３，出力コードパターン５０４の４つの項目から構成されている。入力パターンは、対象となるプログラムのオブジェクト名，メソッド名を入力するためのものであり、使用機能項目５０２はオブジェクトプログラムの機能を示す部分である。設定選択肢
５０３は、使用機能項目５０２に示された機能を“使う／使わない”を選択するものであり、出力コードパターン５０４は、設定選択肢５０３の選択肢に対する出力コードパターンが示されている。つまり、設定選択肢５０３の“使う”について“オブジェクト名，メソッド名（引数）”という生成パターン情報が対応し、“使わない”について“オブジェクト名＿メソッド名（引数）”という生成パターン情報が対応している。尚、“オブジェクト名＿メソッド名（引数）”は部品名を表すものであり、オブジェクト指向プログラミング言語の“インスタンスの動的生成”を使わずにコードを生成することを意味する。
【００２６】
　この機能選択項目は、予め使用機能選択項目５０２，出力コードパターン５０４が入力されている。従って、オペレータは、入力パターン５０１，設定選択肢５０３を入力することにより簡単にオブジェクト指向の機能を使う／使わないを選択することができる。オペレータによって、決定された機能選択項目は、記憶装置１０４に格納される。
【００２７】
　以上、説明したように入力モードでは、ソフトウエア仕様と機能選択項目がオペレータによって入力される。
【００２８】
　次にオペレータによって、コード生成モードが選択された場合について説明する。
【００２９】
　オペレータによって、コード生成モードが選択されると、全体制御部１１０は、仕様解析部１０６を起動する。
【００３０】
　仕様解析部１０６で字句解析及び構文解析が行われ、図３，図４に示したように絵情報として入力されたソフトウエア仕様の情報から切り出した文字列と、この文字列の種類とを出力する。
【００３１】
　図６は、仕様解析部１０６が行う処理のフローチャートを示したものである。仕様解析部１０６は、ステップ６０１でオペレータによって入力されたソフトウエア仕様を記憶装置１０４から読み出す。絵情報として入力されたソフトウエア仕様の情報は、ステップ
６０２で予め記憶装置１０４に記憶した仕様記述文法とのマッチングを行う。このマッチングについては、“lex ＆ yacc プログラミング」，John R. Levine／Tony Mason／DougBrown 共著，１９９６.６.２１”に記載されているlex とyaccを使って行うものであり、ＢＮＦ（バッカス・ナウア記法）などで記述された記述構文と入力されたソフトウエア仕様とがマッチしているか判定する。判定の結果、仕様記述文法とマッチしなければステップ６０４で“error” を表示装置１０２に出力し、処理を終了する。判定の結果、仕様記述文法とマッチした場合にはステップ２０３で、入力されたソフトウエア仕様の文字列と、この文字列の変数名とを組として出力する。
【００３２】
　例えば、オペレータによって入力された図６に示したソフトウエア仕様の情報は、文字列“センサ”，変数名“変数１”文字列“Ａ／Ｄ変換値”，変数名“変数２”，文字列
“更新値”，変数名“変数３”と順次出力する。
【００３３】
　また、図４に示したソフトウエア仕様の情報は、角を丸めた四角形で囲んだものを“メソッド呼び出し”、四角形で囲んだものを“コマンド”と予め定義しておくことで、例えば４０１は属性が“メソッド呼び出し”、オブジェクト名が“センサ”，メソッド名が
“判定”，引き数はない、と出力される。
【００３４】
　次に、全体制御部１１０はオブジェクト指向機能排除部１０７を起動する。
【００３５】
　オブジェクト指向機能排除部は、記憶装置１０４にオペレータによって入力された機能選択項目に基づいてコードパターンを出力する。
【００３６】
　図７にオブジェクト指向機能排除部１０７の処理のフローチャートを示す。
【００３７】
　ステップ７０１で仕様解析部１０６の出力である文法解析結果を入力する。次に、ステップ７０２でコードを生成するための条件である機能選択項目を文法解析結果から得られたオブジェクト名，メソッド名と機能選択項目の入力パターンに基づいて記憶装置１０４から読み出す。
【００３８】
　ステップ７０４では、ステップ７０２で記憶装置１０４からテーブルが読み出せなかった場合には標準の生成パターン情報を出力する。ステップ７０２で記憶装置１０４からテーブルを読み出せた場合には、読み出された機能選択項目に基づいて、機能を使用するか否かをステップ７０５で判定し、使用する場合には機能選択項目で定義された標準の生成パターン情報を出力し（ステップ７０７）不使用の場合には機能選択項目で定義された生成パターン情報を出力する（ステップ７０６）。
【００３９】
　次に全体制御部１１０はコード生成部１０８を起動し、コード生成を行う。
【００４０】
　図８は、コード生成部１０８の動作のフローチャートを示したものである。
【００４１】
　まず、ステップ８０１で、オブジェクト指向機能排除部１０７の出力である生成パターン情報を入力し、ステップ８０２で、この生成パターン情報と記憶装置１０４に記憶されているコード生成パターンに基づいてコード生成を行う。
【００４２】
　ここで、仕様解析部１０６から図３，図４に示されたソフトウエア仕様とオブジェクト指向機能排除部１０７から“オブジェクト名，メソッド名（引数）”の生成パターン情報が入力された場合、コード生成部１０８は記憶装置１０４に記憶されているコード生成パターン情報に基づいてコードを生成する。
【００４３】
　つまり、記憶装置１０４にコード生成パターンとして、
　“Class”クラス名“｛”
　　型１，データ１；
　　型２，データ２；
　　　　　・
　　　　　・
　　　　　・
　　返値型１　メソッド１（引数型１）；
　　返値型２　メソッド２（引数型２）；
　　　　　・
　　　　　・
　　　　　・
　　“｝”
　　・判定文
　　　“if（“判定部”）｝”
　　条件成立時実行文；
　　“｝else｛”
　　条件不成立時実行文；
　　“｝”
と記憶されており、テーブルで“インスタンスの動的生成”が不使用と設定されている場合には、図９（ａ）に示すようにコードが生成される。そして、この結果をコンパイルすると図１０（ａ）に示す実行コードが得られる。このコードは表示装置１０２に出力されたり、書込／読出装置１０３によりフロッピー（登録商標）ディスクに記憶される。
【００４４】
　尚、図９（ｂ）には“インスタンスの動的生成”を使用と設定した場合のコード生成を、図１０（ｂ）にはその実行コードを示している。
【００４５】
　これら２つを比較すると、動的生成機能を使う場合にはインスタンスを陽に指定するため、図中１００１としてあらわされるインスタンスが明示され、インスタンスのアドレスをスタックに格納するためのコードが生成される。
【００４６】
　これに対して、動的生成を使わない場合には、１００１で示したインスタンスを指定する部分がなく、１００１に対応するコードは出力されない。このようにしてオブジェクト指向の機能を排除することによりコードサイズを削減することができる。
【００４７】
　オブジェクト指向の別の機能として“仮想関数”を行った場合について説明する。
【００４８】
　仮想関数は、ある親のクラスから複数の子のクラスを承継を用いて作成するときに、それぞれの子のクラスで実装が異なるときに、親のクラスで共通のインターフェイスを記述するものである。尚、“継承”とは、ある既存のクラスに対し、既存の性質を全て引き継いだ上で、差分を記述することで新たなクラスを作る方法である。
【００４９】
　図１１（ａ）は仮想関数を使うメソッドを指定したときに、オペレータが仮想関数を
“使用”と設定し、既に述べた方法により生成したコードを実行形式にしたメモリ配置を示したものである。この図に示すようにプログラムコード部に関数“判定（）”のコード１１０１が格納され、データ部に内部変数の領域１１０２と仮想関数“更新”の呼び出しのためのテーブル１１０３が格納される。仮想関数の仕組みを実現するのはデータ部に作られた仮想関数テーブル１１０１である。
【００５０】
　図１１（ｂ）は仮想関数の機能を“不使用”と設定した場合の実行形式にコンパイルしたメモリ配置を示したものである。この場合、仮想関数は直接呼び出されるので、図１１（ａ）の呼び出しテーブル１１０３に相当するものが不要となっている。
【００５１】
　このように、仮想関数やインスタンスの動的生成等のオブジェクト指向の機能を排除することで、オブジェクト指向の機能を実現するためのメカニズムを排除できる。また排除するには、オペレータには各オブジェクト指向のメカニズムに関する知識は不要で、“使用／不使用”を指定するだけで最適化が実現できる。
【００５２】
　次に機能選択項目について他の指定方法を説明する。
【００５３】
　図１２は、図２に示した全体制御部１１０の仕様解析部１０６とオブジェクト指向機能排除部１０７の部分での処理を示したものである。これは、仕様解析部１０６でオブジェクト名，メソッド名が得られた際に、機能選択項目記述部１１３を起動させて、得られたオブジェクト名，メソッド名に対応付けて機能選択項目を入力するものである。このようにすれば、機能選択項目の入力パターンにオペレータが入力する必要が無くなる。従って、オペレータには、図１３に示すような機能選択項目を表示すればよい。
【００５４】
　図１３に示した機能選択項目は、機能の欄と設定の欄から構成され、機能の欄にはオブジェクト指向の機能の一覧を表示し、オペレータは設定の欄で選択的に機能の使用／不使用を選べばよい。そして、機能選択記述部１１３はオペレータの入力により、図１４に示すテーブルを生成し、記憶装置１０４に格納する。尚、各機能毎に“使用”に対するコード生成パターン、“不使用”に対するコード生成パターンは、予め記憶装置１０４に格納しておく。
【００５５】
　そしてオブジェクト指向機能排除部１０７では、生成されたテーブルを参照し、該当するコード生成パターンを読み出して、コード生成部１０８に出力することにより、コード生成を行う。
【００５６】
　更に他の選択項目の指定を行う場合について説明する。
【００５７】
　図１５は、図１で示した入力画面制御部１０９の構成を示したものであり、最適化情報抽出部１５０１，解析結果表示部１５０２が新たな構成要素となっている。
【００５８】
　図１６は、図１５に示した構成における使用解析部１０６とオブジェクト指向機能排除部１０７の間の全体制御部１１０の動作を示したものである。この図に示すように仕様解析部１０６で得られた情報から、機能指定に有用な情報を最適化情報抽出部１５０１で抽出し、解析結果表示部１５０２でオペレータに機能指定に有用な情報を表示し、オペレータはその情報をもとに使用する機能を機能選択項目記述部１１３により指定する。最適化情報抽出部１５０１では、例えば使用解析部１０６で解析した結果から得られるインスタンスの数を計数したり、仮想関数の使用の有無を最適化情報として抽出する。この最適化情報を解析結果表示部１５０２により、表示装置１０２に表示する。
【００５９】
　図１７（ａ）に解析結果表示部１５０２による表示例を示す。このように最適化情報抽出部１５０１により得られたインスタンスの数，仮想関数等の最適化情報を表示する。
【００６０】
　この情報を表示した後に、機能選択項目記述部１１３では図１７（ｂ）に示す機能選択項目を表示し、オペレータが機能の“使用”，“不使用”を入力する。
【００６１】
　このようにオペレータに仕様解析部１０６で解析した結果を利用することで、ユーザが項目を設定する際により有効な設定を行うことができる。例えば、インスタンスの動的生成の使用／不使用はプログラムの中で利用されるインスタンスの数が大きな判断基準であり、オペレータにとって有効な設定を行うことができる。
【００６２】
　尚、本実施例はプログラミング言語が特に限られるわけではなくＣ++やJava(登録商標)で記述したものについても同様に行うことができる。
【図面の簡単な説明】
【００６３】
【図１】コード生成装置の全体構成を示した図である。
【図２】処理装置の全体制御部の動作を示した図である。
【図３】モデル図の入力例を示した図である。
【図４】動作図の入力例を示した図である。
【図５】機能選択項目の表示例を示した図である。
【図６】仕様解析部の動作を示した図である。
【図７】オブジェクト指向機能排除部の動作を示した図である。
【図８】コード生成部の動作を示した図である。
【図９】コードの生成結果を示した図である。
【図１０】実行コードの生成結果を示した図である。
【図１１】仮想関数を実行した場合のメモリ配置を示した図である。
【図１２】全体制御部の動作を示した図である。
【図１３】機能選択項目の表示例を示した図である。
【図１４】機能選択項目のテーブルを示した図である。
【図１５】入力画面制御部の構成を示した図である。
【図１６】全体制御部の動作を示した図である。
【図１７】表示例を示した図である。
【符号の説明】
【００６４】
　１０１…入力装置、１０２…表示装置、１０３…書込／読出装置、１０４…記憶装置、１０５…処理装置、１０６…仕様解析部、１０７…オブジェクト指向機能排除部、１０８…コード生成部、１０９…入力画面制御部、１１０…全体制御部、１１１…クラスインターフェイス記述部、１１２…処理詳細記述部、１１３…機能選択項目記述部。
【図１】
2004118865.tif 000003
【図２】
2004118865.tif 000004
【図３】
2004118865.tif 000005
【図４】
2004118865.tif 000006
【図５】
2004118865.tif 000007
【図６】
2004118865.tif 000008
【図７】
2004118865.tif 000009
【図８】
2004118865.tif 000010
【図９】
2004118865.tif 000011
【図１０】
2004118865.tif 000012
【図１１】
2004118865.tif 000013
【図１２】
2004118865.tif 000014
【図１３】
2004118865.tif 000015
【図１４】
2004118865.tif 000016
【図１５】
2004118865.tif 000017
【図１６】
2004118865.tif 000018
【図１７】
2004118865.tif 000019