(57)【要約】【課題】ソースプログラムの構文解析で利用する種々の定義を構文解析器の外部から与え、解析対象の構文や解析粒度を容易に変更可能にする。【解決手段】  ソースプログラムからソースプログラムの構造を表す木構造データを生成する計算機であって、構文要素に対応する文字列候補を外部ファイルとして格納する記憶部と、文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行する制御部と、を有する計算機である。【選択図】  図５
2014211729.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムからソースプログラムの構造を表す木構造データを生成する計算機であって、
構文要素に対応する文字列候補を外部ファイルとして格納する記憶部と、
文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行する制御部と、
を有する計算機。
【請求項２】
請求項１に記載の計算機であって、
前記記憶部が、構文要素の読み飛ばし規則を外部ファイルとして更に格納するものであり、
前記制御部が、
前記外部ファイルにアクセスして、前記入力された文字列から構文要素の列を生成する字句解析部と、
前記外部ファイルにアクセスして、前記字句解析部が生成した構文要素の列から構文木を生成する構文解析部と、を有するものである計算機。
【請求項３】
請求項２に記載の計算機であって、
前記構文解析部が、入力された構文要素の列が構文規則に合致する場合、該構文規則に応じた部分木作成及び構文木への追加処理を実行し、入力された構文要素の列が構文規則に合致しない場合、前記構文要素の読み飛ばし規則に基づき構文要素を読み進め、部分木作成と構文木への追加を実行するものである計算機。
【請求項４】
請求項２に記載の計算機であって、
前記記憶部が、前記構文解析部によって生成する構文木の変換条件を定める変換条件を更に外部ファイルとして格納するものであり、
前記制御部が、
前記構文解析部によって生成された構文木について、前記外部ファイルにアクセスし、該構文木が前記変換条件に合致する場合、該変換条件に基づいて構文木を変換する構文木訪問部を更に有する計算機。
【請求項５】
請求項１〜４の何れか一項に記載の計算機であって、
前記計算機が、前記外部ファイルの更新入力を受け付ける入力部を有するものである計算機。
【請求項６】
ソースプログラムからソースプログラムの構造を表す木構造データを生成する計算機に、
構文要素に対応する文字列候補を外部ファイルとして格納する手順と、
文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列について、該文字列候補に対応する構文要素への変換処理を実行する手順と、
を実行させるプログラム。
【請求項７】
請求項６に記載のプログラムであって、
前記記憶部に、構文要素の読み飛ばし規則を外部ファイルとして更に格納する手順を実行させ、
前記変換処理を実行する手順で、
前記外部ファイルにアクセスして、前記入力された文字列から構文要素の列を生成する字句解析手順と、
前記外部ファイルにアクセスして、前記字句解析部が生成した構文要素の列から構文木を生成する構文解析手順と、を実行させるプログラム。
【請求項８】
請求項７に記載のプログラムであって、
前記構文解析手順で、入力された構文要素の列が構文規則に合致する場合、該構文規則に応じた部分木作成及び構文木への追加処理を実行し、入力された構文要素の列が構文規則に合致しない場合、前記構文要素の読み飛ばし規則に基づき構文要素を読み進め、部分木作成と構文木への追加を実行する手順を実行させるプログラム。
【請求項９】
請求項７に記載のプログラムであって、
前記記憶部に、前記構文解析手順によって生成された構文木の変換条件を定める変換条件を更に外部ファイルとして格納する手順と、
前記構文解析手順によって生成された構文木について、前記外部ファイルにアクセスし、該構文木が前記変換条件に合致する場合、該変換条件に基づいて構文木を変換する構文木訪問手順と、を更に実行させるプログラム。
【請求項１０】
請求項７〜９の何れか一項に記載のプログラムであって、
前記計算機の入力装置を介した入力に応じて、前記外部ファイルの更新を行う手順を実行させるプログラム。
【請求項１１】
ソースプログラムからソースプログラムの構造を表す木構造データを生成するデータ生成方法であって、
計算機が、
構文要素に対応する文字列候補を外部ファイルとして記憶部に格納するステップと、
文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行するステップと、
を含むデータ生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機、プログラム及びデータ生成方法に係り、特に、解析対象の構文や解析粒度の変更に対応するための計算機、プログラム及びデータ生成方法に関する。
【背景技術】
【０００２】
一般に、ソースプログラムを解析してプログラムの構造に関する情報を出力する処理系や、ソースプログラムをオブジェクトコードに変換する処理系では、入力された文字列から構文の構造を把握する、字句解析、構文解析のステップを含む。これらを実施するプログラムをそれぞれ、字句解析器、構文解析器と呼ぶ。構文解析の結果は、構文の構造を木構造で表現した構文木として残すことが多い。非特許文献１の１９頁〜３０頁には、字句解析、構文解析及び構文木の例が開示されている。
【０００３】
従来の、字句解析、構文解析の処理の概要を説明する。以降の説明では、ソースプログラムのイメージをＣＯＢＯＬで説明しているが、他のプログラミング言語でも同様である。
図１３に、従来の、字句解析、構文解析の処理の流れを模式的に示す。字句解析器１０７は、ソースプログラム１１２を入力として、ソースプログラム１１２中の文字列を構文要素 (トークン)に分ける。例えば、入力するソースプログラム１１２を図１４の１３００とした場合、図１５の１４００が表すようなトークンの列を生成する。これは、文字列「「Ｍ」「Ｏ」「Ｖ」「Ｅ」」が入力された場合は、「ＭＯＶＥ」で一つのトークンを表す等トークンの定義が、字句解析器１０７に与えられていることから実現できるものである。
【０００４】
構文解析器１０８は、字句解析器１０７が生成したトークンの列１１０を入力として、その言語の組み立て方である構文に従って解析を行い、構文木１１１を生成する。例えば、入力するトークンの列が、図１５の１４００である場合、図１６Ａに示す構文木例１５０１のような構文木を生成する。構文木例１５０１では、「「ＭＯＶＥ」「Ａ」「ＯＦ」「Ｂ」「ＴＯ」「Ｃ」「ＯＦ」「Ｄ」」を「ＳＴＭＴ」ノードで束ね、１つの文であることを表現している。これは、構文解析器１０８内で、トークン列のパターンが「「ＭＯＶＥ」「名前」「ＴＯ」「名前」」である場合、文として認識し「ＳＴＭＴ」ノードで束ねる等、構文の定義及び木構造の定義がされているため実現可能となっている。
【０００５】
プログラミング言語は、言語仕様書などによりその定義が決まっている。その定義に基づき、字句解析器及び構文解析器を作成すれば、言語仕様書の定義に沿ったソースプログラムに対して、解析が可能になる。
【０００６】
バージョンアップ等で言語仕様に変化が生じた場合や独自言語仕様が含まれているソースプログラムを入力する場合には、例え同種のプログラミング言語で記述されたソースプログラムであっても解析することが不可能になることが少なくない。このような場合、これらソースプログラムも解析ができるようにする為に、字句解析器や構文解析器に構文の定義を追加することが行われている。
【０００７】
プログラミング言語の言語仕様は一定である場合でも、解析のニーズにより、必要な構文木の形状が異なる場合がある。例えば、図１４に示すようなソースプログラム例１３００を入力とし構文木を作成する際、文の区別を行うレベルの解析で十分な場合は、図１６Ａの構文木例１５０１のように、文を表すトークン列をフラットな構造として持ち、それをＳＴＭＴノードで束ねた構文木を作成すればよい。
また、ＩＤの区別を行うレベルの解析が必要な場合は、上記ではフラットな構造になっていたトークン列に対して、図１６Ｂの構文木例１５０２のように、ＩＤを表すトークン列をＩＤノードで束ねた構文木が必要になる。更に、ＩＤのＲｅａｄ／Ｗｒｉｔｅの区別を行うレベルの解析が必要な場面では、図１６Ｃの構文木例１５０３のように、上記ＩＤノードにＲｅａｄ／Ｗｒｉｔｅの属性をつけた構文木が必要である。
【０００８】
このような場合、解析のニーズに合わせ、上記構文木を生成する構文解析器を開発する必要がある。一般には、解析結果を利用するアプリケーションの目的に応じて、解析のニーズが決定される。例えば、オブジェクトプログラムの実行性能を重視した最適化コンパイラでは、通常、種々の最適化を実施することから構造の詳細な把握が必要であり、詳細な解析を行う構文解析器を利用する。
【先行技術文献】
【特許文献】
【０００９】
【非特許文献１】佐々政孝、“プログラミング言語処理系 “、岩波書店、１９８９年（特に、１９頁〜３０頁）
【発明の概要】
【発明が解決しようとする課題】
【００１０】
プログラミング言語の仕様や、解析のニーズに合わせ、字句解析器や構文解析器をその都度開発すると、構文解析器の修正箇所を探すために事前知識が必要となることや、解析のニーズ毎に作り直すと工数がかかる等の問題が生ずる。更に、解析器のユーザとしては、解析のニーズに合った構文解析器を入手し直さなければいけないという問題もある。
【課題を解決するための手段】
【００１１】
このような課題を解決する為に、例えば、特許請求の範囲に記載の発明を適用する。即ちソースプログラムからコンピュータが実行可能なデータを生成する計算機であって、構文要素に対応する文字列候補を外部ファイルとして格納する記憶部と、文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行する制御部と、を有する計算機である。
【発明の効果】
【００１２】
本発明の一側面によれば、ソースプログラムの構文解析で利用する種々の定義に柔軟に対応できると共に解析対象の構文や解析粒度の変更に容易に対応可能となる。
本発明の他の課題及び効果は、以下の記載から明らかになる。
【図面の簡単な説明】
【００１３】
【図１】本発明を適用した一実施形態である計算機の処理概要を示す模式図である。
【図２】本実施形態の計算機の構成例を示した模式図である。
【図３】本実施形態のトークン定義の例を示す模式図である。
【図４】本実施形態のトークン読み飛ばし規則の例を示す模式図である。
【図５】本実施形態の計算機における全体処理の流れ示すフロー図である。
【図６】本実施形態におけるカスタマイズしたトークン定義利用を含む字句解析処理の流れを示すフロー図である。
【図７】本実施形態におけるトークン読み飛ばし規則利用を含む基本構文解析処理例の流れを示すフロー図である。
【図８】本実施形態におけるトークン読み飛ばし規則に基づく部分木作成と構文木への追加処理例の流れを示すフロー図である。
【図９】本実施形態におけるトークン読み飛ばし規則に基づく部分木作成と構文木への追加処理で用いるソースプログラムの例を示す模式図である。
【図１０】本実施形態におけるトークン読み飛ばし規則に基づく部分木作成と構文木への追加処理実施後の構文木の例を示す模式図である。
【図１１】本実施形態における構文木訪問器追加処理例の流れを示すフロー図である。
【図１２】本実施形態を適用しない場合に、誤って生成された構文木の例を示す模式図である。
【図１３】従来技術における構文解析処理の概要を示す模式図である。
【図１４】従来技術における構文解析処理で用いるソースプログラムの例を示す図である。
【図１５】従来技術における構文解析処理で用いるトークン列の例を示す図である。
【図１６Ａ】従来技術における構文解析処理実施後の構文木例を示す模式図である。
【図１６Ｂ】従来技術における構文解析処理実施後の構文木例を示す模式図である。
【図１６Ｃ】従来技術における構文解析処理実施後の構文木例を示す模式図である。
【発明を実施するための形態】
【００１４】
以下、図面を用いて本発明を実施するための形態を詳細に説明する。
図１に、本発明を適用した一例である計算機１００での構文解析の概要を模式的に示す。
計算機１００の字句解析器１０７は、ソースプログラム１１２とトークン定義１１３を入力としてトークン列１１０を出力する。図３に示すように、トークン定義１１３は、トークン種別３０１と文字列キーワード３０２から成る。
【００１５】
字句解析器１０７は、入力したソースプログラム中の文字列が、文字列キーワード３０２と合致した場合、その文字列キーワード３０２が属しているトークン種別３０１が示すトークンとして出力する。例えば、図３のトークン定義１１３を利用する場合、ソースプログラム中に「ＭＯＶＥ」という文字列があったならば、これをトークン「ＳＴＭＴ＿ＨＥＡＤ」として出力する。出力されたトークン「ＳＴＭＴ＿ＨＥＡＤ」には、合致した入力文字列が「ＭＯＶＥ」であるという情報も保持するものとする。合致した入力文字列の情報をトークンが保持するのは、本実施形態に関わらず一般的な仮定である。この「ＭＯＶＥ」を、トークン「ＳＴＭＴ＿ＨＥＡＤ」のテキストと呼ぶ。なお、本実施形態において、トークン定義１１３はユーザがカスタマイズ可能である。
【００１６】
構文解析器１０８は、トークン読み飛ばし規則１１４と字句解析器１０７が出力したトークン列１１０を入力として、構文木１１１を出力する。構文解析器１０８は、入力されたトークン列１１０が構文規則に合致する場合、それに応じた部分木作成及び構文木への追加を実行する。入力されたトークン列１１０が構文規則に合致しない場合、トークン読み飛ばし規則１１４に基づき構文要素を読み進め、部分木作成と構文木への追加を実行する。
【００１７】
トークン読み飛ばし規則１１４は、図４に示すように、開始４０１、終了４０２及び終了トークン読み込み４０３を対応付けて構成されている。開始４０１には、読み飛ばし対象の開始トークン又はトークンのテキストが登録される。終了４０２には、読み飛ばし対象の終了トークン又はトークンのテキストが登録される。終了トークン読み込み４０３には、読み飛ばしを行う際、終了４０２に登録されているトークンの手前まで読むのか、終了４０２に登録されているトークンを含めて読むのかを示す情報が登録される。例えば、終了４０２に登録されているトークンを含めて読む場合には、「ＴＲＵＥ」が登録され、終了４０２に登録されているトークンの手前まで読む場合には、「ＦＡＬＳＥ」が登録されるようになっている。なお、トークン読み飛ばし規則１１４は、ユーザがカスタマイズ可能である。
【００１８】
構文木訪問器１０９は、構文解析器１０８が出力した構文木１１１を入力として、構文木の構造の変換を行い、変換後の構文木１１１を出力する。これは、構文解析器１０８が生成した構文木１１１に対して、解析粒度を変更したい場合等に行う処理である。なお、構文木訪問器１０９はユーザがカスタマイズ可能である。
以上が、計算機１００における構文解析の概要説明である。
【００１９】
図２に、計算機１００の構成を模式的に示す。計算機１００は、汎用のサーバ装置等であり、ＣＰＵ１０１、主記憶装置１０４、ＨＤＤやＳＳＤ等から構成される補助記憶としての外部記憶装置１０５、ディスプレイ等の出力装置１０２及びキーボード、マウス並びにタッチパネル等の入力装置１０３を備える。入力装置１０３を介して、ユーザからの構文解析開始命令を受け付け、構文解析結果、構文解析終了メッセージやエラーメッセージが、出力装置１０２に出力されるようになっている。
【００２０】
主記憶装置１０４には、プログラムとＣＰＵ１０１との協働により、解析器１０６及び解析器１０６の解析過程で必要になるトークン列１１０及び構文木１１１が格納される。解析器１０６は、字句解析器１０７、構文解析器１０８及び構文木訪問器１０９から構成される。
【００２１】
外部記憶装置１０５には、ソースプログラム１１２、トークン定義１１３、トークン読み飛ばし規則１１４及び構文木変換条件１１５が格納される。計算機１００では、入力装置１０３等を介して、これらの定義、規則、変換条件の改変や追加が可能になっている。より詳細には、入力された改変や追加部分に関して外部ファイルとして保持し、解析器１０６による処理において、この外部ファイルも参照するようになっている。
【００２２】
なお、本実施形態では入力装置１３０としてキーボートやマウスといったユーザインタフェースを適用する例とするが、本発明はこれに限定されるものではなく、インターネット等のネットワークを介した入力手段や、可搬性の記録媒体を介して外部ファイルへの更新入力を行う等、種々の方式を用いることができる。
【００２３】
次いで、計算機１００の処理の流れを詳細に説明する。
図５に、構文解析処理の全体の流れを示す。
Ｓ５０１で、解析器１０６は、カスタマイズしたトークン定義１１３の利用を含む字句解析を行う。本処理は、解析器１０６内の字句解析器１０７が実施する処理であり、詳細については後述する。
Ｓ５０２で、解析器１０６は、トークン読み飛ばし規則１１４の利用を含む基本構文解析を行う。本処理は、解析器１０６内の構文解析器１０８が実施する処理であり、詳細については後述する。
【００２４】
Ｓ５０３で、解析器１０６は、未処理の構文木訪問器１０９があるか否かを判定し、未処理の構文木訪問器１０９がある場合（Ｓ５０３：Ｙｅｓ）、Ｓ５０４に進む。未処理の構文木訪問器１０９がない場合（Ｓ５０３：Ｎｏ）、本処理を終了する。
Ｓ５０４で、解析器１０６は、構文木訪問と変換処理を行う。本処理は、解析器１０６内の構文木訪問器１０９が実施する処理であり、種々の公知の方法を利用できる。詳細は、例を用いて後述する。
以上が、計算機１００の構文解析の全体処理の流れの説明である。
【００２５】
以降では、上述の構文解析処理（図５）の各ステップの詳細処理を説明する。
まず、図６を用いて、「カスタマイズしたトークン定義利用を含む字句解析（図５のＳ５０１）」の処理について説明する。
【００２６】
Ｓ６０１で、字句解析器１０７は、未処理の文字列があるか否かを判定し、未処理の文字列がある場合（Ｓ６０１：Ｙｅｓ）、Ｓ６０２に進む。未処理の文字列がない場合（Ｓ６０１：Ｎｏ）、本処理を終了する。
Ｓ６０２で、字句解析器１０７は、先頭文字の読み込みとトークンの予測を行う。例えば、先頭文字が英字から始まっている場合と、数値から始まっている場合では、異なるトークンの予測を行う。先頭文字から判断がつかない場合は、複数文字の読み込みを行って判断を行う。本処理については種々の公知の方法を利用できる。
【００２７】
Ｓ６０３で、字句解析器１０７は、トークンのマッチング処理及び消費文字の保存を行う。本処理では、入力された文字列を１文字ずつ読み進め、Ｓ６０２で予測したトークンの規則に合致しているかを調べる。また、読み進めた文字列はＳ６０４の判定で使用するため保存している。
【００２８】
Ｓ６０４で、字句解析器１０７は、マッチしたトークンに変換条件があるか否かを判定し、変換条件がある場合（Ｓ６０４：Ｙｅｓ）、Ｓ６０５に進む。変換条件がない場合（Ｓ６０４：Ｎｏ）、Ｓ６０７に進み、Ｓ６０３でマッチしたトークンを入力文字列のトークンとして決定する。
【００２９】
Ｓ６０５で、字句解析器１０７は、トークン変換条件を満たすか否かを判定する。本実施形態では、Ｓ６０３で保存した文字列が、ユーザが定義したトークン定義１１３の文字列キーワード３０２に含まれることをトークン変換条件としている。トークン変換条件を満たす場合（Ｓ６０５：Ｙｅｓ）、Ｓ６０６に進む。トークン変換条件を満たさない場合（Ｓ６０５：Ｎｏ）、Ｓ６０７に進み、Ｓ６０３でマッチしたトークンを入力文字列のトークンとして決定する。
【００３０】
Ｓ６０６で、字句解析器１０７は、トークン定義１１３に基づくトークンの変換を行う。具体的には、Ｓ６０３で保存した文字列と合致する文字列キーワード３０２が属している、トークン種別３０１が示すトークンへの変換を行う。その後、Ｓ６０７で、本変換後のトークンを入力文字列のトークンとして決定する。
以上の処理を、未処理の文字列がなくなるまで実施する。
【００３１】
ここで、この処理の具体例を示す。入力文字列例として（１）「ＴＥＳＴ」、（２）「ＭＯＶＥ」を用いた場合を夫々説明する。また、前提として、字句解析器１０７内に、英字の文字列は「ＳＴＲＩＮＧ」というトークンにマッチさせる規則があるものとし、「ＳＴＲＩＮＧ」にマッチした後のトークン変換条件として、「トークン定義１１３の文字列キーワード３０２に文字列が含まれるか否か」があるとする。なお、本前提は例を説明するためのものであり、必ずしも本発明の実現に同じ前提が必要であるわけではない。
【００３２】
まず、文字列「ＴＥＳＴ」が入力された場合の処理の流れを説明する。
Ｓ６０１で、字句解析器１０７は、未処理の文字列「ＴＥＳＴ」があるため（Ｓ６０１：Ｙｅｓ）、Ｓ６０２に進む。
Ｓ６０２で、字句解析器１０７は、先頭文字「Ｔ」を読み込み、これは英字であるため、マッチするトークンは「ＳＴＲＩＮＧ」であると判定する。
【００３３】
Ｓ６０３で、字句解析器１０７は、入力された文字列「ＴＥＳＴ」を１文字ずつ読み進め、「ＴＥＳＴ」がトークン「ＳＴＲＩＮＧ」の規則に合致していることを確認する。また、読み進めた文字列「ＴＥＳＴ」を保存しておく。
【００３４】
Ｓ６０４で、字句解析器１０７は、マッチしたトークン「ＳＴＲＩＮＧ」に変換条件があるため（Ｓ６０４：Ｙｅｓ）、Ｓ６０５に進む。
Ｓ６０５で、字句解析器１０７は、トークン変換条件を満たすか否かを判定する。即ち、「ＴＥＳＴ」がトークン定義１１３の文字列キーワード３０２に含まれるか否かを判定する。「ＴＥＳＴ」は、トークン定義１１３の文字列キーワード３０２に含まれないため（Ｓ６０５：Ｎｏ）、Ｓ６０７へ進み、入力文字列「ＴＥＳＴ」のトークンを、「ＳＴＲＩＮＧ」と決定する。
【００３５】
もう一方の例として、文字列「ＭＯＶＥ」が入力された場合の処理の流れを説明する。
Ｓ６０１で、字句解析器１０７は、未処理の文字列「ＭＯＶＥ」があるため（Ｓ６０１：Ｙｅｓ）、Ｓ６０２に進む。
Ｓ６０２で、字句解析器１０７は、先頭文字「Ｍ」を読み込み、これは英字であるため、マッチするトークンは「ＳＴＲＩＮＧ」であると予測する。
【００３６】
Ｓ６０３で、字句解析器１０７は、入力された文字列「ＭＯＶＥ」を１文字ずつ読み進め、「ＭＯＶＥ」がトークン「ＳＴＲＩＮＧ」の規則に合致していることを確認する。また、読み進めた文字列「ＭＯＶＥ」を保存しておく。
Ｓ６０４で、字句解析器１０７は、マッチしたトークン「ＳＴＲＩＮＧ」に変換条件があるため（Ｓ６０４：Ｙｅｓ）、Ｓ６０５に進む。
【００３７】
Ｓ６０５で、字句解析器１０７は、トークン変換条件を満たすか否かを判定する。即ち、「ＭＯＶＥ」がトークン定義１１３の文字列キーワード３０２に含まれるか否かを判定する。「ＭＯＶＥ」は、トークン定義１１３の文字列キーワード３０２に含まれるため（Ｓ６０５：Ｙｅｓ）、Ｓ６０６に進む。
Ｓ６０６で、字句解析器１０７は、トークン定義１１３において「ＭＯＶＥ」が属しているトークン種別３０１は「ＳＴＭＴ＿ＨＥＡＤ」であるため、トークンを「ＳＴＭＴ＿ＨＥＡＤ」に変換する。
Ｓ６０７で、Ｓ６０６で変換後の「ＳＴＭＴ＿ＨＥＡＤ」を入力文字列「ＭＯＶＥ」のトークンとして決定する。
以上が、「カスタマイズしたトークン定義利用を含む字句解析（図５のＳ５０１）」の補足説明である。
【００３８】
次いで、図７を用いて、「トークン読み飛ばし規則利用を含む基本構文解析（図５のＳ５０２）」について説明する。
Ｓ７０１で、構文解析器１０８は、未処理のトークンがあるか否かを判定し、未処理のトークンがある場合（Ｓ７０１：Ｙｅｓ）、Ｓ７０２に進む。未処理のトークンがない場合（Ｓ７０１：Ｎｏ）、本処理を終了する。
【００３９】
Ｓ７０２で、構文解析器１０８は、先頭トークンの読み込みと構文の予測を行う。例えば、先頭トークンが「ＩＦ」の場合、構文は「ＩＦ文」であると予測できる。先頭トークンから判断がつかない場合は、複数トークンの読み込みを行って判断を行う。
Ｓ７０３で、構文解析器１０８は、該当構文があるか否かを判定し、該当構文がある場合（Ｓ７０３：Ｙｅｓ）、Ｓ７０４に進む。該当構文がない場合（Ｓ７０３：Ｎｏ）、Ｓ７０８に進む。
【００４０】
Ｓ７０４で、構文解析器１０８は、入力トークン列が構文規則に合致しているか否かを調べる。これをマッチングと呼ぶ。
Ｓ７０５で、構文解析器１０８は、Ｓ７０４でのマッチングに成功したか否かを判定し、
マッチングに成功した場合（Ｓ７０５：Ｙｅｓ）、Ｓ７０６に進み、マッチした構文の部分木作成と構文木１１１への追加を行う。Ｓ７０６の処理については、種々の公知の方法を利用できる。一方、マッチングに失敗した場合（Ｓ７０５：Ｎｏ）、Ｓ７０７に進む。
【００４１】
Ｓ７０７で、構文解析器１０８は、マッチさせようとしていた先頭トークンまで解析対象の位置を戻す。
Ｓ７０８で、構文解析器１０８は、トークン読み飛ばし規則１１４に基づく部分木作成と構文木１１１への追加を行う。本処理については後述する。
以上の処理を、未処理のトークンがなくなるまで実施する。
【００４２】
図８に、上述の「トークン読み飛ばし規則に基づく部分木作成と構文木への追加（図７のＳ７０８）」の詳細な処理の流れを説明する。
Ｓ８０１で、構文解析器１０８は、先頭トークンのテキストがトークン読み飛ばし規則１１４の開始４０１に登録されているか否かを判定し、開始４０１に登録されている場合（Ｓ８０１：Ｙｅｓ）、Ｓ８０２に進む。開始４０１に登録されていない場合（Ｓ８０１：Ｎｏ）、Ｓ８０３に進む。
【００４３】
Ｓ８０２で、構文解析器１０８は、トークンを読み進め、トークン読み飛ばし規則１１４の終了４０２に登録されているトークンを発見した場合（Ｓ８０２：Ｙｅｓ）、Ｓ８０４に進む。終了４０２に登録されているトークンを発見できなかった場合（Ｓ８０２：Ｎｏ）、Ｓ８０３に進む。
Ｓ８０３で、構文解析器１０８は、トークン読み飛ばし規則１１４のデフォルトの終了４０２に登録されているトークンの手前まで読み進める。なお、Ｓ８０２及びＳ８０３において、トークン読み飛ばし規則１１４の終了４０２に複数のトークンがエントリされている場合、いずれかのトークンを発見できれば良い。
【００４４】
Ｓ８０４で、構文解析器１０８は、トークン読み飛ばし規則１１４の終了トークン読み込み４０３に「ＴＲＵＥ」が登録されているか否かを判定し、終了トークン読み込み４０３に「ＴＲＵＥ」が登録されている場合（Ｓ８０４：Ｙｅｓ）、Ｓ８０５に進む。終了トークン読み込み４０３に「ＦＡＬＳＥ」が登録されている場合（Ｓ８０４：Ｎｏ）、Ｓ８０６に進む。
【００４５】
Ｓ８０５で、構文解析器１０８は、終了トークン（トークン読み飛ばし規則１１４の終了４０２に登録されているトークン）を読み進める。
Ｓ８０６で、構文解析器１０８は、読み進めたトークン列をノードで束ね、構文木１１１に追加する。
以上が、「トークン読み飛ばし規則に基づく部分木作成と構文木への追加（図７のＳ７０８）」の処理の説明である。
【００４６】
ここで、この処理（図５のＳ５０２）の具体例を示す。ソースプログラム１１２の一例である９００（図９）を用いて補足的に説明する。なお、以下の説明では、図５のＳ５０２（図７のＳ７０１からＳ７０８）の処理を全て実施することによって生成される構文木例１０００（図１０）を同時に参照しながら説明する。
【００４７】
また、前提として、図３のトークン定義１１３を利用したＳ５０１（図５）の処理により、英字は、トークン「ＳＴＲＩＮＧ」に、「ＭＯＶＥ」、「ＥＸＥＣ」は、トークン「ＳＴＭＴ＿ＨＥＡＤ」に、「ＥＮＤ−ＥＸＥＣ」はトークン「ＳＴＭＴ＿ＥＮＤ」に変換済とし、構文解析器１０８への入力となるトークン読み飛ばし規則１１４は図４に示すものを用いるものとする。また、トークン「ＳＴＭＴ＿ＨＥＡＤ」から始まる構文の定義は、構文解析器１０８内で事前にはなされていないとする。本前提は例を説明するためのものであり、必ずしも同じ前提が必要であるわけではない。また、以降の説明中の記法で「「Ａ」（Ａ´）」は、Ａ：トークン、Ａ´：トークンのテキストを表す。
【００４８】
構文解析器１０８は、ソースプログラム例９００（図９）のトークン列に対する処理を進め（図７のＳ７０１からＳ７０８までの処理を数回実行し）、構文解析器１０８内で定義された、「文」に対する処理を行う段階に至っているとする。また、構文解析器１０８内に、「「文」に対するトークン列は「ＳＴＭＴ」ノードで束ねる」という規則が定義されているものとする。本前提も例を説明するためのものであり、必ずしも同じ前提が必要であるわけではない。
【００４９】
Ｓ７０１で、構文解析器１０８は、未処理のトークン「ＳＴＭＴ＿ＨＥＡＤ」（ＭＯＶＥ）が存在するため（Ｓ７０１：Ｙｅｓ）、Ｓ７０２に進む。
Ｓ７０２で、構文解析器１０８は、先頭トークン「ＳＴＭＴ＿ＨＥＡＤ」の読み込みと
構文の予測を行う。
Ｓ７０３で、構文解析器１０８は、先頭トークン「ＳＴＭＴ＿ＨＥＡＤ」から始まる構文がないと判断し（Ｓ７０３：Ｎｏ）、Ｓ７０８に進む。
Ｓ７０８で、構文解析器１０８は、トークン読み飛ばし規則１１４に基づく部分木作成と構文木への追加を行う。
【００５０】
上記Ｓ７０８「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例について、図８を参照しながら説明する。
Ｓ８０１で、構文解析器１０８は、先頭トークン「ＳＴＭＴ＿ＨＥＡＤ」のテキスト「ＭＯＶＥ」がトークン読み飛ばし規則１１４の開始４０１に登録されているため（Ｓ８０１：Ｙｅｓ）、Ｓ８０２に進む。
Ｓ８０２で、構文解析器１０８は、トークンを読み進め、トークン読み飛ばし規則１１４の終了４０２に登録されているトークン「ＳＴＭＴ＿ＨＥＡＤ」（ＥＸＥＣ）を発見するため（Ｓ８０２：Ｙｅｓ）、Ｓ８０４に進む。
【００５１】
Ｓ８０４で、構文解析器１０８は、トークン読み飛ばし規則１１４の終了トークン読み込み４０３に「ＦＡＬＳＥ」が登録されているため（Ｓ８０４：Ｎｏ）、Ｓ８０６に進む。
Ｓ８０６で、構文解析器１０８は、読み進めたトークン列「「ＳＴＭＴ＿ＨＥＡＤ（ＭＯＶＥ）」「ＳＴＲＩＮＧ （Ａ）」「ＴＯ」「ＳＴＲＩＮＧ （Ｅ）」」（図１０の１００１）を「ＳＴＭＴ」ノード１００５で束ね、構文木１１１に追加する。
【００５２】
以上が、Ｓ７０８「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例の説明である。Ｓ７０８の処理後は、Ｓ７０１に戻る。ここまでの処理により、ソースプログラム１１２の一例である９００（図９）の「ＥＸＥＣ」の手前までの処理が完了し、図１０の１００２が示す部分木が完成する。
【００５３】
引き続き、図７を用いて「トークン読み飛ばし規則利用を含む基本構文解析（図５のＳ５０２）」の処理例について、図７を参照しながら説明する。
Ｓ７０１で、構文解析器１０８は、未処理のトークン「ＳＴＭＴ＿ＨＥＡＤ」（ＥＸＥＣ）が存在するため（Ｓ７０１：Ｙｅｓ）、Ｓ７０２に進む。
Ｓ７０２で、構文解析器１０８は、先頭トークン「ＳＴＭＴ＿ＨＥＡＤ」の読み込みと
構文の予測を行う。
【００５４】
Ｓ７０３で、構文解析器１０８は、先頭トークン「ＳＴＭＴ＿ＨＥＡＤ」から始まる構文がないと判断し（Ｓ７０３：Ｎｏ）、Ｓ７０８に進む。
Ｓ７０８で、構文解析器１０８は、トークン読み飛ばし規則１１４に基づく部分木作成と構文木１１１への追加を行う。
【００５５】
上記Ｓ７０８「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例について、図８を参照しながら説明する。
Ｓ８０１で、構文解析器１０８は、先頭トークン「ＳＴＭＴ＿ＨＥＡＤ」のテキスト「ＥＸＥＣ」がトークン読み飛ばし規則１１４の開始４０１に登録されているため（Ｓ８０１：Ｙｅｓ）、Ｓ８０２に進む。
【００５６】
Ｓ８０２で、構文解析器１０８は、トークンを読み進め、トークン読み飛ばし規則１１４の終了４０２に登録されている、テキストが「ＥＮＤ−ＥＸＥＣ」であるトークン「ＳＴＭＴ＿ＥＮＤ（ＥＮＤ−ＥＸＥＣ）」を発見するため（Ｓ８０２：Ｙｅｓ）、Ｓ８０４に進む。
【００５７】
Ｓ８０４で、構文解析器１０８は、トークン読み飛ばし規則１１４の終了トークン読み込み４０３に「ＴＲＵＥ」が登録されているため（Ｓ８０４：Ｙｅｓ）、Ｓ８０５に進む。
Ｓ８０５で、構文解析器１０８は、終了トークン「ＳＴＭＴ＿ＥＮＤ（ＥＮＤ−ＥＸＥＣ）」を読み進める。
【００５８】
Ｓ８０６で、構文解析器１０８は、読み進めたトークン列「「ＳＴＭＴ＿ＨＥＡＤ（ＥＸＥＣ）」「ＳＱＬ」「ＳＴＭＴ＿ＨＥＡＤ（ＯＰＥＮ）」「ｔｅｓｔｆｉｌｅ（ＳＴＲＩＮＧ）」「ＳＴＭＴ＿ＥＮＤ（ＥＮＤ−ＥＸＥＣ）」」（図１０の１００３）を「ＳＴＭＴ」ノード１００５で束ね、構文木１１１に追加する。
【００５９】
トークン読み飛ばし規則１１４のデフォルトの終了４０２には、ピリオド「．」及び、トークン「ＳＴＭＴ＿ＨＥＡＤ」が登録されているため、デフォルトの規則に従うと「ＳＴＭＴ＿ＨＥＡＤ（ＥＸＥＣ）」から読み進めた後、「ＳＴＭＴ＿ＨＥＡＤ（ＯＰＥＮ）」の手前で終了してしまうが、トークン読み飛ばし規則１１４に、先頭４０１が「ＥＸＥＣ」の場合は、終了４０２が「ＥＮＤ−ＥＸＥＣ」であると登録されていることにより、構文の終了位置を正しく認識できている。つまり、トークン読み飛ばし規則１１４の利用により、構文ごとに適切な読み進め方を実現できている。
【００６０】
以上が、Ｓ７０８「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例の説明である。Ｓ７０８の処理後は、Ｓ７０１に戻り、未処理のトークンが存在しないため、処理を終了する。ここまでの処理により、ソースプログラム１１２の一例である９００（図９）の「ＥＸＥＣ」から「ＥＮＤ−ＥＸＥＣ」までの処理が完了し、図１０の１００４が示す部分木が完成する。
【００６１】
以上が、「トークン読み飛ばし規則利用を含む基本構文解析（図５のＳ５０２）」に対する、ソースプログラム１１２の一例である９００を用いた補足説明である。
【００６２】
続いて、構文木訪問器追加処理について、図１１を用いて説明する。構文木訪問器追加処理では、構文解析器１０８が生成した構文木１１１に対して、解析粒度を変更したい場合に行う処理である。例えば、構文木１１１が、文の区別を行うレベルである１５０１のような形状である場合に、ＩＤの区別も行うレベルである１５０２のような形状に変更したい場合などが該当する。
【００６３】
Ｓ１１０１で、解析器１０６のユーザは、追加するべき構文木変換条件があるか否かを判定し、追加するべき構文木変換条件がある場合（Ｓ１１０１：Ｙｅｓ）、Ｓ１１０２に進む。追加するべき構文木変換条件がない場合（Ｓ１１０１：Ｎｏ）、本処理を終了する。
【００６４】
Ｓ１１０２で、解析器１０６のユーザは、構文木１１１の訪問と変換を行う構文木訪問器１０９を作成する。構文木訪問器の作成方法については種々の公知の方法を利用できる。例えば、構文木変換条件１１５から構文木訪問器１０９を自動生成できるパーサジェネレータを使用すれば、少ない記述量で構文木訪問器１０９を作成することができる。
【００６５】
Ｓ１１０３で、解析器１０６のユーザは、作成した構文木訪問器１０９を解析器１０６に追加する。解析器１０６への追加ができないという前提がある場合は、あらかじめ解析器１０６から、処理が空である構文木訪問器１０９を呼び出す仕組みにしておき、構文木変換の必要がある時に構文木訪問器１０９に処理を追加する方式にしておけばよい。
以上が、構文木訪問器追加処理（図１１）の説明である。
【００６６】
ここで、図５のＳ５０３及びＳ５０４の処理の具体例を示す。
なお、以下の例では、前提として図３のトークン定義１１２及び図４のトークン読み飛ばし規則１１４を利用するものとし、Ｓ５０２までの処理により、図１５の１５０１に示す構文木１１１を作成済であるものとする。
【００６７】
また、最初のＳ５０４の処理では、構文木例１５０１が表す構文木１１１を入力として処理を行うものとし、Ｓ１１０１からＳ１１０３までの処理により、次の２つの構文木変換を行う構文木訪問器１０９がそれぞれ作成されているものとする。
構文木訪問器（１）：「「ＳＴＲＩＮＧ」「ＯＦ」「ＳＴＲＩＮＧ」」のパターンは、「ＩＤ」ノードを設けて束ねる。構文木訪問器（２）：「「ＳＴＭＴ＿ＨＥＡＤ（ＭＯＶＥ）」「ＩＤ」「ＴＯ」「ノード」…」のパターンは、「ＴＯ」の手前の「ＩＤ」にＲｅａｄ属性（Ｒ）を付け、「ＴＯ」の後方にある「「ノード」…」にＷｒｉｔｅ属性（Ｗ）を付ける。「「ノード」…」は任意ノードが複数個続くことを意味する。なお、本前提は例を説明するためのものであり、必ずしも本発明がこれら前提に限定されるわけではない。
【００６８】
Ｓ５０３で、解析器１０６は、未処理の構文木訪問器１０９（上記（１））があるため（Ｓ５０３：Ｙｅｓ）、Ｓ５０４に進む。
Ｓ５０４で、解析器１０６は、構文木１１１の訪問と変換処理を行う。即ち、構文木１１１中に、「「ＳＴＲＩＮＧ」「ＯＦ」「ＳＴＲＩＮＧ」」のパターンを発見した場合、「ＩＤ」ノードを設け、束ねる。図１５の１５０１が表す構文木１１１を対象とした場合、１５０４が示す「「ＳＴＲＩＮＧ（Ａ）」「ＯＦ」「ＳＴＲＩＮＧ（Ｂ）」」と、１５０５が示す「「ＳＴＲＩＮＧ（Ｃ）」「ＯＦ」「ＳＴＲＩＮＧ（Ｄ）」」が該当し、これらをそれぞれ「ＩＤ」ノード１５０６で束ね、図１５の１５０２が表す構文木１１１のように変換する。その後、Ｓ５０３の処理に戻る。
【００６９】
Ｓ５０３で、解析器１０６は、未処理の構文木訪問器１０９（上記（２））があるため（Ｓ５０３：Ｙｅｓ）、Ｓ５０４に進む。
Ｓ５０４で、解析器１０６は、構文木１１１の訪問と変換処理を行う。即ち、構文木１１１中に、「「ＳＴＭＴ＿ＨＥＡＤ（ＭＯＶＥ）」「ＩＤ」「ＴＯ」「ノード」…」のパターンを発見した場合、「ＴＯ」の手前の「ＩＤ」にＲｅａｄ属性（Ｒ）を付け、「ＴＯ」の後方にある「ＩＤ」にＷｒｉｔｅ属性（Ｗ）を付ける。図１５の１５０２が表す構文木１１１を対象とした場合、変換後の構文木１５０３が示すように、ノード１５０７にＲｅａｄ属性（Ｒ）が付き、ノード１５０８にＷｒｉｔｅ属性（Ｗ）が付く。その後、Ｓ５０３の処理に戻る。
Ｓ５０３で、解析器１０６は、未処理の構文木訪問器１０９がないため（Ｓ５０３：Ｎｏ）、本処理を終了する。
【００７０】
上記例では、構文解析器１０８の出力である構文木例１５０１に対し、１つ目の構文木訪問器１０９で構文木例１５０２に変換し、２つ目の構文木訪問器１０９で、更に、構文木例１５０３に変換する流れになっている。
以上が、Ｓ５０３及びＳ５０４の具体例である。
【００７１】
上述の例で、構文木例１５０１のような文の区別を行うレベルの解析で十分な場面では、上述の構文木訪問器（１）、（２）は不要である。構文木例１５０２のようなＩＤの区別を行うレベルの解析が必要な場面では、構文木訪問器（１）のみを追加すればよい。構文木例１５０３のようなＩＤのＲｅａｄ／Ｗｒｉｔｅの区別を行うレベルの解析が必要な場面では、更に、構文木訪問器（２）を追加する。このように、計算機１００では、解析のニーズに合わせ構文解析器を作り直すことなく、事後的に変換処理を加えることで柔軟に解析粒度を変化させることが可能になる。
【００７２】
また、計算機１００では、解析器１０６の外部にあるトークン定義１１３やトークン読み飛ばし規則１１４の利用により、構造が不明な構文に対しても、構文単位でトークン列を集約することを実現している。例えば、上述の例のように、「ＳＴＭＴ＿ＨＥＡＤ（ＭＯＶＥ）」から始まる構文が未定義であるとしても、構文木例１５０１のように、構文単位でトークン列を集約することができていた。そのため、先の例のように、事後的に構文木の形状の変換を行う際に目的に合った変換が可能となる。例えば、上記構文木訪問器（２）の変換後の構文木例１５０３において、「ＴＯ」の手前にある「ＩＤ」（１５０７）２箇所にＲｅａｄ属性（Ｒ）を正しく付けることができている。
【００７３】
もし、構造が不明な構文に対して、トークン定義１１３やトークン読み飛ばし規則１１４を利用せず、次の解析可能な文まで読み飛ばしていた場合、図１２の１６００のような構文木となる。このように、２つ目の「ＭＯＶＥ」（１６０３）も、１つ目の「ＭＯＶＥ」（１６０１）の「ＴＯ」（１６０２）の後方にある１つの要素として判断され、Ｗｒｉｔｅ属性（Ｗ）が付けられてしまう。また、本来であれば、Ｒｅａｄ属性（Ｒ）を付けるべきである、「ＴＯ」の手前の「ＩＤ」トークン（１６０４）にも、同様の理由でＷｒｉｔｅ属性（Ｗ）が付けられてしまい、いずれも誤った解析となる。
【図１】
2014211729.tif 000003
【図２】
2014211729.tif 000004
【図３】
2014211729.tif 000005
【図４】
2014211729.tif 000006
【図５】
2014211729.tif 000007
【図６】
2014211729.tif 000008
【図７】
2014211729.tif 000009
【図８】
2014211729.tif 000010
【図９】
2014211729.tif 000011
【図１０】
2014211729.tif 000012
【図１１】
2014211729.tif 000013
【図１２】
2014211729.tif 000014
【図１３】
2014211729.tif 000015
【図１４】
2014211729.tif 000016
【図１５】
2014211729.tif 000017
【図１６Ａ】
2014211729.tif 000018
【図１６Ｂ】
2014211729.tif 000019
【図１６Ｃ】
2014211729.tif 000020