(57)【要約】  正規表現から構文木を経由して、ε遷移を含まないＮＦＡへの変換処理を高速化する。入力装置１から文字、又は選択、０回以上マッチを示す２種類のメタキャラクタ（‘｜’、‘＊’）のみで記述された正規表現から生成し、連結を示す記号‘・’と空を示す記号‘Φ’をノードに用いた構文木を受け取り、構文木記憶部３１へ記憶させると共に生成するＮＦＡの初期設定を行い、設定処理が完了すれば、ＮＦＡをＮＦＡ記憶部３２へ記憶させ、構文木記憶部３１から読み出した構文木データをＮＦＡ変換手段２２へ送出する初期設定手段２１と、初期設定手段２１から受け取った構文木データと、ＮＦＡ記憶部３２からＮＦＡを読み込み、構文木の各ノードに対して５つの変換パターンを適用し、ε遷移を含まないＮＦＡへ直接変換し、変換が完了すれば、ＮＦＡ記憶部３２へ生成したＮＦＡを記憶し、出力装置４へ出力するＮＦＡ変換手段２２と、を備えている（図１）。
2009017131.tif 000002
【特許請求の範囲】
【請求項１】
ε遷移を含まない非決定性有限オートマトンを、構文木で表現された正規表現に基づいて直接生成するＮＦＡ変換手段を備えた、ことを特徴とするε遷移を含まない非決定性有限オートマトン生成システム。
【請求項２】
構文木で表現された正規表現を、構文木で表現された正規表現の各ノードの種別に応じて、ε遷移を含まない非決定性有限オートマトンに変換するＮＦＡ変換手段を備え、
前記非決定性有限オートマトンは、そのデータ構造が、
遷移元の状態と、
遷移先の状態と、
遷移条件とを含む、
ことを特徴とするε遷移を含まない非決定性有限オートマトン生成システム。
【請求項３】
正規表現を、文字と、予め定められたメタキャラクタと記号を用いた構文木として記憶する構文木記憶手段と、
前記構文木記憶手段に記憶された構文木の根ノードの種別に応じて、非決定性有限オートマトンの初期設定を行う初期設定手段と、
前記構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへ変換を行うＮＦＡ変換手段と、
前記ＮＦＡ変換手段による変換途中、及び、変換後の非決定性有限オートマトンを記憶するＮＦＡ記憶手段と、
を備えたことを特徴とするε遷移を含まない非決定性有限オートマトン生成システム。
【請求項４】
正規表現を、文字と、予め定められたメタキャラクタと記号を用いた構文木へ変換し、
前記変換した構文木を前記構文木記憶手段に記憶する構文木変換手段を備えた、
ことを特徴とする請求項３記載のε遷移を含まない非決定性有限オートマトン生成システム。
【請求項５】
前記ＮＦＡ変換手段は、前記構文木記憶手段に記憶された前記構文木と、前記ＮＦＡ記憶手段に記憶された非決定性有限オートマトンとを参照し、
前記構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへの変換パターンを適用することにより、ε遷移を含まない非決定性有限オートマトンへ変換し、
生成した非決定性有限オートマトンを前記ＮＦＡ記憶手段に記憶するとともに、出力装置から出力する、
ことを特徴とする請求項３又は４に記載のε遷移を含まない非決定性有限オートマトン生成システム。
【請求項６】
前記構文木で表現された正規表現は、
文字、
選択を示すメタキャラクタ、
０回以上マッチを示すメタキャラクタ、
連結を示す記号、
空を示す記号、
のうちいずれか一部又は全てを用いて記述されている、ことを特徴とする請求項１乃至５のいずれか１項に記載のε遷移を含まない非決定性有限オートマトン生成システム。
【請求項７】
前記構文木で表現された正規表現は、
文字、
選択を示すメタキャラクタ、
０回、又は１回のみマッチを示すメタキャラクタ、
１回以上マッチを示すメタキャラクタ、
０回以上マッチを示すメタキャラクタ、
連結を示す記号、
のうちいずれか一部又は全てを用いて記述されている、ことを特徴とする請求項１乃至５のいずれか１項に記載のε遷移を含まない非決定性有限オートマトン生成システム。
【請求項８】
ε遷移を含まない非決定性有限オートマトンを、構文木で表現された正規表現に基づいて直接生成する、ことを特徴とするε遷移を含まない非決定性有限オートマトン生成方法。
【請求項９】
構文木で表現された正規表現を、構文木で表現された正規表現の各ノードの種別に応じて、ε遷移を含まない非決定性有限オートマトンに変換し、
前記非決定性有限オートマトンは、そのデータ構造が、
遷移元の状態と、
遷移先の状態と、
遷移条件とを有する、
ことを特徴とするε遷移を含まない非決定性有限オートマトン生成方法。
【請求項１０】
正規表現を、文字と、予め定められたメタキャラクタと記号を用いた構文木として記憶媒体に記憶しておき、
前記記憶媒体に記憶されている構文木の根ノードの種別に応じて、非決定性有限オートマトンの初期設定を行い、
前記構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへ直接変換を行い、
変換途中、及び変換後の非決定性有限オートマトンを記憶媒体に記憶する、
ことを特徴とするε遷移を含まない非決定性有限オートマトン生成方法。
【請求項１１】
正規表現を、文字と、予め定められたメタキャラクタと記号を用いた構文木へ変換し、
変換した前記構文木を記憶媒体に記憶し、
前記記憶されている構文木の根ノードの種別に応じて、非決定性有限オートマトンの初期設定を行い、
構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへ直接変換を行い、
変換途中、及び変換後の非決定性有限オートマトンを記憶媒体に記憶する、
ことを特徴とするε遷移を含まない非決定性有限オートマトン生成方法。
【請求項１２】
前記記憶媒体に記憶された前記構文木と非決定性有限オートマトンとを参照し、
前記構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへの変換パターンを適用することにより、ε遷移を含まない非決定性有限オートマトンへ変換し、
生成した非決定性有限オートマトンを前記記憶媒体に記憶するとともに、出力装置から出力する、
ことを特徴とする請求項１０又は１１に記載のε遷移を含まない非決定性有限オートマトン生成方法。
【請求項１３】
構文木で表現された前記正規表現は、
文字、
選択を示すメタキャラクタ、
０回以上マッチを示すメタキャラクタ、
連結を示す記号、
空を示す記号、
のうちいずれか一部又は全てを用いて記述されている、ことを特徴とする請求項８乃至１２のいずれか１項に記載のε遷移を含まない非決定性有限オートマトン生成方法。
【請求項１４】
前記構文木で表現された正規表現は、
文字、
選択を示すメタキャラクタ、
０回、又は１回のみマッチを示すメタキャラクタ、
１回以上マッチを示すメタキャラクタ、
０回以上マッチを示すメタキャラクタ、
連結を示す記号、
のうちいずれか一部又は全てを用いて記述されている、ことを特徴とする請求項８乃至１２のいずれか１項に記載のε遷移を含まない非決定性有限オートマトン生成方法。
【請求項１５】
ε遷移を含まない非決定性有限オートマトンを、構文木で表記された正規表現に基づいて直接生成する処理を、コンピュータに実行させるプログラム。
【請求項１６】
構文木で表現された正規表現を、構文木で表現された正規表現の各ノードの種別に応じて、ε遷移を含まない非決定性有限オートマトンに変換する処理をコンピュータに実行させ、
変換した非決定性有限オートマトンは、そのデータ構造が、
遷移元の状態と、
遷移先の状態と、
遷移条件とを有する、
ことを特徴とするプログラム。
【請求項１７】
正規表現を、文字と、予め定められたメタキャラクタと記号を用いた構文木として記憶媒体に記憶しておく処理と、
前記記憶媒体に記憶されている構文木の根ノードの種別に応じて、非決定性有限オートマトンの初期設定を行う処理と、
前記構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへ直接変換する処理と、
その変換途中、及び変換後の非決定性有限オートマトンを記憶媒体に記憶する処理と、
をコンピュータに実行させるプログラム。
【請求項１８】
正規表現を、文字と、予め定められたメタキャラクタと記号を用いた構文木へ変換し、
前記変換した構文木を記憶媒体に記憶する処理と、
前記記憶されている構文木の根ノードの種別に応じて、非決定性有限オートマトンの初期設定を行う処理と、
構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへ直接変換を行う処理と、
その変換途中、及び変換後の非決定性有限オートマトンを記憶媒体に記憶する処理と、
をコンピュータに実行させるプログラム。
【請求項１９】
前記記憶媒体に記憶された前記構文木と非決定性有限オートマトンとを参照し、
前記構文木の各ノードに対して、ε遷移を含まない非決定性有限オートマトンへの変換パターンを適用して、ε遷移を含まない非決定性有限オートマトンへ変換し、
生成した非決定性有限オートマトンを記憶媒体に記憶するとともに出力する処理を、
コンピュータに実行させることを特徴とする請求項１７又は１８に記載のプログラム。
【請求項２０】
構文木で表現された前記正規表現は、
文字、
選択を示すメタキャラクタ、
０回以上マッチを示すメタキャラクタ、
連結を示す記号、
空を示す記号、
のうちいずれか一部又は全てを用いて記述される、ことを特徴とする請求項１５乃至１９のいずれか１項に記載のプログラム。
【請求項２１】
前記構文木で表現された正規表現は、
文字、
選択を示すメタキャラクタ、
０回、又は１回のみマッチを示すメタキャラクタ、
１回以上マッチを示すメタキャラクタ、
０回以上マッチを示すメタキャラクタ、
連結を示す記号、
のうちいずれか一部又は全てを用いて記述されている、ことを特徴とする請求項１５乃至１９のいずれか１項に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願についての記載）
本願は、先の日本特許出願２００７−２０１５１０号（２００７年８月２日出願）の優先権を主張するものであり、前記先の出願の全記載内容は、本書に引用をもって繰込み記載されているものとみなされる。
本発明は、ε遷移を含まない非決定性有限オートマトン生成システム、ε遷移を含まない非決定性有限オートマトン生成方法、およびε遷移を含まない非決定性有限オートマトン生成プログラムを記録した記録媒体に関し、特に、ε遷移の除去を行わず直接生成できるε遷移を含まない非決定性有限オートマトン生成システム、ε遷移を含まない非決定性有限オートマトン生成方法、およびε遷移を含まない非決定性有限オートマトン生成プログラムに関する。
【背景技術】
【０００２】
近年、文字列照合（パターンマッチ）を高速に行うため、例えば非特許文献１に示されるように、非決定性有限オートマトン（ＮＦＡ：Ｎｏｎ−ｄｅｔｅｒｍｉｎｉｓｔｉｃ  Ｆｉｎｉｔｅ  Ａｕｔｏｍａｔｏｎ）を直接ハードウェア回路として回路化し、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）のような再構成可能なデバイス上に落とし込む手法が提案されている。【０００３】
このようなハードウェアを用いたパターンマッチは、正規表現を用いて記述された検索対象パターンを表すＮＦＡを生成し、それを直接回路化することで、並列動作の特性を活かした高速な処理が可能である。【０００４】
一方で、例えば非特許文献１に示されるＮＦＡ回路は、１クロックサイクルあたり１文字（１  ｂｙｔｅ）しか処理することができないため、検索スループットは動作周波数に依存する（検索スループットＴ［Ｍｂｐｓ］は、動作周波数Ｍ［ＭＨｚ］と１クロックサイクルあたりの処理バイト数Ｋ［ｂｙｔｅ］を用いて、Ｔ＝８×Ｋ×Ｍで算出できる）。【０００５】
そこで、例えば非特許文献２、非特許文献３、特許文献１に示されるように、状態遷移の条件を複数文字（複数バイト）に拡張したＮＦＡを生成し、これを回路化することで、１クロックサイクルあたりに処理できる文字数（バイト数）を増加させ、検索スループットの向上を行う手法も提案されている。【０００６】
一般に、正規表現からＮＦＡの変換では、
・正規表現から構文木（Ｓｙｎｔａｘ  Ｔｒｅｅ）への変換、
・構文木からＮＦＡへの変換
の２つの処理に分けることができる（例えば非特許文献４の第３２７頁参照）。【０００７】
構文木からＮＦＡへの変換では、４つの基本変換パターンを、構文木の各ノードに対して、再帰的に適用することで、変換が可能である。但し、構文木において連結（ｃｏｎｃａｔｅｎａｔｉｏｎ）を示すノードを‘・’とする。【０００８】
これら４つの基本変換パターンを、図２７、図２８、図２９、図３０に示す。【０００９】
図２７は、構文木のノードが文字ｃである場合に適用される基本変換パターンである。【００１０】
図２８は、構文木のノードが‘｜’（ＯＲを意味するメタキャラクタ）の場合に適用される基本変換パターンである。【００１１】
図２９は、構文木のノードが‘・’（連結）の場合に適用される基本変換パターンである。【００１２】
図３０は、構文木のノードが‘＊’（０回以上マッチを意味するメタキャラクタ）の場合に適用される基本変換パターンである。【００１３】
図２７乃至図３０において、
Ｎ１、Ｎ２は正規表現、
状態Ｉは開始状態、
状態Ｆは終了状態、
εはε遷移（ε−ｔｒａｎｓｉｔｉｏｎ：イプシロン遷移）
を意味する。【００１４】
ε遷移は、入力を待たずに次の状態へ遷移することができる特殊な遷移である。【００１５】
図２７から図３０の４つの基本変換パターンを適用して生成されるＮＦＡにも、ε遷移が存在することになる。以下、ε遷移を含むＮＦＡを「ε−ＮＦＡ」と呼び、ε遷移を持たないＮＦＡと区別する。【００１６】
通常、上記のメタキャラクタ以外をもつ正規表現は、これらの４つの基本変換パターンを用いた正規表現に書き直すことができるため、構文木を生成する前の段階で、書き直しておく必要がある。【００１７】
例えば、
“Ｎ１？”（０回か１回のみマッチする）は、“（Ｎ１｜）”
に書き直すことができる。また、
“Ｎ１＋”（１回以上マッチする）は、“Ｎ１Ｎ１＊”
に書き直すことができる。【００１８】
上述したようなハードウェアによるパターンマッチ回路では、ＮＦＡの各状態が、フリップフロップを用いて実現され、動作クロックが処理のトリガとなるため、入力を待たずに遷移が可能なε遷移は、実現することができない。つまり、ハードウェアへ埋め込むＮＦＡを生成する際には、
・正規表現から構文木へ変換し、
・該構文木から変換したε−ＮＦＡに対してε遷移を除去する、
必要がある。【００１９】
このε遷移を除去する処理は、ε閉包（ε−ｃｌｏｓｕｒｅ）と呼ばれる。例えば状態ｑのε閉包は、ｑからε遷移のみを伝って到達できる状態全体の集合を意味する。【００２０】
正規表現の長さ（文字数）をｎとすると、構文木からε−ＮＦＡへの変換には、Ｏ（ｎ）の処理が必要である。また、状態数ｎのε−ＮＦＡのε閉包を行うには、Ｏ（ｎ３）の処理が必要である、ことが知られている（非特許文献５）。【００２１】
【特許文献１】特開２００７−１４２７６７号公報
【非特許文献１】リーティンダー・シドフ（Ｒｅｅｔｉｎｄｅｒ  Ｓｉｄｈｕ）、ビクトル・ケー・プラサナ（Ｖｉｋｔｏｒ  Ｋ．  Ｐｒａｓａｎｎａ）、プロシーディング・オブ・ザ・ナインス・アニュアル・アイ・イー・イー・イー・シンポジウム・オン・フィールドプログラマブル・カスタム・コンピューティング・マシーンズ（Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ９ｔｈ  Ａｎｎｕａｌ  ＩＥＥＥ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｃｕｓｔｏｍ  Ｃｏｍｐｕｔｉｎｇ  Ｍａｃｈｉｎｅｓ）、２００１年、２２７〜２３８頁
【非特許文献２】クリストファー・アール・クラーク（Ｃｈｒｉｓｔｏｐｈｅｒ  Ｒ．  Ｃｌａｒｋ）、デービッド・イー・シメール（Ｄａｖｉｄ  Ｅ．  Ｓｃｈｉｍｍｅｌ）、  プロシーディング・オブ・ザ・トゥエルフス・アニュアル・アイ・イー・イー・イー・シンポジウム・オン・フィールドプログラマブル・カスタム・コンピューティング・マシーンズ（Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  １２ｔｈ  Ａｎｎｕａｌ  ＩＥＥＥ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｃｕｓｔｏｍ  Ｃｏｍｐｕｔｉｎｇ  Ｍａｃｈｉｎｅｓ）、２００４年、２４９〜２５７頁
【非特許文献３】山垣  則夫、市野  清久、神谷  聡史、２００７年電子情報通信学会総合大会講演論文集（Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ２００７  ＩＥＩＣＥ  Ｇｅｎｅｒａｌ  Ｃｏｎｆｅｒｅｎｃｅ）、２００７年、Ｄ−１８−２（１８８頁）
【非特許文献４】近藤  嘉雪、「定本Ｃプログラマのためのアルゴリズムとデータ構造」、ソフトバンクパブリッシング、１９９８年、  ２９７〜３３０頁
【非特許文献５】訳者  野崎  昭弘、高橋  正子、町田  元、山崎  秀記、ジョン・イー・ホップクロフト（Ｊｏｈｎ  Ｅ．  Ｈｏｐｃｒｏｆｔ）、ラジーブ・モトワニ（Ｒａｊｅｅｖ  Ｍｏｔｏｗａｎｉ）、ジェフリー・ディー・ウルマン（Ｊｅｆｆｒｅｙ  Ｄ．  Ｕｌｌｍａｎ）、Ｉｎｆｏｒｍａｔｉｏｎ  ＆  ｃｏｍｐｕｔｉｎｇ−３  オートマトン  言語理論  計算論Ｉ  ［第２版］、サイエンス社、２００３年、８０〜９０、１１１〜１１６、１６８〜１７１頁
【発明の開示】
【発明が解決しようとする課題】
【００２２】
上記特許文献１、非特許文献１〜５の全開示内容は、その引用をもって本書に繰込み記載する。以下は、本発明者による分析による。【００２３】
ハードウェアに直接組み込んでパターンマッチングを行う際の、正規表現から生成した構文木からε遷移のないＮＦＡへの変換方法には、以下のような問題点がある。なお、“ε遷移のない”とは、ε遷移に係る一般的な処理を含まないことを表しており、本願においては、以下の説明において、“ε遷移を含まない”と表現する。【００２４】
第１の問題点は、正規表現からε遷移を含まないＮＦＡへの変換に時間を要する、ということである。従来の手法を用いて、
・ 構文木からε−ＮＦＡを生成し、
・ ε−ＮＦＡのε閉包の計算を行う
ことで、ハードウェアへ組み込むためのε遷移を含まないＮＦＡを生成する場合、正規表現の数（検索対象となるパターン数）が多ければ多いほど、ＮＦＡの生成処理に時間がかかる。その理由は、正規表現の長さ（文字数）をｎとしたとき、従来の手法では、ε−ＮＦＡのε閉包の計算にＯ（ｎ３）の処理量が必要であるためである。【００２５】
第２の問題点は、変換対象の正規表現をＮＦＡに変換する際には、変換対象の正規表現を、文字、‘｜’（ＯＲ）、‘＊’（０回以上マッチ）のメタキャラクタのみを含む正規表現に予め書き直してから、連結を意味する記号‘・’と空を意味する記号‘Φ’をノードに加えた構文木に変換する必要がある、ということである。なお、Ｎは任意の正規表現とする。また、空を意味する記号とは、正規表現“Ｎ？”をメタキャラクタ‘｜’を用いた正規表現に書き換えた場合に、“（Ｎ｜Φ）”（Ｎまたは空）として用いるものとする。【００２６】
その理由は、構文木の各ノードに対して、再帰的に適用するε−ＮＦＡの基本変換パターンは、図２７乃至図３０に示した４つであるため、正規表現を、これら４つの基本変換パターンを当てはめることができる形式に変換する必要があるからである。【００２７】
また、第２の問題点として挙げたメタキャラクタのうち、正規表現“Ｎ＋”を、“ＮＮ＊”に予め書き直して構文木に変換し、さらに構文木をＮＦＡに変換した場合、正規表現Ｎを示すＮＦＡが２回現れることになる。このため、正規表現Ｎを表すＮＦＡが冗長であり、状態数が増加してしまう。これが第３の問題点である。【００２８】
したがって、本発明の目的は、正規表現からε遷移を含まないＮＦＡへの変換を高速に行うためのＮＦＡ生成システム、生成方法、および生成プログラムを提供することにある。【００２９】
本発明の他の目的は、予め書き換えが必要なメタキャラクタのうち、‘？’（０回、又は１回のみマッチ）と‘＋’（１回以上マッチ）を含む正規表現の構文木への変換の際に、メタキャラクタの書き換えを不要とするＮＦＡ生成システム、生成方法、および生成プログラムを提供することにある。【００３０】
本発明のさらに他の目的は、メタキャラクタ‘＋’（１回以上マッチ）を用いた正規表現に対し、冗長な状態数を増加させることのないＮＦＡ生成システム、生成方法、および生成プログラムを提供することにある。
【課題を解決するための手段】
【００３１】
本発明に係る、ε遷移を含まないＮＦＡ生成システムにおいては、構文木で表現された正規表現から、ε遷移を含まないＮＦＡを、直接生成する。【００３２】
本発明においては、文字、又は、選択、０回以上マッチを示す２種類のメタキャラクタ（‘｜’、‘＊’）、のみで記述された正規表現から生成し、連結を示す記号‘・’と空を示す記号‘Φ’を加えたノードをもつ構文木の構成を示すデータ構造を記憶しておく構文木記憶部と、
構文木の根ノードの種別を判別することで生成するε遷移を含まないＮＦＡの初期設定を行う初期設定手段と、
ＮＦＡの構成を示すデータ構造を記憶するＮＦＡ記憶部と、
前記構文木の各ノードに対する変換処理（各ノードに対してε遷移を含まないＮＦＡへの変換パターンを適用する処理）を行うことで、ε遷移を含まないＮＦＡを生成するＮＦＡ変換手段と、を有する。【００３３】
このような構成を採用し、入力された構文木の各ノードに応じて、文字、又はメタキャラクタ（‘｜’、‘＊’）、連結を示す記号‘・’、空を表す記号‘Φ’に対する変換処理を行うことで、本発明の第１の目的を達成することができる。【００３４】
また、本発明においては、文字、又は、選択、０回又は１回のみマッチ、１回以上マッチ、０回以上マッチをそれぞれ示す４種類のメタキャラクタ（‘｜’、‘？’、‘＋’、‘＊’）のみで記述された正規表現から生成し、連結を示す記号‘・’をノードに加えた構文木の構成を示すデータ構造を記憶しておく構文木記憶部と、
構文木の根ノードの種別を判別することで生成するε遷移を含まないＮＦＡの初期設定を行う初期設定手段と、
ＮＦＡの構成を示すデータ構造を記憶するＮＦＡ記憶部と、
上記構文木の各ノードに対する変換処理を行うことで、ε遷移を含まないＮＦＡを生成するＮＦＡ変換手段と、
を有する。このような構成を採用し、入力された構文木の各ノードに応じて、文字、又は、選択、０回又は１回のみマッチ、１回以上マッチ、０回以上マッチをそれぞれ示す４種のメタキャラクタ（‘｜’、‘？’、‘＋’‘＊’）、連結を示す記号‘・’に対する変換処理（各ノードに対してε遷移を含まないＮＦＡへの変換パターンを適用する処理）を行うことで、前記各目的を達成することができる。
【発明の効果】
【００３５】
本発明によれば、正規表現からε遷移を含まないＮＦＡへの変換を高速に行うことができる。【００３６】
本発明によれば、正規表現からＮＦＡへの変換に際し、正規表現における‘？’（０回、又は１回のみマッチ）と‘＋’（１回以上マッチ）のメタキャラクタの書き換えを不要としている。【００３７】
本発明によれば、正規表現におけるメタキャラクタ‘＋’（１回以上マッチ）を用いた正規表現を表すＮＦＡにおいて、冗長な状態数の増加を抑止することができる。
【図面の簡単な説明】
【００３８】
【図１】本発明の第１の実施の形態の構成を示すブロック図である。
【図２】本発明の第１の実施の形態の動作を示す流れ図である。
【図３】正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”から変換した構文木の例を示す図である。
【図４】ＮＦＡのデータ構造の例を示す図である。
【図５】図２におけるステップＡ４を示す流れ図である。
【図６】図５におけるステップＢ３を示す流れ図である。
【図７】図５におけるステップＢ５を示す流れ図である。
【図８】図５におけるステップＢ５により生成される“Ｎ１Ｎ２”に対するＮＦＡの変換パターンを表す図（Ｎ１、Ｎ２は正規表現）である。
【図９】図５におけるステップＢ７を示す流れ図である。
【図１０】図５におけるステップＢ７により生成される“（Ｎ１｜Ｎ２）”に対するＮＦＡの変換パターンを表す図（Ｎ１、Ｎ２は正規表現）である。
【図１１】図５におけるステップＢ９を示す流れ図である。
【図１２】図５におけるステップＢ９により生成される“Ｎ１＊”に対するＮＦＡの変換パターンを表す図（Ｎ１は正規表現）である。
【図１３】図５におけるステップＢ１１を示す流れ図である。
【図１４】図５におけるステップＢ１１により生成される“（Ｎ１｜Φ）”に対するＮＦＡの変換パターンを表す図（Ｎ１は正規表現、Φは空を示す）である。
【図１５】本実施の形態により生成される正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”に対するε遷移を含まないＮＦＡを表す図である。
【図１６】本発明の第２の実施の形態の構成を示すブロック図である。
【図１７】本発明の第２の実施の形態の動作を示す流れ図である。
【図１８】正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”から変換した構文木の例を示す図である。
【図１９】図１７におけるステップＡ６を示す流れ図である。
【図２０】図１９におけるステップＢ１４を示す流れ図である。
【図２１】図１９におけるステップＢ１６を示す流れ図である。
【図２２】図１９におけるステップＢ１６により生成される“Ｎ１＋”に対するＮＦＡの変換パターンを表す図（Ｎ１は正規表現）である。
【図２３】本実施の形態により生成される正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”に対するε遷移を含まないＮＦＡを表す図である。
【図２４】本発明の第３の実施の形態の構成を示すブロック図である。
【図２５】本発明の第３の実施の形態の動作を示す流れ図である。
【図２６】本発明の第４の実施の形態の構成を示すブロック図である。
【図２７】文字ｃに対するε−ＮＦＡの変換パターンを表す図である。
【図２８】正規表現“（Ｎ１｜Ｎ２）”に対するε−ＮＦＡの変換パターンを表す図（Ｎ１、Ｎ２は正規表現）である。
【図２９】正規表現“Ｎ１Ｎ２”に対するε−ＮＦＡの変換パターンを表す図（Ｎ１、Ｎ２は正規表現）である。
【図３０】正規表現“Ｎ１＊”に対するε−ＮＦＡの変換パターンを表す図（Ｎ１は正規表現）である。
【符号の説明】
【００３９】
１  入力装置
２  データ処理装置
３  記憶装置
４  出力装置
５  データ処理装置
６  データ処理装置
７  データ処理装置
８  ＮＦＡ変換プログラム
２１  初期設定手段
２２  ＮＦＡ変換手段
２３  初期設定手段
２４  ＮＦＡ変換手段
２５  構文木変換手段
３１  構文木記憶部
３２  ＮＦＡ記憶部
【発明を実施するための最良の形態】
【００４０】
次に、本発明の実施の形態について図面を参照して詳細に説明する。【００４１】
＜実施の形態１＞
図１は、本発明の第１の実施の形態の構成を示すブロック図である。図１を参照すると、本発明の第１の実施の形態は、キーボード等の入力装置１と、プログラム制御により動作するデータ処理装置２と、情報を記憶する記憶装置３と、ディスプレイ装置や印刷装置等の出力装置４とを含む。【００４２】
記憶装置３は、読み書き可能なメモリまたはハードディスク装置等の記憶デバイス（記憶媒体）によって構成され、記憶する対象別に構文木記憶部３１と、ＮＦＡ記憶部３２とを備えている。【００４３】
構文木記憶部３１は、入力装置１から初期設定手段２１に入力された正規表現の構文木を、リスト構造を持つデータ構造によって記憶する。【００４４】
ＮＦＡ記憶部３２は、初期設定手段２１、及びＮＦＡ変換手段２２において、構文木記憶部３１に記憶された変換対象の構文木から変換されたＮＦＡを、リスト構造や行列形式等のデータ構造で記憶する。【００４５】
データ処理装置２は、初期設定手段２１と、ＮＦＡ変換手段２２とを備えている。ここで、手段とはそれぞれの処理機能を指す。【００４６】
初期設定手段２１は、入力装置１から入力された構文木の形式に変換された正規表現を読み込み、構文木記憶部３１へ記憶させる。また、初期設定手段２１は、生成するＮＦＡの初期設定を、根ノードの種別（文字であるか、特定のメタキャラクタであるか、又は、連結を示す記号‘・’であるか）に応じて行い、初期設定を行ったＮＦＡのデータ構造をＮＦＡ記憶部３２へ記憶させる。【００４７】
ＮＦＡ変換手段２２は、初期設定手段２１から構文木を示すデータ構造を受け取る。また、ＮＦＡ変換手段２２は、ＮＦＡ記憶部３２からＮＦＡを示すデータ構造を読み込み、初期設定手段２１から受け取った構文木の各ノードに対して、ε遷移を含まないＮＦＡへの変換パターンを適用し、ε遷移を含まないＮＦＡへ変換する。ここで、本実施形態においても、“ε遷移を含まない”とは、ε遷移に係る一般的な処理を含まないことを意味する。【００４８】
変換が終了すると、ＮＦＡ変換手段２２は、変換したＮＦＡを示すデータ構造を、ＮＦＡ記憶部３２へ記憶させると共に、出力装置４へ出力する。【００４９】
次に、図１、及び図２の流れ図を参照して、本発明の第１の実施の形態の動作について詳細に説明する。【００５０】
入力装置１から構文木の形式で表現された正規表現は、初期設定手段２１に供給される。【００５１】
入力された構文木は、２種類のメタキャラクタ
‘｜’（ＯＲ：選択）、
‘＊’（０回以上マッチ）
のみを使った正規表現に予め書き換えられ、構文木に変換されているものとする。但し、この構文木では、連結（ｃｏｎｃａｔｅｎａｔｉｏｎ）を表す‘・’のノード、空を表す記号‘Φ’のノードが加えられているものとする。【００５２】
また、構文木のデータ構造は、
・各ノードの種類（文字なのか、上記の２種類のどちらのメタキャラクタなのか、連結を示す記号‘・’なのか、又は空を示す記号‘Φ’なのか）、
・左の子ノードへのリスト、
・右の子ノードへのリスト（子ノードが１つの場合は、左右どちらかの子ノードに統一して管理する）をもつ。この構文木は、公知のデータ構造が用いられるため、詳細は省略する。【００５３】
図３に、対象の正規表現を、
“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”
とした場合の構文木の概要を示す。この場合、上記の正規表現は、メタキャラクタ‘｜’、‘＊’のみを使った正規表現
“ａｂ＊（ｃ｜ｄ）（ｅ｜）ｆ（ｇｈ）（ｇｈ）＊ｉ”
に書き換えられた後、連結を示す記号‘・’と空を示す記号‘Φ’を使って図３に示す構文木に変換される。【００５４】
初期設定手段２１は、構文木データを受け取ると、構文木を示すデータ構造を、構文木記憶部３１へ記憶させると共に、状態０と１を生成し、状態０をＮＦＡの初期状態、状態１をＮＦＡの終了状態とする（ステップＡ１）。【００５５】
また、初期設定手段２１は、入力された構文木の根ノードを処理ノード、初期状態Ｉを状態０、終了状態Ｆを状態１とする（ステップＡ１）。【００５６】
根ノードが文字、メタキャラクタ‘｜’、連結を示す記号‘・’のいずれかに当てはまるかをチェックする（ステップＡ２）。【００５７】
根ノードがそれらのいずれにも当てはまらない場合には、状態１を変換後のＮＦＡの初期状態でもあると設定する（ステップＡ３）。この場合、状態１は、変換後のＮＦＡの初期状態かつ終了状態となる。【００５８】
初期設定手段２１は、上記の処理（ステップＡ１、ステップＡ２、ステップＡ３）が終了すると、生成したＮＦＡを、ＮＦＡ記憶部３２へ記憶させる。そして、初期設定手段２１は、処理終了の信号と共に、構文木記憶部３１から構文木データを読み込んで、ＮＦＡ変換手段２２へと送信する。【００５９】
ここで、初期設定手段２１がＮＦＡ記憶部３２へ記憶させるＮＦＡは、
・遷移元の状態番号（状態ＩＤ）、
・遷移先の状態番号（状態ＩＤ）、
・遷移条件となる文字
をもつ。すなわち、ある状態に着目すると、その状態へ遷移してくる遷移元の状態が得られるようなデータ構造を有する。【００６０】
ＮＦＡは、例えば図４に示すように、２次元配列とリンクが張られた構造体（Ｌｉｎｋｅｄ  Ｌｉｓｔ）を用いたデータ構造で実現される。２次元配列ＮＦＡ［ｉ］［ｊ］（ｉ，ｊ＝０〜ｎ）では、遷移元状態番号（添え字ｉ）、遷移先状態番号（添え字ｊ）で、任意の２つの状態間における遷移へのポインタが格納される。【００６１】
遷移は、ラベル（遷移条件となる文字）と次の遷移へのポインタ（ｎｅｘｔ）を有する。【００６２】
また、行列形式で表現し、行番号ｉを遷移元の状態番号、列番号ｊを遷移先の状態番号とし、各要素において状態ｉから状態ｊへの遷移条件の文字を表すことで表現することもできる。なお、この場合、ある状態からある状態への複数の条件があれば、‘＋’（例えば、文字‘ａ’と‘ｂ’が遷移条件である場合は“ａ＋ｂ”で表す）で表し、遷移がなければ０で表す等、特定の定義が必要である。【００６３】
続いて、ＮＦＡ変換手段２２は、初期設定手段２１から、処理終了の信号と構文木データを受け取ると、ＮＦＡ記憶部３２から初期化を行ったＮＦＡデータを読み込み、処理ノードである根ノードから、ノードの変換処理を行う（ステップＡ４）。【００６４】
図５は、ステップＡ４のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２２は、最初の処理ノードである根ノードをチェックする（ステップＢ１）。【００６５】
根ノードが、文字である場合、文字に対する処理（ステップＢ２、ステップＢ３）、
連結を示す記号‘・’である場合、‘・’に対する処理（ステップＢ４、ステップＢ５）、
選択（ＯＲ）を示すメタキャラクタ‘｜’である場合、‘｜’に対する処理（ステップＢ６、ステップＢ７）、
０回以上マッチを示すメタキャラクタ‘＊’である場合、‘＊’に対する処理（ステップＢ８、ステップＢ９）、
空を示す記号‘Φ’である場合、‘Φ’に対する処理（ステップＢ１０、ステップＢ１１）
を行う。【００６６】
いずれにも当てはまらない場合には、文法エラーとして、当該正規表現に対するＮＦＡに対するエラー処理を行い（ステップＢ１２）、ステップＡ４の処理を終了する。【００６７】
図６は、図５のステップＢ３のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２２は、現在の処理ノードをチェックし、そのノードが文字ｃである場合、設定されている初期状態Ｉから終了状態Ｆにラベルｃの遷移を生成し（ステップＣ１）、文字ｃに対する処理（ステップＢ３）を終了する。【００６８】
なお、ラベルｃの遷移とは、入力文字がｃである場合、状態Ｉから状態Ｆへ遷移することを意味する。この場合、ステップＢ３により初期状態Ｉ、終了状態Ｆの間に生成されるε遷移を含まないＮＦＡは、図２７と同様であり、これを文字ｃ（ステップＢ３）における変換パターンと定義する。【００６９】
図７は、図５のステップＢ５のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２２は、現在の処理ノードをチェックし、そのノードが連結を示す記号‘・’である場合、新たな状態ｎを生成する（ステップＤ１）。ここで、ｎは状態を特定するＩＤを表し、状態ＩＤの設定には既にある状態ＩＤと重複しない限り特に制限はない。【００７０】
本実施の形態においては、初期設定手段２１にて、ＮＦＡ全体の初期状態０と終了状態１を生成しているため、新たに状態２、状態３、のように連番の状態を生成するものとする。【００７１】
続いて、ステップＢ５を処理する前に設定されている状態Ｉを初期状態Ｉ、ステップＤ１で生成された状態ｎを終了状態Ｆとする（ステップＤ２）。【００７２】
処理ノードが‘・’である場合、必ず左右に子ノードをもつため、まず、当該処理ノードの左の子ノードを新たに処理ノードとして（ステップＤ２）、ノードの変換処理を行う（ステップＡ４）。【００７３】
左の子ノードに対する変換処理が終了すると、ステップＤ１で生成した状態ｎを初期状態Ｉ、当該処理ノードである‘・’ノードの処理に入る前に設定されていた状態Ｆを終了状態Ｆとし、今度は、右の子ノードを新たな処理ノード（ステップＤ３）として、ノード変換処理を行う（ステップＡ４）。【００７４】
右の子ノードの変換処理が終了すれば、‘・’に対する処理（ステップＢ５）を終了する。【００７５】
図８は、初期状態Ｉ、終了状態Ｆ、‘・’ノードに対して適用するε遷移を含まないＮＦＡの変換パターンを示す図である。図８において、Ｎ１は‘・’ノードの左の子ノードを根とする構文木が示す正規表現、Ｎ２は‘・’ノードの右の子ノードを根とする構文木が示す正規表現を意味する。【００７６】
図９は、図５のステップＢ７のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２２は、現在の処理ノードをチェックし、そのノードが、選択（ＯＲ）を示すメタキャラクタ‘｜’である場合、左の子ノードを新たな処理ノードとして（ステップＥ１）、ノード変換処理を行う（ステップＡ４）。【００７７】
なお、処理ノードが‘｜’である場合、必ず、左右に子ノードをもつ。左の子ノードの変換処理が終了すると、今度は右の子ノードを新たな処理ノードとして（ステップＥ２）、ノード変換処理を行う（ステップＡ４）。右の子ノードの変換処理が終了すれば、‘｜’に対する処理（ステップＢ７）（図５参照）を終了する。【００７８】
なお、左右の子ノードに対する変換処理（ステップＡ４）を行う際の初期状態Ｉ、終了状態Ｆは、ステップＢ７（図５参照）に入る前に設定されていた初期状態Ｉ、終了状態Ｆと同じ状態である（ステップＥ１、ステップＥ２）。【００７９】
図１０は、初期状態Ｉ、終了状態Ｆ、‘｜’ノードに対して適用するε遷移を含まないＮＦＡの変換パターンを示す図である。図１０において、Ｎ１、Ｎ２はそれぞれ‘｜’ノードの左の子ノードを根とする構文木が示す正規表現、右の子ノードを根とする構文木が示す正規表現を意味する。【００８０】
図１１は、ステップＢ９のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２２は、現在の処理ノードをチェックし、０回以上マッチを示すメタキャラクタ‘＊’である場合、当該処理ノードの子ノードを新たな処理ノードとして（ステップＦ１）、ノード変換処理を行う（ステップＡ４）。なお、‘＊’のノードの子ノードは必ず１つである。【００８１】
子ノードの変換処理が終了すると、終了状態Ｆに遷移してくる状態ｑに対して、状態ｑから初期状態Ｉへの遷移を生成する（ステップＦ２）。このとき、状態ｑから状態Ｉへの遷移ラベルは、状態ｑから状態Ｆへの遷移と同一のものとする。また、状態ｑは１つであるとは限らず、複数個存在する場合もある。【００８２】
続いて、初期状態Ｉに遷移してくる状態ｐに対して、状態ｐから終了状態Ｆへの遷移を生成する（ステップＦ３）。【００８３】
このとき、状態ｐから状態Ｆへの遷移ラベルは、状態ｐから状態Ｉへの遷移と同一のものとする。また、状態ｐは１つであるとは限らず、複数個存在する場合もあれば、存在しない場合もある。【００８４】
状態ｐから状態Ｆへの遷移を生成した後、初期状態ＩがＮＦＡ全体の初期状態であるかをチェックする（ステップＦ４）。【００８５】
状態ＩがＮＦＡ全体の初期状態である場合、終了状態ＦもＮＦＡ全体の初期状態とし（ステップＦ５）、‘＊’に対する処理（ステップＢ９）を終了する。【００８６】
図１２は、初期状態Ｉ、終了状態Ｆ、‘＊’ノードに対して適用するε遷移を含まないＮＦＡの変換パターンを示す図である。図１２において、Ｎ１は‘＊’ノードの子ノードを根とする構文木が示す正規表現を意味する。状態ｐは、状態Ｉへラベルｃ１での遷移をもつ状態を示す。状態ｑは、状態Ｆへラベルｃ２での遷移をもつ状態を示す。ここでは、状態ｐ、ｑ共に１つである場合を示している。【００８７】
図１３は、ステップＢ１１のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２２は、現在の処理ノードをチェックし、空を示す記号‘Φ’である場合、ステップＢ９でのステップＦ３、ステップＦ４、ステップＦ５と同様、初期状態Ｉに遷移してくる状態ｐに対して、状態ｐから終了状態Ｆへの遷移を生成し（ステップＦ３）、初期状態ＩがＮＦＡ全体の初期状態であるか否かをチェックし（ステップＦ４）、状態ＩがＮＦＡ全体の初期状態である場合、終了状態ＦもＮＦＡ全体の初期状態とし（ステップＦ５）、‘Φ’に対する処理（ステップＢ１１）を終了する。【００８８】
なお、ステップＦ３、ステップＦ４、ステップＦ５については、ステップＢ９と同じ処理であるので、詳細な説明は省略する。【００８９】
なお、空を示す記号‘Φ’は、０回、又は１回だけマッチを意味するメタキャラクタ‘？’を用いた正規表現“Ｎ１？”を書き直した“（Ｎ１｜Φ）”で利用され、‘Φ’に対する処理（ステップＢ１１）により、正規表現“（Ｎ１｜Φ）”、つまり、正規表現“Ｎ１？”は、図１４のようなε遷移を含まないＮＦＡで生成され、これが空を示す記号‘Φ’に対して適用する変換パターンとなる。図１４において、Ｎ１は正規表現“Ｎ１？”を書き直した“（Ｎ１｜Φ）”における正規表現Ｎ１を意味する。また、図１４の状態ｐは、状態Ｉへラベルｃでの遷移をもつ状態を示す。ここでは、状態ｐは１つだけである場合を示している。【００９０】
ＮＦＡ変換手段２２は、根ノードに対して上記のノード変換処理（ステップＡ４）を行うことで、構文木の全ノードに対して、再帰的にノード変換処理（ステップＡ４）を行うことができる。【００９１】
全ノードに対するノード変換処理（ステップＡ４）が終了すると、全ての処理を終了する。【００９２】
図１５は、例として、正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”から変換した構文木（図３）から変換したε遷移を含まないＮＦＡを示す図である。【００９３】
ＮＦＡ変換手段２２は、全ての処理が終了すると、最終的なＮＦＡデータをＮＦＡ記憶部３２へ記憶させると共に、出力装置４へ出力する。【００９４】
次に、本発明の第１の実施の形態の作用効果について説明する。【００９５】
本発明の第１の実施の形態においては、ＮＦＡ変換に、ε遷移を含まないＮＦＡへの変換パターンを用いることにより、正規表現から変換した構文木を入力することで、直接、ε遷移を含まないＮＦＡを生成することができる。【００９６】
前述したとおり、従来の手法の場合、正規表現の長さ（文字数）をｎとすると、正規表現から変換した構文木を経由してε遷移を含まないＮＦＡへ変換するためには、構文木から、ε−ＮＦＡへの変換にＯ（ｎ）、ε−ＮＦＡからε遷移を除去するのに、Ｏ（ｎ３）の処理が必要である。【００９７】
これに対して、本実施の形態によるε遷移を含まないＮＦＡへの変換手法を利用した場合、正規表現から変換した構文木の全ノード（ノード数ｎ）に対して、ノード変換処理を行う。メタキャラクタ‘＊’に対する処理では、初期状態Ｉ、又は終了状態Ｆへの遷移をもつ状態ｐ、又はｑの探索が、空を示す記号‘Φ’に対する処理では、初期状態Ｉへの遷移をもつ状態ｐの探索が必要となるが、本実施の形態では、ＮＦＡは、図４に示すように、遷移元の状態番号、遷移先の状態番号、遷移条件となる文字をもつデータ構造で実現される。つまり、遷移先の状態番号に着目することで、当該状態へ遷移してくる遷移元の状態、及びその遷移条件となる文字が得られるようなデータ構造であるため、遷移先の状態番号をキーとして探索することで、Ｏ（ｎ）のステップで状態ｐ、又はｑの探索を行うことができる。構文木で表現された正規表現のノー度数は最大ｎであることを考慮すると、本実施の形態によれば、Ｏ（ｎ２）の処理で、構文木で表現された正規表現から、ε遷移を含まないＮＦＡへの変換が可能となり、ε遷移を含まないＮＦＡへの変換速度が向上する。【００９８】
なお、上記実施の形態では、図４に示すようなデータ構造によってＮＦＡを記憶しているが、ある状態に着目した場合に、その状態へ遷移してくる遷移元の状態とその遷移条件となる文字がＯ（ｎ）（ｎは状態数）で探索できるようなデータ構造であればよい。【００９９】
また、上記実施の形態では、入力された構文木データは、初期設定手段２１によって構文木記憶部３１へ記憶され、初期設定手段２１の処理が終了する際に、再び、構文木記憶部３１から読み出され、ＮＦＡ変換手段２２へと転送されるが、初期設定手段２１は、入力された構文木データを構文木記憶部３１へ記憶させ、これを参照しながら、初期設定処理を行ってもよい。【０１００】
ＮＦＡ変換手段２２は、初期設定手段２１から受け取った構文木データを用いて変換処理を行う。初期設定手段２１は、初期設定手段２１における処理が終了すると、処理が終了したことを示す信号のみをＮＦＡ変換手段２２に送信し、ＮＦＡ変換手段２２は、構文木記憶部３１から構文木データを参照しながら変換処理を行ってもよい。【０１０１】
同様に、上記実施の形態では、初期設定手段２１によって設定されたＮＦＡデータをＮＦＡ記憶部３２へ記憶し、ＮＦＡ変換手段２２はそれを参照し、ＮＦＡデータを更新しながらＮＦＡへの変換処理を行う。初期設定手段２１は、初期設定の処理が終了すると、処理が終了したことを示す信号と共に、初期設定されたＮＦＡデータをＮＦＡ変換手段２２に送信し、ＮＦＡ変換手段２２は、そのデータをＮＦＡ記憶部３２へ記憶し、ＮＦＡ記憶部３２へ変換途中のＮＦＡデータを更新させながら変換処理を行ってもよい。【０１０２】
このように、構文木記憶部３１、ＮＦＡ記憶部３２を備えることにより、入力装置１は、初期設定手段２１の処理が終了するのを待つことなく新しい構文木データを入力することが可能である。同様に、初期設定手段２１は、ＮＦＡ変換手段２２の処理が終了することを待つことなく、構文木記憶部３１に新しい構文木データが存在すれば、次のＮＦＡ初期設定処理を開始することが可能であり、ＮＦＡ変換手段２２は、ＮＦＡ記憶部３２に新しい初期設定処理後のＮＦＡデータが存在すれば、次のＮＦＡ変換処理を開始することができ、効率的なＮＦＡ変換処理を行うことが可能である。【０１０３】
＜実施の形態２＞
次に、本発明の第２の実施の形態について図面を参照して詳細に説明する。図１６は、本発明の第２の実施の形態の構成を示すブロック図である。図１６を参照すると、本発明の第２の実施の形態において、データ処理装置５は、初期設定手段２３と、ＮＦＡ変換手段２４とを備えている。ここで、手段とはそれぞれの処理機能を指す。本実施の形態は、図１に示した前記第１の実施の形態のデータ処理装置２の初期設定手段２１、ＮＦＡ変換手段２２を、初期設定手段２３、ＮＦＡ変換手段２４に置き換えたものである。その他は、前記第１の実施の形態と同じである。【０１０４】
初期設定手段２３は、入力装置１から入力された構文木の形式に変換された正規表現を読み込み、構文木記憶部３１へ記憶させると共に、生成するＮＦＡの初期設定を根ノードの種別（文字かある特定のメタキャラクタか）に応じて行い、初期設定を行ったＮＦＡのデータ構造をＮＦＡ記憶部３２へ記憶させる。【０１０５】
ＮＦＡ変換手段２４は、初期設定手段２３から構文木を示すデータ構造を受け取ると共に、ＮＦＡ記憶部３２から、ＮＦＡを示すデータ構造を読み込む。【０１０６】
ＮＦＡ変換手段２４は、構文木の各ノードに対して、ε遷移を含まないＮＦＡへの変換パターンを適用し、ε遷移を含まないＮＦＡへ変換する。ここで、本実施形態においても、“ε遷移を含まない”とは、ε遷移に係る一般的な処理を含まないことを意味する。変換が終了すると、ＮＦＡ変換手段２４は、変換したＮＦＡを示すデータ構造をＮＦＡ記憶部３２へ記憶させると共に、出力装置４へ出力する。【０１０７】
次に、図１６、及び図１７を参照して本発明の第２の実施の形態の動作について詳細に説明する。【０１０８】
入力装置１から構文木の形式で表現された正規表現は初期設定手段２３に供給される。【０１０９】
入力された構文木は、前記第１の実施形態の２種類のメタキャラクタ（選択‘｜’、０回以上マッチ‘＊’）に、‘？’（０回、又は１回のみマッチ）、‘＋’（１回以上マッチ）の２種類を加えた４種類のメタキャラクタ、‘｜’、‘？’、‘＋’、‘＊’のみを使った正規表現に予め書き換えられ、構文木に変換されたものとする。但し、この構文木では、連結（ｃｏｎｃａｔｅｎａｔｉｏｎ）を表す‘・’のノードが加えられているものとする。また、データ構造は、前記第１の実施の形態と同じであるため、説明は省略する。【０１１０】
図１８に、正規表現を“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”とした場合の構文木の概要を示す。【０１１１】
初期設定手段２３は、構文木データを受け取ると、構文木を示すデータ構造を構文木記憶部３１へ記憶させると共に、状態０と１を生成し、状態０をＮＦＡの初期状態、状態１をＮＦＡの終了状態とする（ステップＡ１）。【０１１２】
また、初期設定手段２３は、入力された構文木の根ノードを処理ノード、初期状態Ｉを状態０、終了状態Ｆを状態１とし（ステップＡ１）、その根ノードが文字、メタキャラクタ‘｜’、‘＋’、連結を示す記号‘・’のいずれかに当てはまるかをチェックする（ステップＡ５）。【０１１３】
根ノードがそれらのいずれにも当てはまらない場合には、状態１を変換後のＮＦＡの初期状態でもあると設定する（ステップＡ３）。この場合、状態１は、変換後のＮＦＡの初期状態かつ終了状態となる。【０１１４】
初期設定手段２３は、上記の処理（ステップＡ１、ステップＡ５、ステップＡ３）が終了すると、生成したＮＦＡをＮＦＡ記憶部３２へ記憶させる。また、初期設定手段２３は、処理終了の信号と共に構文木記憶部３１から構文木データを読み込んで、ＮＦＡ変換手段２４へ送信する。ＮＦＡ記憶部３２へ記憶させるＮＦＡは、前記第１の実施の形態と同じデータ構造（図４に示した２次元配列と線形リスト）で実現できるため、詳細な説明を省略する。【０１１５】
続いて、ＮＦＡ変換手段２４は、初期設定手段２３から処理終了の信号と構文木データを受け取ると、処理ノードである根ノードからノード変換処理を行う（ステップＡ６）。【０１１６】
図１９は、ステップＡ６のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２４は、第１の実施の形態のステップＡ４のノード変換処理と同様に、処理ノードのチェック（ステップＢ１）を行い、処理ノードが文字、連結を示す記号‘・’、又はメタキャラクタ‘｜’、‘＊’のいずれかであれば、それぞれに対応する処理を行う（ステップＢ２、ステップＢ３、ステップＢ４、ステップＢ５、ステップＢ６、ステップＢ７、ステップＢ８、ステップＢ９）。【０１１７】
また、ＮＦＡ変換手段２４は、処理ノードが、０回、又は１回のみマッチを示すメタキャラクタ‘？’である場合、‘？’に対する処理（ステップＢ１３、ステップＢ１４）を行い、処理ノードが、１回以上マッチを示すメタキャラクタ‘＋’である場合、‘＋’に対する処理（ステップＢ１５、ステップＢ１６）を行う。【０１１８】
上記のいずれにも当てはまらない場合は、文法エラーとして、当該正規表現に対するＮＦＡに対するエラー処理を行う（ステップＢ１２）。【０１１９】
なお、ステップＢ１からステップＢ９、及びステップＢ１２については、第１の実施の形態と同じであるため、詳細な説明は省略する。【０１２０】
図２０は、ステップＢ１４のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２４は、現在の処理ノードをチェックし、そのノードが０回、又は１回マッチを示すメタキャラクタ‘？’である場合、当該処理ノードの子ノードを新たな処理ノードとして（ステップＦ１）、ノード変換処理を行う（ステップＡ６）。【０１２１】
なお、‘？’のノードの子ノードは必ず１つである。【０１２２】
子ノードの変換処理が終了すると、初期状態Ｉに遷移してくる状態ｐに対して、状態ｐから終了状態Ｆへの遷移を生成し、初期状態ＩがＮＦＡ全体の初期状態である場合、終了状態ＦもＮＦＡ全体の初期状態とし（ステップＦ３、ステップＦ４、ステップＦ５）、‘？’に対する処理（ステップＢ１４）を終了する。なお、ステップＦ１、ステップＦ３、ステップＦ４、ステップＦ５は第１の実施の形態と同じであるので詳細な説明は省略する。また、初期状態Ｉ、終了状態Ｆ、‘？’ノードに対して適用するε遷移を含まないＮＦＡの変換パターンは図１４と同じである。また、この場合、図１４におけるＮ１は‘？’ノードの子ノードを根とする構文木が示す正規表現を意味する。【０１２３】
図２１は、ステップＢ１６のより詳細な動作を説明するための流れ図である。ＮＦＡ変換手段２４は、現在の処理ノードをチェックし、そのノードが１回以上マッチを示すメタキャラクタ‘＋’である場合、当該処理ノードの子ノードを新たな処理ノードとして（ステップＦ１）、ノード変換処理を行う（ステップＡ６）。【０１２４】
なお、‘＋’のノードの子ノードは必ず１つである。【０１２５】
子ノードの変換処理が終了すると、終了状態Ｆに遷移してくる状態ｑに対して、状態ｑから初期状態Ｉへの遷移を生成し（ステップＦ２）、‘＋’に対する処理（ステップＢ１６）を終了する。【０１２６】
なお、ステップＦ１、ステップＦ２は、第１の実施の形態と同じであることから、詳細な説明は省略する。【０１２７】
図２２は、初期状態Ｉ、終了状態Ｆ、‘＋’ノードに対して適用するε遷移を含まないＮＦＡの変換パターンを示す図である。図２２において、Ｎ１は‘＋’ノードの子ノードを根とする構文木が示す正規表現を意味し、状態ｑは状態Ｆへラベルｃでの遷移をもつ状態を示す。ここでは、状態ｑが１つである場合を示している。なお、第２の実施の形態においては、各処理ステップ中に行うノード変換処理は全てノード変換処理（ステップＡ６）であるものとする。【０１２８】
ＮＦＡ変換手段２４は、根ノードに対して上記のノード変換処理（ステップＡ６）を行うことで、構文木の全ノードに対して再帰的にノード変換処理（ステップＡ６）を行うことができ、全ノードに対するノード変換処理（ステップＡ６）が終了すると、全ての処理を終了する。【０１２９】
図２３は、例として、正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”から変換した構文木（図１８）をＮＦＡに変換した際の概念を示す図である。ＮＦＡ変換手段２４は、全ての処理が終了すると最終的なＮＦＡデータをＮＦＡ記憶部３２へ記憶させると共に、出力装置４へ出力する。【０１３０】
次に、本発明の第２の実施の形態の作用効果について説明する。【０１３１】
本発明の第２の実施の形態では、前記第１の実施の形態と同様、ＮＦＡ変換にε遷移を含まないＮＦＡへの変換手段（変換パターン）を用いることにより、正規表現から構文木を経由して直接ε遷移を含まないＮＦＡを生成できる上、その処理はＯ（ｎ２）の処理であることから、ＮＦＡへの変換速度が向上する。【０１３２】
また、前記第１の実施の形態とは異なり、本発明の第２の実施の形態では、２種類のメタキャラクタ‘｜’、‘＊’に、２種類のメタキャラクタ‘？’、‘＋’を加えた、合計４種類のメタキャラクタと、連結を示す記号‘・’をノードとして利用した構文木に対して、直接ε遷移を含まないＮＦＡに変換することができる。【０１３３】
特に、メタキャラクタ‘＋’を用いた正規表現の場合、従来、“Ｎ１＋”を“Ｎ１Ｎ１＊”として、変換する必要があったため、正規表現“Ｎ１”を表す部分の状態が重複して生成されていたが、本実施の形態では、この書き換えが不要であるために、メタキャラクタ‘＋’を用いた正規表現部分の状態数の増加を防ぐことができる。【０１３４】
なお、本発明の第２の実施の形態では、前記第１の実施の形態と同様、図４に示すようなデータ構造によってＮＦＡを記憶しているが、ｎを状態数とすると、ある状態に着目した場合にその状態へ遷移してくる遷移元の状態とその遷移条件となる文字がＯ（ｎ）で探索できるようなデータ構造であれば良い。【０１３５】
また、本実施の形態では、入力された構文木データは、初期設定手段２３によって構文木記憶部３１へ記憶され、初期設定手段２３の処理が終了する際に、再び構文木記憶部３１から読み出され、ＮＦＡ変換手段２４へと転送されるが、初期設定手段２３は、入力された構文木データを構文木記憶部３１へ記憶させ、これを参照しながら初期設定手段２３の処理を行ってもよい。【０１３６】
さらに、ＮＦＡ変換手段２４は、初期設定手段２３から受け取った構文木データを用いて変換処理を行うが、初期設定手段２３は、初期設定手段２３における処理が終了すると、処理が終了したことを示す信号のみを、ＮＦＡ変換手段２４に送信し、ＮＦＡ変換手段２４は、構文木記憶部３１から構文木データを参照しながら変換処理を行ってもよい。【０１３７】
同様に、本実施の形態においては、初期設定手段２３によって設定されたＮＦＡデータをＮＦＡ記憶部３２へ記憶し、ＮＦＡ変換手段２４は、それを参照し、ＮＦＡデータを更新しながらＮＦＡへの変換処理を行うが、初期設定手段２３は、初期設定の処理が終了すると、処理が終了したことを示す信号と共に、初期設定されたＮＦＡデータをＮＦＡ変換手段２４に送信し、ＮＦＡ変換手段２４は、そのデータをＮＦＡ記憶部３２へ記憶し、ＮＦＡ記憶部３２へ変換途中のＮＦＡデータを更新させながら変換処理を行ってもよい。【０１３８】
このように、構文木記憶部３１、ＮＦＡ記憶部３２を備えることにより、第１の実施の形態と同様、入力装置１、初期設定手段２３、ＮＦＡ変換手段２４は、それぞれ他の手段における処理の終了を待たず、新規データがあれば次の処理を開始することができ、効率的なＮＦＡ変換処理を行うことが可能である。【０１３９】
＜実施の形態３＞
次に、本発明の第３の実施の形態について説明する。図２４は、本発明の第３の実施の形態の構成を示すブロック図である。図２４を参照すると、本発明の第３の実施の形態において、データ処理装置６は、構文木変換手段２５と、初期設定手段２１と、ＮＦＡ変換手段２２とを備えている。ここで、手段とはそれぞれの処理機能を指す。本実施の形態は、図１の前記第１の実施の形態におけるデータ処理装置２に、構文木変換手段２５が追加されている。その他は、前記第１の実施の形態と同じである。【０１４０】
構文木変換手段２５は、入力装置１から入力された変換対象の正規表現を読み込み、‘｜’（選択）、‘＊’（０回以上マッチ）の２種類のメタキャラクタのみを使った正規表現に書き換える。その後、正規表現を構文木に変換し、構文木変換終了を意味する信号と共に初期設定手段２１へ送信する。なお、この構文木は、連結を表す記号‘・’と空を表す記号‘Φ’をノードとして利用する。【０１４１】
初期設定手段２１が構文木変換手段２５から処理終了を意味する信号と構文木データを受け取った後は、前記第１の実施の形態と同じであるため、説明は省略する。【０１４２】
次に、図２４、及び図２５を参照して、本発明の第３の実施の形態の動作について詳細に説明する。【０１４３】
本実施の形態においては、入力装置１からは、正規表現そのものが入力され、入力された正規表現は構文木変換手段２５に供給される。【０１４４】
構文木変換手段２５は、入力された正規表現を、２種類のメタキャラクタ‘｜’（ＯＲ：選択）、‘＊’（０回以上マッチ）のみを使った正規表現に書き換える。【０１４５】
構文木変換手段２５は、正規表現の書き換えを行った後、該正規表現を構文木に変換し、構文木を示すデータ構造を処理が終了したことを示す信号と共に、初期設定手段２１へ送信する（ステップＡ７）。なお、この構文木は、連結を表す記号‘・’と空を表す記号‘Φ’をノードとして利用する。正規表現を上記２種類のメタキャラクタのみを使った正規表現に書き換える処理においては、与えられた正規表現を‘・’と‘Φ’を使って書き換えた後（例えば、“ａｂ？ｃ”を“ａ・（ｂ｜Φ）・ｃ”）に、構文木へ変換しても良いし、これらの記号を利用せずに正規表現に書き換えた後（例えば、“ａｂ？ｃ”を“ａ（ｂ｜）ｃ”）、構文木への変換を行う際に、‘・’と‘Φ’の記号をノードとして加えても良い。また、‘・’は構文木への変換時に加え、‘Φ’は正規表現の書き換え時に加える、もしくは、その逆の変換時に加えるとしても良く、最終的に構文木に変換した時点で、‘・’と‘Φ’のノードが利用されていれば問題ない。【０１４６】
構文木を示すデータ構造は、第１の実施の形態と同じものであり、正規表現から構文木を生成する処理は、従来から用いられている手法を用いるので、ここではこれらの説明を省略する。例えば、正規表現“ａｂ＊（ｃ｜ｄ）ｅ？ｆ（ｇｈ）＋ｉ”が入力された場合、図３に示すような構文木が生成される。【０１４７】
構文木変換手段２５から、処理終了を意味する信号と構文木データを初期設定手段２１が受け取った後、ステップＡ１以降の動作は、第１の実施の形態と同じ動作を行う。このため、詳細な説明は省略する。【０１４８】
次に、本発明の第３の実施の形態の作用効果について説明する。【０１４９】
本発明の第３の実施の形態においては、前記第１の実施の形態と同様、ＮＦＡ変換に、ε遷移を含まないＮＦＡへの変換（変換パターン）を用いることにより、正規表現から、構文木を経由して直接ε遷移を含まないＮＦＡを生成できる。また、その処理は、Ｏ（ｎ２）の処理であることから、ＮＦＡへの変換速度が向上する。【０１５０】
本発明の第３の実施の形態においては、前記第１の実施の形態とは異なり、正規表現そのものを入力し、構文木を経由させることでε遷移を含まないＮＦＡへ直接変換することができる。【０１５１】
なお、上記した第３の実施の形態においては、構文木変換手段２５は、正規表現を構文木に変換した後、その構文木データを処理終了信号と共に、初期設定手段２１へ送信していた。構文木変換手段２５は、構文木への変換が終了すると、構文木データを構文木記憶部３１へ記憶させ、初期設定手段２１へは処理終了信号のみを送信し、初期設定手段２１は、処理終了信号を受け取ると、構文木記憶部３１から構文木データを読み込み、それ以降、第１の実施の形態と同じ動作を行うようにしてもよい。【０１５２】
さらに、上記した第３の実施の形態では、前記第１の実施の形態におけるデータ処理装置２の構成において、構文木変換手段２５が新たに追加された構成であり、構文木変換手段２５において、入力された正規表現を、２種類のメタキャラクタ‘｜’、‘＊’のみを使った正規表現に書き換える。これを、連結を示す記号‘・’と空を示す記号‘Φ’をノードとして利用する構文木に変換した後、初期設定手段２１へ処理終了を意味する信号と共に、構文木データを送信し、ステップＡ７以降は、前記第１の実施の形態と同じ動作を行う。【０１５３】
上記した第３の実施の形態では、前記第２の実施の形態におけるデータ処理装置５の構成において、構文木変換手段２５を新たに加え、構文木変換手段２５において、入力された正規表現を４種類のメタキャラクタ‘｜’、‘？’、‘＋’、‘＊’のみを使った正規表現に書き換える。これを、連結を示す記号‘・’をノードとして利用する構文木に変換した後、処理終了を意味する信号と共に、構文木データを初期設定手段２３へ送信するステップＡ７を行った後、前記第２の実施の形態と同じ動作を行ってもよい。なお、この際、正規表現を上記４種類のメタキャラクタのみを使った正規表現に書き換える処理においては、与えられた正規表現を‘・’を使って書き換えた後（例えば、“ａｂ？ｃ”を“ａ・ｂ？・ｃ”）に、構文木へ変換しても良いし、これらの記号を利用せず、構文木への変換を行う際に、‘・’の記号をノードとして加えても良い。最終的に構文木に変換した時点で、‘・’のノードが利用されていれば問題ない。【０１５４】
＜実施の形態４＞
次に、本発明の第４の実施の形態について説明する。図２６は、本発明の第４の実施の形態の構成を示すブロック図である。図２６を参照すると、本発明の第４の実施の形態は、前記第１、第２、第３の実施の形態と同様に、入力装置１、データ処理装置７（２、５、６）、記憶装置３、出力装置４を備える。本実施の形態においては、前記第１の実施の形態のデータ処理装置２の初期設定手段２１、ＮＦＡ変換手段２２、あるいは、前記第２の実施の形態のデータ処理装置５の初期設定手段２３、ＮＦＡ変換手段２４、前記第３の実施の形態のデータ処理装置６の初期設定手段２１、ＮＦＡ変換手段２２、構文木変換手段２５の処理を、データ処理装置で実行されるＮＦＡ変換プログラム８で実現したものである。【０１５５】
ＮＦＡ変換プログラム８は、データ処理装置７に読み込まれ、データ処理装置７の動作を制御し、記憶装置３に、構文木記憶部３１とＮＦＡ記憶部３２を生成する。【０１５６】
データ処理装置７は、ＮＦＡ変換プログラム８の制御により、第１、第２、及び第３の実施の形態におけるデータ処理装置２、５、及び６による処理と同一の処理を実行する。【０１５７】
上記した本実施形態によれば、以下のような効果を奏する。【０１５８】
本実施形態によれば、正規表現から構文木を経由し、ε遷移を含まないＮＦＡ変換を高速に処理できる。【０１５９】
すなわち、上記した本実施の形態においては、ＮＦＡ変換にε遷移を含まないＮＦＡへの変換手段（変換パターン）を適用する上、遷移元の状態番号、遷移先の状態番号、遷移条件となる文字を有し、ｎを状態数とすると、ある状態に着目した場合にその状態へ遷移してくる遷移元の状態がＯ（ｎ）で探索できるようなデータ構造を用いてＮＦＡへの変換を行うことで、従来の手法では必要であったε遷移の除去（ε−ｃｌｏｓｕｒｅ）を行う必要がなく、正規表現から構文木を経由して直接ε遷移を含まないＮＦＡを生成できるためである。なお、正規表現の長さ（文字数）をｎに対して、従来の手法を利用した場合にはＯ（ｎ３）の処理がかかり、本発明を用いた場合には、Ｏ（ｎ２）の処理でＮＦＡ変換が可能である。【０１６０】
また、本実施形態によれば、メタキャラクタ‘？’、‘＋’に対する変換パターンを適用することにより、正規表現から構文木への変換の際に、これら２種類のメタキャラクタに対する書き換えは必要ない。【０１６１】
従来の正規表現からＮＦＡへの変換においては、正規表現から構文木に変換する際に、対象の正規表現を、メタキャラクタ‘｜’、‘＊’の２種類のみを用いた正規表現へまず書き換えてから、連結を示す記号‘・’をノードとして利用する構文木への変換が必要であった。本実施の形態によれば、メタキャラクタ‘？’、‘＋’に対する変換パターンを用いることができるため、構文木においてもメタキャラクタ‘？’、‘＋’がノードとして現れてもよく、ノード変換処理に、それぞれの変換パターンを適用することで、直接ε遷移を含まないＮＦＡへの変換が可能である。【０１６２】
本実施形態によれば、メタキャラクタ‘＋’に対する変換パターンを適用することにより、生成されたＮＦＡの状態数が削減できる。【０１６３】
従来の手法では、“Ｎ＋”のような正規表現を変換する場合には、“ＮＮ＊”に書き換えてから構文木を生成する必要があり、その結果、Ｎで表される正規表現を示すＮＦＡが２回現れていた。本実施の形態によれば、メタキャラクタ‘＋’に対する変換パターンを適用することにより、Ｎで表される正規表現を示すＮＦＡが１回だけ現れる。つまり、“Ｎ＋”で表される正規表現Ｎに含まれる状態数だけ、最終的に生成されるＮＦＡから状態が削減できる。
【産業上の利用可能性】
【０１６４】
本発明は、正規表現を用いたパターンマッチング処理を行うためのε遷移を含まないＮＦＡを高速に生成するためのプログラムといった用途に適用できる。【０１６５】
また、ＮＦＡをハードウェア回路化することで、正規表現を用いた高速なパターンマッチング処理を行うハードウェア回路生成のためのＮＦＡの生成システム、生成プログラムといった用途に適用できる。【０１６６】
さらに、パソコンやワークステーションに搭載されているソフトウェアベースでのパターンマッチング処理におけるＮＦＡ生成にも適用できる。これら上記の場合において、当該情報処理装置内に供給されたコンピュータ・プログラムは、読み書き可能なメモリまたはハードディスク装置等の記憶デバイス（記憶媒体）に格納すれば良い。そして、このような場合において、本発明は、係るコンピュータ・プログラムのコード或いは記憶媒体によって構成される。【０１６７】
本発明の全開示（請求の範囲を含む）の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の請求の範囲の枠内において種々の開示要素の多様な組み合わせないし選択が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。
【図１】
2009017131.tif 000003
【図２】
2009017131.tif 000004
【図３】
2009017131.tif 000005
【図４】
2009017131.tif 000006
【図５】
2009017131.tif 000007
【図６】
2009017131.tif 000008
【図７】
2009017131.tif 000009
【図８】
2009017131.tif 000010
【図９】
2009017131.tif 000011
【図１０】
2009017131.tif 000012
【図１１】
2009017131.tif 000013
【図１２】
2009017131.tif 000014
【図１３】
2009017131.tif 000015
【図１４】
2009017131.tif 000016
【図１５】
2009017131.tif 000017
【図１６】
2009017131.tif 000018
【図１７】
2009017131.tif 000019
【図１８】
2009017131.tif 000020
【図１９】
2009017131.tif 000021
【図２０】
2009017131.tif 000022
【図２１】
2009017131.tif 000023
【図２２】
2009017131.tif 000024
【図２３】
2009017131.tif 000025
【図２４】
2009017131.tif 000026
【図２５】
2009017131.tif 000027
【図２６】
2009017131.tif 000028
【図２７】
2009017131.tif 000029
【図２８】
2009017131.tif 000030
【図２９】
2009017131.tif 000031
【図３０】
2009017131.tif 000032
【国際調査報告】
2009017131.tif 000033
2009017131.tif 000034
2009017131.tif 000035
2009017131.tif 000036