(第1の実施形態)
本発明を実施するための第1の実施形態について図面を参照して詳細に説明する。
図1は、本実施形態の構文解析装置1の一構成例を示すブロック図である。構文解析装置1は、入力されたXMLテキストのデータ構造を解析する装置である。同図を参照すると、構文解析装置1は、入力部10、先行パージング部11、主パージング部12、先行パージング実行論理CPU13、主パージング実行論理CPU群14、進度調整部15、および出力部16を有する。
入力部10は、入力一時記憶部102を有する。入力部10は、XMLで記述されたXMLテキスト101を、入力一時記憶部102に読み込み、先行パージング部11および主パージング部12に入力する。入力部10は、例えば、例えばOS(Operating System)のファイルオープンシステムコールやネットワーク通信システムコールを用い、XMLテキスト101を入力一時記憶部102に読み込む。入力部10は、XMLテキスト101の全部を読み込んでもよいし、パージングに必要な部分を含む範囲で、XMLテキスト101の一部だけを読み込んでもよい。
先行パージング部11は、字句解析部111、タグ一時記憶部112、およびタグ対応登録部113、および先行パージング進捗情報114を有する。
先行パージング部11は、新たにXMLテキスト101の処理を始める際に、字句解析部111、タグ一時記憶部112、および先行パージング進捗情報114を初期化する。初期化により、字句解析部111は初期状態、すなわち、入力されたテキストの先頭位置から字句解析を開始する状態となる。
字句解析部111は、入力一時記憶部102に記憶されたXMLテキスト101の先頭から順に文字を取得し、XML文法に沿った字句解析を行う。字句解析部111で使用されるXML文法は、XML規格で規定されている開始タグと終了タグとを認識できる範囲に絞った、XML本来の文法の簡略版の文法である。この簡略版の文法については後述する。
また、字句解析部111は、XMLテキスト101中で、現在字句解析を行っている位置、すなわち字句解析の進度を示す情報を先行パージング進捗情報114として保持し、その値を適宜更新する。ここで、適宜更新の頻度は、字句解析手段111が入力一時記憶部102から文字を1つ取得するたびに更新するという頻度でもよいし、開始タグないし終了タグを発見するたびに更新する等の、やや低頻度の更新であってもよい。
字句解析部111は、字句解析において、開始タグを発見すると、その開始タグの位置を示す位置情報をタグ一時記憶部112に格納する。
ここで、開始タグの位置とは、XMLテキスト101において開始タグの出現位置を一意に特定するに足りる情報であって、例えば、テキストの先頭から文字単位に数えた、開始タグの先頭文字のオフセット(変位)値を位置として用いることができる。
字句解析部111は、字句解析において、終了タグを発見したとき、タグ一時記憶部112から、最後に格納された開始タグの位置情報を取り出す。取り出された位置情報は、タグ一時記憶部112から削除される。そして、字句解析部111は、取り出した位置情報の示す開始タグの位置と、発見した終了タグの位置との組を、引数としてタグ対応登録部113を呼び出し、この組をタグ対応登録部113に格納する。
ここで、終了タグの位置とは、XMLテキスト101において終了タグの出現位置を一意に特定するに足りる情報であって、例えば、テキストの先頭から文字単位に数えた、終了タグの最終文字のオフセット(変位)値を位置として用いることができる。
マーキング言語においては、開始タグ、文章、対応する終了タグの順で記述される。同じ属性の開始タグ、終了タグの組の間に、別の属性の開始タグ、終了タグの組を挿入することもできるが、文法上、同じ属性の開始タグ、終了タグの組の間に、別の属性の開始タグ、終了タグのいずれか一方のみが挿入されることはない。このため、複数の属性の開始タグ、終了タグが入れ子構造となっている場合、字句解析部111が、先頭から順に字句解析を行い、終了タグが出現したとき、その時点を基準として直近に出現した開始タグが、その終了タグと対になる開始タグに相当する。
従って、字句解析部111が、開始タグが出現するたびにタグ一時記憶部112に格納しておき、終了タグが出現した時点で、タグ一時記憶部112に最後に格納した開始タグの位置を取り出した場合、取り出した位置の開始タグが、出現した終了タグと対応するタグに該当することになる。
タグ一時記憶部112は、タグ一時記憶部112は、後入れ先出し(LIFO;Last−In−First−Out)方式で開始タグの位置を示す位置情報を複数、記憶する。すなわち、時系列に沿って複数の位置情報がタグ一時記憶部112に記憶されているときに、字句解析部111が、そこから位置情報を1つ取り出すと、もっとも遅い時刻(直近)に記憶された位置情報が取り出される。字句解析部111が取り出し操作を行うと、取り出された情報はタグ一時記憶部112から削除される。タグ一時記憶部112は、例えば、スタック構造を用いて実現することができる。
タグ対応登録部113は、字句解析部111で求められた開始タグの位置と終了タグの位置との各組を、先行解析表1131に記載する。
先行解析表1131は、例えば、開始タグ位置をキーとし、それに対応する終了タグ位置を値とする連想記憶装置である。
ここで、開始タグの位置も、終了タグの位置も整数であるから、この連想記憶装置は、開始タグ位置の整数値を適当なハッシュ関数にかけ、その値をインデックス(添字)とする整数配列として、コンピュータ上に容易に実現することができる。
タグ対応登録部113は、字句解析部111により、一組の開始タグおよび終了タグの位置が引数として呼び出されると、開始タグの位置をキーとして先行解析表1131を検索する。該当するデータエントリが存在しなければ、タグ対応登録部113は、その開始タグの位置をキーとし、終了タグの位置を値とする新たなデータエントリを先行解析表1131に書き込む。
開始タグの位置をキーとする検索の結果、もし該当するデータエントリが既に存在すれば、タグ対応登録部113は、新たな登録は行わず、呼出元である字句解析部111にエラーを通知する。
図2に、XMLテキスト101の記載内容の一例を示す。同図に示すように、XMLテキスト101には、文章と、その文章の構造やレイアウトを指定するタグとが、記述される。同図においては、XMLテキスト101を、20文字ごとに折り返し、5列ごと、5行ごとに点線で区切っている。20文字ごとに折り返して記載しているのは読みやすさのためであり、XMLテキスト101は、20文字ごとに改行されているとは限らない。
例えば、開始タグとして、「<AA>」、「<BB>」などが記述される。終了タグとして、「<AA>」に対応する「</AA>」や、「<BB>」に対応する「</BB>」などが記述される。これらの開始タグと終了タグとの間に、「text fоr BB」などの文章が記述される。
字句解析部111により、テキストの先頭を基準として、開始タグを構成する文字列のうち、「<」の文字のオフセットが開始タグの位置として取得される。また、終了タグを構成する文字列のうち、「>」の次の文字のオフセットが開始タグの位置として取得される。
例えば、開始タグ「<AA>」における「<」の文字は、テキストの先頭の文字である。これに対応する終了タグ「</AA>」における「>」の次の文字は、テキストの先頭から数えて225番目の文字である。従って、タグ対応登録部113には、これらの開始タグ、終了タグの位置の組として、(0、225)の組が登録される。
ここで、字句解析部111の説明で言及した簡略版のXML文法について説明する。この簡略版のXML文法は、その文法に基づいて、字句解析部111が、開始タグと終了タグを認識できる範囲で、十分高速動作できるものが望ましい。また、簡略版の文法では、開始タグや終了タグの属性名(例えば、開始タグ”<AA>”における名前”AA”)の対応付けは無視してよい。その理由は、先行パージング部11は、主パージング部12の動作よりも十分先行してタグの対応関係を見つけ出す必要があるためである。また、主パージングにて正式なXML解析を行うので先行パージングでは必ずしもタグの中身(属性)のチェックを行う必要が無いためである。
この簡略版の文法に基づき、字句解析部111は、例えば、図3に示す状態遷移図に従って動作する有限状態機械(有限オートマトン)で実現できる。同図において、初期状態は状態S1である。
状態S1において、字句解析した文字が、「s」、「>」、「/」、「!」、「’」、または「”」であれば、字句解析部111は、状態S1に遷移する。状態S1において、字句解析した文字が、「<」であれば、字句解析部111は、状態S2に遷移する。
ここで、「s」はXML文法で定義される空白文字(スペース、復帰、改行、タブを表す文字のいずれか)である。
状態S2において、字句解析した文字が「s」であれば、字句解析部111は、状態S2に遷移し、「/」であれば、字句解析部111は、状態S3に遷移する。また、状態S2において、字句解析した文字が「x」であれば、字句解析部111は、開始タグ(「starttag」)を発見したときの処理を行い、状態S4に遷移する。すなわち、開始タグの位置をタグ一時記憶部112に格納する。状態S2において、字句解析した文字が「!」であれば、字句解析部111は、状態S8に遷移する。
ここで、「x」は「<」、「>」、「/」、「!」、「’」、「”」、および空白文字以外の有効文字である。
状態S3において、字句解析した文字が「x」であれば、字句解析部111は、状態S3に遷移し、「>」であれば、終了タグ(「endtag」)を発見したときの処理をし、状態S1に遷移する。すなわち、字句解析部111は、一時記憶部112から、開始タグの位置を読み出し、終了タグの位置とともに、タグ対応登録部113に格納する。
状態S4において、字句解析した文字が「x」であれば、字句解析部111は、状態S4に遷移し、「>」であれば、状態S1に遷移する。状態S4において、字句解析した文字が「/」であれば、字句解析部111は、状態S5に遷移し、「”」であれば、状態S6に遷移する。状態S4において、字句解析した文字が「’」であれば、字句解析部111は、状態S7に遷移する。
状態S5において、字句解析した文字が「>」であれば、字句解析部111は、終了タグを発見したときの処理をし、状態S1に遷移する。
状態S6において、字句解析した文字が「s」、「>」、「/」、「!」、「’」、または「x」であれば、字句解析部111は、状態S6に遷移し、「”」であれば、状態S4に遷移する。
状態S7において、字句解析した文字が「s」、「>」、「/」、「!」、「”」、または「x」であれば、字句解析部111は、状態S7に遷移し、「’」であれば、状態S4に遷移する。
状態S8において、字句解析した文字が「s」、「<」、「/」、「!」、「’」、「”」、または「x」であれば、字句解析部111は、状態S8に遷移し、「>」であれば、状態S1に遷移する。
図4は、タグ一時記憶部112の一構成例を示す図である。同図に示すように、タグ一時記憶部112には、LIFO方式で、各開始タグの位置を示す位置情報が格納される。
例えば、タグ一時記憶部112に「<AA>」、「<CC p=”fоо”>」、「<DD>」の順で、これらの開始タグの位置情報が格納された状態について考える。字句解析部111が、このタグ一時記憶部112から位置情報を取り出す場合、最も遅くに格納された「<DD>」の位置情報が取り出され、その位置情報がタグ一時記憶部112から削除される。
図5は、先行解析表1131に記載される内容をまとめた表である。同図を参照すると、先行解析表1131には、開始タグの位置と、終了タグの位置とが対応付けて記載される。先行解析表1131の各行(データエントリ)に記載された値が、開始タグの位置と、そのタグに対応する終了タグの位置との組である。終了タグが出現した時点で、その終了タグの位置と、対応する開始タグの位置とが格納されるので、同図に示すように、各データエントリにおいて開始タグの位置、終了タグの位置は、必ず対になって記載され、いずれか一方のみが記載されることはない。
図5の先行解析表1131では、開始タグの位置の小さい順に、データエントリが並んでいる。しかし、これは、見やすさ、あるいは検索のしやすさのために整列したものであり、整列は必ずしも必要ではない。整列方法についても、開始タグの大きい順に整列するなど、任意の方法を使用できる。
次に、図1を参照して主パージングについて説明する。同図を参照すると、主パージング部12は、構文解析部121、粒度推定部122、並列化部123、内部表現生成部124、および主パージング進捗情報125を有する。
主パージング部12は、新しく入力XMLテキストの処理を始める際に、構文解析手段121、内部表現生成部124、および主パージング進捗情報125を初期化する。初期化により、構文解析部121は初期状態、すなわち入力されたテキストの先頭位置から解析を開始する状態となる。
主パージング実行論理CPU群14における論理CPUが、構文解析部121を呼び出し、構文解析部121は、XMLテキスト101の先頭から順にXML文法に沿った構文解析を行う。構文解析部121による構文解析は、字句解析部111による字句解析と並行して行われる。
また、構文解析部121は、XMLテキスト101中で、現在構文解析を行っている位置を主パージング進捗情報125として保持し、その値を適宜更新する。
構文解析部121で使用されるXML文法は、先行パージング部11内の字句解析部111で用いられる簡略版文法ではなく、上記非特許文献1に記載されているXML規格に沿った正式なXML文法である。
コンピュータプログラミング言語の文法分類でみると、XML文法はLL(1)文法に属する。LL(1)に属する文法は、BNF(Backus-Naur Form)と呼ばれる形式で記述することができ、そのBNF記述から当該文法に対する構文解析プログラムを作成する標準的な手順が存在する。例えば、「中田育男,『コンパイラ』,産業図書,ISBN4−7828−5057−3, 5.4.3節から5.4.5節まで」(以下、「非特許文献5」という)にLL(1)構文解析手順の作成法が説明されている。
上述したように、上記非特許文献1にはXMLの各構文規則のBNF記述が記載されている。構文解析部121は、上記非特許文献1、5等に記載されたコンパイラ一般技術の説明とあわせた、XML文法の各構文規則に対するLL(1)構文解析手順を利用することにより、XML文法全体に関する構文解析を行う。
ここで、単一CPU向けXML構文解析における、非終端記号「要素(element)」の構文解析手順について説明する。上記非特許文献1を参照すると、XML文法における非終端記号「要素」の構文規則は下記に示すようなBNFで定義されている。
(XMLにおける要素の構文規則)
element::=EmptyElemTag
|STag content ETag
ここで、「element」は「要素」であり、「EmptyElemTag」は、「空き要素タグ」である。「STag」は、「開始タグ」であり、「content」は、「要素の内容」であり、「ETag」は、「終了タグ」である。
このBNFは、XML文法上、「要素」の概念には、「空き要素タグ」が含まれること、また、「要素」の概念には、「開始タグ」、「要素の内容」、「終了タグ」を順にならべたものが含まれることを意味している。
構文解析部121が、この空き要素タグ以外の要素の構文解析を開始するとき、粒度推定部122を呼び出し、その要素の開始タグの位置を引数として与える。
粒度推定部122は、先行解析表1131を参照して、引数と一致する開始タグの位置が先行解析表1131に登録されているか否かを検索する。引数と一致する開始タグの位置が登録されていれば、粒度推定部122は、その開始タグの位置と、対応する終了タグの位置との差(以下、「粒度」という)を構文解析部121に返す。
引数と一致する開始タグの位置が登録されていなければ、粒度推定部122は、粒度が不明である旨を構文解析部121に返す。
粒度が所定の閾値に満たない場合、または粒度が不明である場合、構文解析部121は、「開始タグ」以降の「要素の内容」、および「終了タグ」を構文解析する。
粒度が所定の閾値以上であれば、構文解析部121は、並列化部123を呼び出し、新しい論理CPUに、粒度が閾値以上の「要素の内容」の部分を解析させるように指示する。並列化部123は、構文解析装置1のリソース内において未使用の論理CPUを主パージング実行論理CPU群14に追加する。追加された論理CPUは、構文解析部121を呼び出す。
以下、並列化部123が呼び出された時点で主パージングを実行していた論理CPUを「親論理CPU」といい、親論理CPUの指示により新たに追加された論理CPUを「子論理CPU」という。
親論理CPUが実行する構文解析部121が、「開始タグ」に対応する「終了タグ」以降の構文解析を行うとともに、追加された子論理CPUが、構文解析部121を呼び出し、指示された「要素の内容」を構文解析する。子論理CPUは、指示された「要素の内容」の構文解析が終了後に解放される。
ここで、子論理CPUが追加された場合、前述した主パージング進捗情報125として保持される位置は、親論理CPUによる構文解析が行われる位置である。つまり、並列して行われる構文解析の進行位置のうち、最大値を示す情報が主パージング進捗情報125として保持される。
構文解析部121は、「終了タグ」を解析したとき、内部表現生成部124を呼び出す。内部表現生成部124は、構文解析の結果に基づいて、XMLテキスト101を、内部表現であるXMLツリー161に変換する。
上記非特許文献1を参照すると、XML文法の非終端記号「要素の内容」の構文規則右辺は非終端記号「要素」を含んでおり、LL(1)構文解析手順では「要素」の解析と「要素の内容」の解析は相互再帰になる。
上述した「要素」の並列処理手順をそのまま適用すると、「要素」がその内部に、別の「要素」を入れ子構造で持っている場合、「要素の内容」の構文解析を始めた子論理CPUが再度、新たな子論理CPUを追加して入れ子構造を解析する。このため、子論理CPUの追加が再帰的に繰り返される可能性がある。しかし、入れ子構造であるから、その「要素の内容」のサイズは外側から内側に向かうにつれ小さくなり、サイズが閾値以下となった時点で再帰が停止するので、再帰が無限に連鎖することは無い。
先行パージング実行論理CPU13は、先行パージング部11において、先行パージングを実行する論理CPUである。
主パージング実行論理CPU群14は、主パージング部12において主パージングを実行する1組以上の論理CPUの集合(論理CPU141、142など)である。
ここで論理CPUとは、コンピュータシステムにおいて、与えられたデータに対して与えられた手順に沿って処理を進める主体である。例えば、マルチタスクコンピュータシステムにおけるスレッドや、LWP(Low Weight Process:軽量プロセッサ)が論理CPUに相当する。
進度調整部15は、CPU配分決定部151およびCPU配分制御部152を有する。
CPU配分決定部151は、先行パージング部11、および主パージング部12が新しくXMLテキスト101の処理を始める際、各部に、予め定められたCPU資源を割り当てる。
CPU配分決定部151は、先行パージング進捗情報114および主パージング進捗情報125を取得し、それらの情報の示す先行パージングの進度と、主パージングの進度とを比較する。CPU配分決定部151は、先行パージングの進度が主パージングの進度以上であり、且つ、先行パージング、主パージングの進度の差が所定範囲内となるように、先行パージング部11、主パージング部12のそれぞれに配分すべきCPU資源(13、14)の量を決定する。
ここで、CPU資源の量とは、複数CPU構成のコンピュータシステムにおける、各物理CPUの台数であってもよいし、オペレーティングシステムや仮想化ソフトウェアが提供する仮想CPUの台数であってもよい。あるいは、物理CPUまたは仮想CPUに対するCPU時間割当量や処理優先度であってもよい。
CPU資源量の割り当てにおいて、CPU配分決定部151は、事前に各パージングの進度の差について、上限値、および下限値を設定しておく。
CPU配分決定部151は、先行パージングが主パージングよりも下限値以上先行していなければ、主パージング部12に割り当てられていたCPU資源の一部を先行パージング部11に割り当てる決定を下す。CPU配分決定部151は、先行パージングが主パージングよりも上限値以上先行していれば、先行パージング部11に割り当てられていたCPU資源の一部を主パージング部12に割り当てる決定を下す。
CPU配分制御部152は、CPU配分決定部151で決定された配分量に基づいて、各論理CPUを、各パージング部(11、12)に配分する。
また、CPU配分制御部152は、主パージング部12により、並列処理のために論理CPUの追加を要求された時、主パージング実行論理CPU群14に、論理CPUを追加する。
主パージング部12が、追加された論理CPUを使用して、要素の構文解析を終了したとき、CPU配分制御部152は、割り当てた論理CPUを解放する。
出力部16は、XMLツリー161を、レンダリングエンジンなどに出力する。
図6を参照して、XMLテキスト101から、XMLツリー161への変換手順について詳細に説明する。図6(a)は、XMLテキスト101の一部である。図6(b)は、図6(a)のテキストに対応するXMLツリー161の一部である。同図(a)に示すように、XMLテキスト101は、ある「要素」における「要素の内容」の中に、文字データや、別の「要素」が格納されており、「要素」が入れ子構造になっている。
内部表現生成部124は、この部分で最初に出現した「開始タグ」の属性名を示すノードを作成する。
例えば、図6(a)において、最初に出現する開始タグが「<CC p=”fоо”>」であれば、図6(b)に示すように、このタグの属性名を示すノード「CC」が作成される。「p=”fоо”」の属性は、このノード「CC」内のデータフィールドの1つに格納される。
内部表現生成部124は、開始タグに対応するノードを親ノードとして、開始タグ以降の「要素の内容」を示すノードを、その親ノードの子ノードとして生成する。
例えば、図6(a)において、開始タグ「<CC p=”fоо”>」以降の「要素の内容」が、「text fоr CC」の文字データと、要素「DD」と、「text2 fоr CC」の文字データである。この場合、図6(b)に示すように、まず、親ノードとしてノード「CC」が作成され、その子ノードとして、各文字データに対応するノードと、ノード「DD」とが作成される。
図7を参照して、本実施形態の構文解析装置1の動作について説明する。同図は、構文解析装置1の動作の一例を示すシーケンス図である。同図を参照すると、先行パージング部11は先行パージングを開始し(ステップT10)、先行パージング進捗情報114を作成する(ステップT11)。
先行パージングと並行して、主パージング部12は主パージングを開始し(ステップT20)、主パージング進捗情報125を作成する(ステップT21)。主パージングにおいては、図7で後述する要素構文解析処理が実行される。
進度調整部15は、先行パージング進捗情報114および主パージング進捗情報125を取得し、それらの情報の示す各パージングの進度の差が、所定の範囲内であるか否かを判断する(ステップT30)。
進度の差が範囲内でなければ(ステップT30:NO)、CPU配分決定部151は、差が範囲内となるように、各パージング部へのCPU資源量の割り当てを決定する(ステップT31)。CPU配分制御部152は、CPU配分決定部151で決定された配分量に基づいて、各論理CPUを、各パージング部に配分する(ステップT32)。
図8〜図10を参照して、主パージング部12の動作について説明する。図8は、主パージング部12の実行する要素構文解析処理を示すフローチャートである。この要素構文解析処理は、XMLテキスト101が入力されたときから、XMLテキスト101の全ての構文解析が終了するまでの間、要素ごとに繰り返し実行される。
図8を参照すると、親論理CPUが実行する構文解析部121は、XMLテキスト101のうち、解析されていない部分の先頭の文字を解析し、その文字に続く文字列が開始タグであるか否かを判断する(ステップU1)。
開始タグであれば(ステップU1:YES)、構文解析部121は、その開始タグの構文解析を行う(ステップU2)。
構文解析部121は、粒度推定部122を呼び出して、ステップU2で解析した開始タグの位置を引数として与える。粒度推定部122は、後述する粒度推定処理を実行し、粒度を返す。先行解析表1131に、ステップU2で解析した開始タグの位置が登録されていなければ、粒度推定部122は、粒度が不明である旨を返す(ステップU3)。
構文解析部121は、粒度が不明でなく、且つ、粒度が所定の閾値以上であるか否かを判断する(ステップU4)。
粒度が不明でなく、所定の閾値以上であれば(ステップU4:YES)、構文解析部121は、並列化部123を呼び出す。並列化部123は、主パージング実行論理CPU群14に、未使用の論理CPU(子論理CPU)を追加する。追加された子論理CPUは、粒度が閾値以上の要素における「要素の内容」の構文解析を開始する(ステップU5)。
粒度が不明、または所定の閾値に達していなければ(ステップU4:NO)、構文解析部121は、「要素の内容」を構文解析する(ステップU6)。
ステップT5またはT6の後、構文解析部121は、「終了タグ」を構文解析し、内部表現生成部124を呼び出す。内部表現生成部124は、構文解析の結果に基づいて、XMLツリー161を生成する(ステップU7)。
先頭の文字が開始タグでなければ(ステップU1:NO)、構文解析部121は、例外処理を行う(ステップU8)。ステップU7、またはU8の後、主パージング部12は、要素構文解析処理を終了する。
図9は、粒度推定処理を示すフローチャートである。粒度推定部122は、まず、先行解析表1131を参照し、引数に一致する開始タグの位置を検索する(ステップU31)。粒度推定部122は、開始タグの位置が登録されているか否かを判断する(ステップU32)。
開始タグの位置が登録されていれば(ステップU32:YES)、粒度推定部122は、開始タグの位置と、対応する終了タグの位置との差である粒度を算出して返す(ステップU33)。開始タグの位置が登録されていなければ(ステップU32:NO)、粒度推定部122は、粒度が不明である旨を返す(ステップU34)。ステップU33、またはU34の後、粒度推定部122は、粒度推定処理を終了する。
図10は、例外処理を示すフローチャートである。同図を参照すると、構文解析部121は、要素が空き要素タグであるか否かを判断する(ステップU81)。空き要素タグであれば(ステップU81:YES)、構文解析部121は、空き要素タグを構文解析する(ステップU82)。空き要素タグでなければ(ステップU81:NO)、構文解析部121は、構文エラーを出力する(ステップU83)。
図11は、主パージング部12の動作結果の一例を示すシーケンス図である。論理CPU141が構文解析部121を呼び出して、要素構文解析処理のステップU3までを実行する。
構文解析部121は、ステップU4において、粒度が所定の閾値以上であれば(ステップU4:YES)、論理CPU142を追加する(ステップU5)。
論理CPU141が実行する構文解析部121は、「終了タグ」を構文解析する(ステップU6)。このステップT6と並行して、論理CPU142が構文解析部121を呼び出し、割り当てられた要素のうち、解析した文字列が開始タグであるか否かを判断する(ステップUU1)。
続いて、図12〜図22を参照して、構文解析装置1aの動作結果の一例について説明する。
図12(a)は、XMLテキスト101におけるパージングの進度を示す図である。同図(b)は、同図(a)の時点におけるタグ一時記憶部112を示す図である。同図(c)は、同図(a)の時点における先行解析表1131を示す図である。同図(d)は、同図(a)の時点におけるXMLツリー161を示す図である。
図12(a)を参照すると、先行パージング部11は、先頭文字を0文字目として、20文字目の位置(1011)まで解析を進めている。一方、主パージング部12は、5文字目の位置(1012)まで解析を進めている。
図12(b)に示すように、この時点では、タグ一時記憶部112に、「AA」、「BB」の開始タグの位置情報が格納されている。
図12(c)に示すように、この時点では、終了タグが出現していないので、先行解析表1131には、開始タグ、終了タグの各位置は1つも記載されていない。
構文解析部121は、開始タグ「<BB>」が出現したとき、その位置「5」を引数として粒度推定部122を呼び出す。しかし、図13(c)に示したように先行解析表1131は空であるから、粒度推定部122は、サイズが不明である旨を返す。そこで、構文解析部121は、開始タグ「<BB>」以降の部分を並列化せず、そのまま逐次的に構文解析を継続する。
図12(d)に示すように、この時点では、主パージング部12は、開始タグ「<AA>」の解析結果に基づいて、ノード「AA」を作成している。
図13(a)は、図12(a)以降のパージングの進度を示す図である。図13(b)は、同図(a)の時点におけるタグ一時記憶部112を示す図である。図13(c)は、同図(a)の時点における先行解析表1131を示す図である。図13(d)は、同図(a)の時点におけるXMLツリー161を示す図である。
図13(a)を参照すると、先行パージング部11は、108文字目の位置(1013)まで解析を進めており、一方、主パージング部12は、28文字目の位置(1014)まで解析を進めている。
図13(b)に示すように、この時点では、図13(a)の時点以降、タグ一時記憶部112に「<DD>」、「<CC p=”fоо”>」の位置情報が更に格納され、「<BB>」、「<DD>」、「<CC p=”fоо”>」の位置情報が、この順に取り出されている。
図13(c)に示すように、この時点では、取り出された「<BB>」、「<DD>」、「<CC p=”fоо”>」の開始タグの位置と、これらに対応する終了タグの位置とが先行解析表1131に追加されている。
構文解析部121は、要素「AA」の内容として開始タグ「<BB>」、および「text fоr BB」を構文解析する。このため、図13(d)に示すように、ノード「AA」の子ノードとして、ノード「BB」(1611)が追加され、ノード「BB」の子ノードとしてノード「text fоr BB」(1612)が追加される。
続いて、「<CC p=”fоо”>」の開始タグが出現したとき、構文解析部121は、粒度推定部122に、その開始タグの位置「28」を引数として与える。粒度推定部122は、その引数と一致する開始タグの位置と、これに対応する終了タグの位置「94」との差「66」を粒度として返す。粒度が事前に定めた閾値(例えば、「50」)を超えるので、構文解析部121は、「<CC p=”fоо”>」直後から「</CC>」直前までの部分を並列処理すべき部分と判断する。図13(a)において一点鎖線で囲まれた部分は、この並列処理の対象となる部分(1015)である。
並列化部123は、進度調整部15を呼び出して、論理CPUを追加させる。追加された論理CPU(子論理CPU)は、構文解析部121を呼び出し、図13(a)において一点鎖線で囲まれた部分を構文解析する。
一方、構文解析部121をこれまで実行していた論理CPU(親論理CPU)は、「</CC>」の直後から、構文解析を続行する。
ここで、子論理CPUが構文解析する部分(1015)は、XML文法において「要素」(「<AA>」〜「</AA>」)を構成する「要素の内容」に相当する。このため、図13(d)に示すように、子論理CPUが作成するXMLツリー(1611)は、親論理CPUが作成するノード「CC」の子ノードとなるように、構文解析部121は、内部表現生成部124に対し、ツリーノードの親ノードの情報を渡す。
例えば、ノードに対応する構造体とノード間のエッジに対応する構造体間リンクポインタによってツリーデータを形成する実装方法を用いる。この方法では、子論理CPUが作成するXMLツリーのルートノードにある「親ノードへのリンクポインタ」欄に、親論理CPUが作成するノードCCへのポインタ値が設定され、親論理CPUが作成するノードCCにある「子ノードへのリンクポインタのリスト」の末尾に、子論理CPUが作成するXMLツリーのルートノードへのポインタ値が追加される。このようにして、ノード間の親子関係が実現される。
図14(a)は、図13(a)以降のパージングの進度を示す図である。同図(b)は、同図(a)の時点におけるタグ一時記憶部112を示す図である。同図(c)は、同図(a)の時点における先行解析表1131を示す図である。同図(d)は、同図(a)の時点におけるXMLツリー161を示す図である。
図14(a)を参照すると、先行パージング部11は、153文字目の位置(1016)まで字句解析を進めている。親論理CPUが、93文字目の位置(1017)まで構文解析を進める一方、子論理CPUが、40文字目の位置(1018)まで構文解析を進めている。
図14(b)に示すように、この時点では、図13(a)の時点以降、タグ一時記憶部112に「<EE p=”bar”>」の開始タグの位置情報が追加され、「<FF>」の開始タグの位置情報が取り出されている。
図14(c)に示すように、この時点では、取り出された「<FF>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に追加されている。同図(c)における斜線部分は、追記された部分である。
図14(d)に示すように、この時点で、親論理CPUが実行する構文解析部121は、開始タグ「<CC p=”fоо”>」の解析を終了している。このため、XMLツリー161において、ノード「CC」(1613)が追加される。
図15(a)は、図14(a)以降のパージングの進度を示す図である。図15(b)は、同図(a)の時点におけるタグ一時記憶部112を示す図である。図15(c)は、同図(a)の時点における先行解析表1131を示す図である。図16は、図15(a)の時点におけるXMLツリー161を示す図である。
図15(a)を参照すると、先行パージング部11は、170文字目の位置(1019)まで字句解析を進めている。親論理CPUが、108文字目の位置(1020)まで構文解析を進める一方、子論理CPUが、88文字目の位置(1021)まで構文解析を進めている。
図15(b)に示すように、この時点では、図14(a)の時点以降、タグ一時記憶部112から「<EE p=”bar”>」の開始タグの位置情報が取り出され、「<GG>」の開始タグの位置情報が追加されている。
図15(c)に示すように、この時点では、取り出された「<EE p=”bar”>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に追加されている。同図(c)における斜線部分は、追記された部分である。
この時点で、親論理CPUが実行する構文解析部121は、要素「AA」の内容として、「text fоr AA1」を解析している。このため、図16に示すように、ノード「AA」の子ノードとして、ノード「text fоr AA1」(1614)が追加される。
子論理CPUが実行する構文解析部121は、並行して、要素「CC」の内容を構文解析し、開始タグ「<DD>」に遭遇する。この開始タグの位置と、対応する終了タグの位置とは、先行解析表1131において、それぞれ、「53」、「75」であるから、粒度は「22」である。粒度が閾値以下なので、構文解析部121は、並列処理はしないで「</CC>」直前まで解析を進める。
この結果、図16に示すように、ノード「CC」のサブツリー(1615)が形成される。構文解析部121は、要素「CC」の内容の解析が終了したとき、進度調整部15を呼び出して、子論理CPUを解放する。
図17(a)は、図15(a)以降のパージングの進度を示す図である。図17(b)は、同図(a)の時点におけるタグ一時記憶部112を示す図である。図17(c)は、同図(a)の時点における先行解析表1131を示す図である。図18は、図17(a)の時点におけるXMLツリー161を示す図である。
図17(a)を参照すると、先行パージング部11は、194文字目の位置(1022)まで字句解析を進めている。一方、主パージング部12は、160文字目の位置(1023)まで構文解析を進めている。
図17(b)に示すように、この時点では、図15(a)の時点以降、タグ一時記憶部112に「<HH>」の位置情報が格納され、その「<HH>」の位置情報が取り出されている。
図17(c)に示すように、この時点では、取り出された「<HH>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に追加されている。同図(c)における斜線部分は、追記された部分である。
構文解析部121は、「</CC>」の直後から、構文解析を進め、開始タグ「<EE p=”bar”>」に遭遇する。この開始タグの位置と、対応する終了タグの位置とは、先行解析表1131において、それぞれ、「108」、「160」であるから、粒度は「52」である。粒度が閾値(50)を超えているので、構文解析部121は、この開始タグ以降の要素を並列処理する。図18(a)において一点鎖線で囲まれた部分は、この並列処理の対象となる部分である。
並列化部123は、進度調整部15を呼び出して、子論理CPUを追加させる。子論理CPUは構文解析部121を呼び出し、図18(a)において一点鎖線で囲まれた部分の先頭から、構文解析を行う。
一方、これまで構文解析部121を実行してきたCPU(親論理CPU)は、開始タグ「<EE p=”bar”>」を解析後、「</EE>」の直後から、構文解析を続行する。この結果、図18に示すように、ノード「AA」の子ノード「EE」(1616)が作成される。同図において、一点鎖線で囲まれた部分が、子論理CPUが解析する対象の部分である。
図19(a)は、図17(a)以降のパージングの進度を示す図である。図19(b)は、同図(a)の時点におけるタグ一時記憶部112を示す図である。図19(c)は、同図(a)の時点における先行解析表1131を示す図である。図20は、図19(a)の時点におけるXMLツリー161を示す図である。
図19(a)を参照すると、先行パージング部11は、XMLテキスト101の最後の文字の位置(1025)まで字句解析を進めて、先行パージングを終了している。親論理CPUは、178文字目の位置(1026)まで構文解析を進める一方、子論理CPUは、154文字目の位置(1027)まで構文解析を進めている。
図19(b)に示すように、この時点では、図17(a)の時点以降、タグ一時記憶部112から「<GG>」、「<AA>」の位置情報が、この順に取り出されている。
図19(c)に示すように、この時点では、取り出された「<GG>」、「<AA>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に追加されている。同図(c)における斜線部分は、追記された部分である。この結果、先行解析表1131には、全ての解析結果が記載されたこととなる。
構文解析部121は、親論理CPUを使用して、要素「GG」の内容として「text fоr GG1」を解析する。この結果、図20に示すように、ノード「GG」を含むサブツリー(1617)が形成される。
親論理CPUが実行する構文解析部121は、「<HH>」の開始タグを見つける。この開始タグの位置と、対応する終了タグの位置とは、先行解析表1131において、それぞれ、「178」、「188」であるから、粒度は「10」である。粒度が閾値以下なので、構文解析部121は、子論理CPUを追加しないで、この開始タグ以降の構文解析を進める。
また、子論理CPUが実行する構文解析部121は、要素「EE」の内容を構文解析する。この結果、図20に示すように、ノード「EE」を含むサブツリー(1618)が形成される。要素「EE」の構文解析後、子論理CPUは解放される。
図21は、図19(a)以降のパージングの進度を示す図である。図22は、図21の時点におけるXMLツリー161を示す図である。
図21を参照すると、主パージング部12は、XMLテキスト101の最後の文字の位置(1028)まで解析を進めて、主パージングを終了している。この結果、図22に示すように、解析された部分に対応するサブツリー(1619)が形成される。
なお、本実施形態では、進度調整部15は、論理CPUを割り当てているが、論理CPUの代わりに、コンピュータシステムが有する複数CPUを構成する場合における各物理CPUを割り当ててもよいし、タスクやスレッドを割り当ててもよい。
本実施形態では、主パージング部12は、粒度が閾値以上であれば、再帰回数に関わりなく並列処理を行う構成としているが、粒度が閾値以上であっても、再帰回数が所定の上限値以上であれば、並列処理を行わない構成とすることもできる。この構成によれば、再帰回数が多くなることを防ぐことができる。
また、主パージング部12は、粒度が閾値以上であっても、未使用のリソース量が所定の下限値以下であれば、並列処理を行わない構成とすることもできる。この構成によれば、並列化によるリソースの不足を防止できる。
本実施形態では、先行パージング、主パージングのそれぞれの進捗を監視し、リソースの配分を決定する進度調整部15を設けて、各パージングの進度を調整する構成としている。しかし、構文解析装置1は、進度調整部15を設けない構成とすることもできる。この場合、構文解析装置1を仮想的に内部に構成する装置におけるオペレーティングシステムや仮想化ソフトウェアが提供する仮想CPUの割り当て機能に、各パージングの進度の調整を行わせる構成とする。
構文解析装置1において、進度調整部15を用いない実装は、XMLパージング処理全体の複雑さを軽減し、実装規模を小さくできるメリットがある。他方、本実施形態のように進度調整部15を導入することで、コンピュータシステム内の限られたCPU資源を両パージング処理で効率的に利用し、全体的なXMLパージング処理性能を向上させることが期待できる。すなわち、構文解析装置1内に進度調整部15を導入するか否かは、実装の複雑さと処理性能のトレードオフの上で判断されるべきものである。
本実施形態では、先行パージング部11が本発明のタグ位置取得手段に相当し、主パージング部12が本発明の並列解析手段に相当する。先行パージング実行論理CPU13および主パージング実行論理CPU群14が本発明のリソースに相当する。
以上説明したように、本実施形態によれば、構文解析装置は、テキストを字句解析してタグの位置を取得し、並行して、タグで区切られたそれぞれの部分を並列に構文解析し、字句解析と構文解析とに割り当てるリソース量を調整する。構文解析装置は、タグ位置に基づいて並列解析するので、文法に関わらずに並列解析でき、スループットが向上する。また、構文解析装置は、字句解析、構文解析を並行して行い、字句解析において各部分の解析結果を突き合わせる必要がないので、レイテンシが小さくなる。
また、構文解析装置は、パージングを複数のCPUで分担して行うことができるため、同じ要求性能であれば、シングルCPUの方式よりも低い動作周波数(クロック)のCPUでパージングを実行することができる。このため、動作時および待機時のCPUの消費電力を低減し、システム全体を省電力化できる。
(第2の実施形態)
本発明の第2の実施形態について、図23〜図30を参照して説明する。本実施形態は、並列処理により、先行パージングを高速に行う点で第1の実施形態と異なる。図23は、本実施形態の構文解析装置1aの一構成例を示すブロック図である。構文解析装置1aは、先行パージング部11、先行パージング実行論理CPU13の代わりに先行パージング部11a、先行パージング実行論理CPU群13aを設ける点以外は、第1の実施形態の構文解析装置1の構成と同様である。
先行パージング実行論理CPU群13aは、字句解析を行う複数の論理CPUを有する。図24は、本実施形態の先行パージング部11aの一構成例を示すブロック図である。先行パージング部11aの構成は、字句解析部111の代わりに、主字句解析部1111、および副字句解析部1112を設け、タグ一時記憶部112の代わりに、主タグ一時記憶部1121、および副タグ一時記憶部1122を設ける点で、第2の実施形態の先行パージング部11と異なる。
進度調整部15は、それぞれ、先行パージング実行論理CPU群13aに含まれる複数の論理CPUを主字句解析部1111および副字句解析部1112のそれぞれに割り当てる。進度調整部15は、主字句解析部1111、副字句解析部1112が、XMLテキスト101の最後の文字まで字句解析を終了した場合は、それぞれに割り当てた論理CPUを解放する。
主字句解析部1111は、XMLテキスト101の先頭から、字句解析を開始し、副字句解析部1112は、XMLテキスト101の中間の位置から、字句解析を開始する。主字句解析部1111は、主タグ一時記憶部1121に、開始タグの位置情報を一時保存し、副字句解析部1112は、副タグ一時記憶部1122に、開始タグの位置情報を一時保存する。
主タグ一時記憶部1121、副タグ一時記憶部1122は、タグ一時記憶部112と同様に後入れ先出し方式で位置情報を記憶する。
主タグ一時記憶部1121の動作は、開始タグが出現したときの動作以外は、図3に示した、第1の実施形態の状態遷移図と同様である。
主字句解析部1111は、開始タグを見つけるたびに、すなわち、状態S2において「x」を字句解析するたびに、先行解析表1131を参照し、その開始タグの位置が記録されているか否かを調べる。記録されていれば、主字句解析部1111は、その開始タグに対応する終了タグの位置まで、XMLテキスト101を読み飛ばし、その終了タグの直後から字句解析を続行する。
副字句解析部1112の動作は、以下の2点以外は、図3に示した、第1の実施形態の状態遷移図と同様である。
1つ目の違いは、字句解析の開始時の動作の違いである。副字句解析部1112は、字句解析の開始時に、「>」を見つけるまでXMLテキスト101を読み飛ばし、次に、「s」が1つ以上続いていれば、それらを読み飛ばす。そして、副字句解析部1112は、最後に見つけた「<」の位置から字句解析を開始する。この動作により、図3における「S1」相当の地点から、XMLテキスト101の解析を開始できる。
2つ目の違いは、終了タグを見つけたときの動作の違いである。終了タグを見つけたとき、すなわち、状態S3またはS5において、「<」を字句解析したとき、副字句解析部1112は、開始タグの位置情報が1以上記憶されているか否かを、自らに付属している副タグ一時記憶部1122に問い合わせる。
副タグ一時記憶部1122に位置情報が全く記載されていない場合、副字句解析部1112は、見つけた終了タグを単に読み飛ばし、タグ対応登録部113にタグの位置の組を登録しない。この場合、副字句解析部1112は、その終了タグの直後から字句解析を再開する。
副タグ一時記憶部1122に位置情報が記載されている場合、副字句解析部1112は、その位置情報を取り出し、開始タグ、終了タグの位置の組をタグ対応登録部113に登録する。
図25(a)は、先行パージングの進度を示す図である。同図(b)は、同図(a)の時点における主タグ一時記憶部1121を示す図である。同図(c)は、同図(a)の時点における副タグ一時記憶部1122を示す図である。同図(d)は、同図(a)の時点における先行解析表1131を示す図である。
図25(a)に示すように、主字句解析部1111は、XMLテキスト101の先頭の文字(1050)から字句解析を開始する。副字句解析部1112は、先頭文字を0文字目として、XMLテキスト101のほぼ中央にあたる112文字目(1051)から、処理を開始する。副字句解析部1112は、上述の読み飛ばし処理を行い、132文字目(1052)から字句解析を開始する。
この読み飛ばしにより、副字句解析部1112内の有限状態機械は、XMLテキストの途中から読み込み始めたにも関わらず、第1の実施形態と同様の字句解析(S1〜S8)を行うことができる。
図25(b)、図25(c)に示すように、この時点では、主タグ一時記憶部1121、副タグ一時記憶部1122には、位置情報が1つも格納されていない。
図25(d)に示すように、この時点では、位置情報が取り出されていないので、先行解析表1131には、開始タグ、終了タグの位置は1つも格納されていない。
図26(a)は、先行パージングの進度を示す図である。同図(b)は、同図(a)の時点における主タグ一時記憶部1121を示す図である。同図(c)は、同図(a)の時点における副タグ一時記憶部1122を示す図である。同図(d)は、同図(a)の時点における先行解析表1131を示す図である。
図26(a)を参照すると、主字句解析部1111は、41文字目(1053)まで字句解析を進めている。一方、副字句解析部1112は、153文字目(1054)まで字句解析を進めている。
主字句解析部1111は、開始タグ「<AA>」、「<BB>」、「<CC p=”fоо”>」が見つけているが、これらの位置情報は、先行解析表1131に記載がないので、字句解析部1111は字句解析を続行する。
図26(b)に示すように、この時点では、主字句記憶部1121には、「<AA>」、「<BB>」、「<CC p=”fоо”>」の位置情報が格納され、「<BB>」の位置情報が取り出されている。
図26(c)に示すように、この時点では、副字句記憶部1122には、「<FF>」の位置情報が格納され、その「<FF>」の位置情報が取り出されている。
図26(d)に示すように、この時点では、取り出された「<BB>」、「<FF>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に記載されている。
図27(a)は、先行パージングの進度を示す図である。同図(b)は、同図(a)の時点における副タグ一時記憶部1122を示す図である。
図27(a)を参照すると、図26(a)の時点以降、主字句解析部1111は、46文字目(1055)まで字句解析を進めている。
一方、副字句解析部1112は、終了タグ「</EE>」を見つけているが、この時点で、図27(b)に示すように、副タグ一時記憶部1122には、開始タグの位置情報が存在しない。これは、副字句解析部1112が、「<EE>」より進んだ位置から解析を開始したためである。副字句解析部1112は、その終了タグを飛ばし、その直後(1056)から字句解析を続行する。
図28(a)は、先行パージングの進度を示す図である。同図(b)は、同図(a)の時点における主タグ一時記憶部1121を示す図である。同図(c)は、同図(a)の時点における副タグ一時記憶部1122を示す図である。同図(d)は、同図(a)の時点における先行解析表1131を示す図である。
図28(a)を参照すると、図27(a)の時点以降、主字句解析部1111は、108文字目(1057)まで字句解析を進めている。一方、副字句解析部1112は、XMLテキストの最後の文字(1058)まで字句解析を進めている。この時点で、副字句解析部1112に割り当てられた論理CPUは、解放される。
図28(b)に示すように、この時点では、主字句記憶部1121には、「<DD>」の位置情報が格納され、「<DD>」、「<CC p=”fоо”>」の位置情報が、この順に取り出されている。
図28(c)に示すように、この時点では、図27(a)の時点以降、副字句記憶部1122には、「<GG>」、「<HH>」の位置情報が格納され、「<HH>」、「<GG>」の位置情報が、この順に取り出されている。
図28(d)に示すように、この時点では、図27(a)の時点以降、取り出された「<DD>」、「<CC p=”fоо”>」、 「<HH>」、および「<GG>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に追加されている。同図(d)における斜線部分は、追記された部分である。
図29(a)は、先行パージングの進度を示す図である。同図(b)は、同図(a)の時点における主タグ一時記憶部1121を示す図である。同図(c)は、同図(a)の時点における先行解析表1131を示す図である。
図29(a)を参照すると、主字句解析部1111は、図28(a)の時点以降、132文字目(1059)まで字句解析を進め、開始タグ「<FF>」を見つける。この開始タグの位置「132」は、図29(c)に示すように、先行解析表1131に記載されている。このため、主字句解析部1111は、この開始タグと対応する終了タグ「</FF>」の位置(1060)、すなわち153文字目までテキストを読み飛ばし、その直後から字句解析を再開する。
図30(a)は、先行パージングの進度を示す図である。同図(b)は、同図(a)の時点における主タグ一時記憶部1121を示す図である。同図(c)は、同図(a)の時点における先行解析表1131を示す図である。
図30(a)を参照すると、図29(a)の時点以降、主字句解析部1111は、160文字目(1061)まで字句解析を進め、その直後(1062)に、開始タグ「<GG>」を見つける。この開始タグの位置「160」は、図30(c)に示す先行解析表1131に記載済みなので、主字句解析部1111は、この開始タグと対応する終了タグ「</GG>」の位置(1063)、すなわち206文字目までテキストを読み飛ばし、その直後から字句解析を再開する。
図30(b)に示すように、この時点では、図29(a)の時点以降、主字句記憶部1121から、「<EE>」の位置情報が取り出されている。
図30(c)に示すように、この時点では、図29(a)の時点以降、取り出された「<EE>」の開始タグの位置と、対応する終了タグの位置とが先行解析表1131に記載されている。図30(c)における斜線部分は、追記された部分である。
以降は、主字句解析部1111は、字句解析を最後の文字まで進め、「<AA>」の位置と、対応する終了タグの位置とを先行解析表1131に記載して、先行パージングが完了する。
なお、本実施形態では、副字句解析部1112を1つだけ設ける構成としているが、副字句解析部を複数設ける構成としてもよい。この場合、先行パージング実行論理CPU群13b内の論理CPUの総数をn個、各論理CPUに割り当てられた番号をmとする。ここで、mは、1、2、・・・nー1の自然数である。各副字句解析部は、XMLテキスト101を、m対n−mに内分する位置から、処理を開始する。
例えば、副字句解析部を1つだけ設ける場合、n=2、m=1であるから、副字句解析部は、XMLテキスト101のちょうど中間地点から処理を開始する。m対n−mの内分が整数にならない場合は、適宜整数に丸める。
本実施形態では、主字句解析部1111が本発明の主字句解析手段に相当し、副字句解析部1112が本発明の副字句解析手段に相当する。主タグ一時記憶部1121が主タグ一時記憶部1121に相当し、副タグ一時記憶部1122が副タグ一時記憶部1122に相当する。タグ対応登録部113が本発明の記憶手段に相当する。
以上説明したように、本実施形態によれば、主字句解析手段、副字句解析手段が並列に字句解析するので、XMLテキスト101のテキストの行の長さや、タグごとの行数に左右されずに、先行パージングにおいて並列処理を行うことができる。このため、XMLパージング全体の処理性能が一層向上する。
主字句解析手段は、開始タグを見つけたとき、その開始タグの位置が、記憶手段に記録されていれば、対応する終了タグの位置までスキップする。このため、副字句解析手段が既に解析した部分を字句解析しなくて済み、主字句解析手段は、字句解析を効率的に行うことができる。
また、副字句解析手段は、XMLテキスト101を内分した位置から、タグの末尾文字「>」が出現するまで、テキストをスキップし、最後に見つけたタグの先頭文字「<」の位置から字句解析を開始する。このため、副字句解析手段は、テキストの途中から字句解析する場合であっても、図3における初期状態「S1」から、正しい字句解析処理を開始することができる。
さらに、副字句解析手段は、終了タグを見つけたときに、副タグ一時記憶部に開始タグの位置情報が1つも格納されていなければ、その終了タグをスキップする。このため、要素の途中から字句解析を開始し、対応する開始タグのない終了タグが出現した場合でも、副字句解析手段は、不要な字句解析を行う必要がなくなり、効率的に字句解析できる。
(第3の実施形態)
本発明の第3の実施形態について、図31を参照して説明する。本実施形態は、XMLパーザプログラムに本発明を適用した点で第1の実施形態と異なる。
図31は、本実施形態の構文解析装置1bの一構成例を示すブロック図である。同図を参照すると、構文解析装置1bの構成は、先行パージング部11、主パージング部12c、進度調整部15の代わりにXMLパーザプログラム20を設け、コンピュータシステム21を更に設けた以外は、第1の実施形態の構文解析装置1と同様の構成である。
XMLパーザプログラム20は、コンピュータシステム21上で動作するコンピュータプログラムであり、先行パージング手続き11b、主パージング手続き12b、および速度調整手続き15bを有する。
先行パージング手続き11b、主パージング手続き12b、および速度調整手続き15bは、コンピュータシステム21上で、それぞれ、先行パージング部11、主パージング部12、および速度調整部15の動作を実現する手続きである。
コンピュータシステム21は、オペレーティングシステム211、マルチコアCPU212、およびメモリ213を有する。
マルチコアCPU212は、複数のCPUコアを内蔵する処理装置である。メモリ213は、主記憶装置として使用される。オペレーティングシステム211は、マルチコアCPU212およびメモリ213を使用して動作し、コンピュータシステム21全体を制御する。
XMLツリー161は、ツリー構造の形で、メモリ213上に生成され、その後、コンピュータシステム21上の別の処理プログラムによって利用される。別の処理プログラムは、例えば、在庫管理プログラムや人事管理プログラムである。
以上説明したように本実施形態によれば、XMLパーザプログラム20はマルチコアCPU212を活かした高速なXML処理を行える。このため、XML形式テキストの入力に関わるオーバヘッドを低減し、もってシステム全体の処理性能向上に寄与することができる。
(第4の実施形態)
本発明の第4の実施形態について、図32を参照して説明する。本実施形態は、Webブラウザに本発明を適用した点で第4の実施形態と異なる。
図32は、本実施形態の構文解析装置1cの一構成例を示すブロック図である。同図を参照すると、構文解析装置1dの構成は、XMLテキスト101の代わりにHTMLテキスト101cが入力され、XMLパーザプログラム20の代わりに、HTMLパーザ部20cを設け、出力部16の代わりにHTMLレンダラ部16c、グラフィックサブシステム22、ディスプレイ装置23を設けた以外は、第4の実施形態の構文解析装置1cと同様の構成である。
HTMLテキスト101dは、HTML形式のテキストファイルである。
HTMLパーザ部20c、およびHTMLレンダラ部16dは、ウェブブラウザプログラムに格納される。
HTMLパーザ部20cは、先行パージング手続き11c、主パージング手続き12c、および速度調整手続き15cを有する。先行パージング手続き11d、主パージング手続き12c、および速度調整手続き15cは、コンピュータシステム21上で、それぞれ、XMLテキスト101の代わりにHTMLテキスト101cを処理し、先行パージング部11、主パージング部12、および速度調整部15の動作を実現する手続きである。
HTMLレンダラ部16cは、HTMLツリー161cを解釈して、HTMLテキストに記述された内容をレンダリング(描画)してグラフィックサブシステム22を介してディスプレイ装置23に出力する。
ディスプレイ装置23は、LCD(Liquid Crystal Display)やCRT(Cathode Rey Tube)などの表示装置である。
以上説明したように、本実施形態によれば、HTMLパーザ部20cはマルチコアCPU212を活かした高速なHTML処理を行えるため、HTMLテキスト解析に要する時間を低減し、描画性能に優れたウェブブラウザを実現できる。