(57)【要約】【課題】  本発明は、ユーザーがカスタマイズ可能な文法記述ファイルを用いて、コンパイラ・リンカを通すことなく、文書の文法を解析し、得られる情報を表示することを目的とする。【解決手段】  文書の文法を表現する目的で作成された、複数個の｛状態・文字列・文字列一致時の状態遷移先｝からなる状態遷移ルールに基づき、文書の各文字の状態を決定し、各文字の状態から得られる情報を表示する。【選択図】図１
2009054125.tif 000002
【特許請求の範囲】
【請求項１】
文書の文法を表現する目的で作成された、複数個の｛状態・文字列・文字列一致時の状態遷移先｝からなる状態遷移ルールを記憶した文法記憶手段と、
前記文法記憶手段に記憶された状態遷移ルールに従って、文書の各文字の状態を決定し記憶する、文法解析・記憶手段と、
前記文法解析・記憶手段で決定された各文字の状態から得られる情報を表示する表示手段とからなることを特徴とする、
文書情報表示システム。
【発明の詳細な説明】
【技術分野】
【０００１】  本発明は、文書情報表示システムに関する。
【背景技術】
【０００２】  従来、テキストエディタにおいて、エディタ内に組み込まれた文法情報に従って色付けしたり、正規表現に一致した部分や行を色付けしたり、キーワードを色付けしたりする機能がある。また、統合開発環境（ＩＤＥ）において、コンパイラ・リンカから取得した識別子情報に基づいて色付けや補完入力する機能がある。
【発明の開示】
【発明が解決しようとする課題】
【０００３】  文書編集システムや文書参照システムにおいて、文法情報に基づいた色付けや補完入力や付加情報の表示は、文書作成の品質・効率向上に有用である。しかし、従来のシステムでは、もっとより多くの情報や、より自由なカスタマイズ性が欲しいことがある。また、専用の環境でのコンパイル・リンクを必要とする場合、移行のコストやリスクを必要としたり、対象外の言語では使用できなかったりする課題がある。【０００４】  本発明は、ユーザーがカスタマイズ可能な文法記述ファイルを用いて、コンパイラ・リンカを通すことなく、文書の文法を解析し、得られる情報を表示することを目的とするものである。
【課題を解決するための手段】
【０００５】  この課題を解決するための請求項１の発明は、図１のように構成されるシステムである。図１において、１は文法記憶手段であり、文書の文法を表現する目的で作成された、複数個の｛状態・文字列・文字列一致時の状態遷移先｝からなる状態遷移ルールを記憶する。【０００６】  ２は文書であり、解析の対象である。【０００７】  ３は文法解析・記憶手段であり、文法記憶手段１に記憶された状態遷移ルールに従って、文書２の各文字の状態を決定し記憶する。【０００８】  ４は表示手段であり、文法解析・記憶手段３で決定された各文字の状態から得られる情報を表示する。【０００９】  文法解析・記憶手段３における、各文字の状態決定の手順は以下のとおりである。【００１０】  文法解析・記憶手段３は、文書内の文字の位置を記憶するポインタと、現在の状態を記憶する状態変数を持つ。処理の最初において、ポインタは文書の最初にあり、状態変数は初期状態である。文法解析・記憶手段３は、まず、文法記憶手段１の状態遷移ルールから、「状態」が状態変数と一致し、かつ、「文字列」がポインタ以降の文字列と一致するものを検索する。一致するものがあったら、その状態遷移ルールの「文字列一致時の状態遷移先」を新たな状態遷移先として状態変数へ設定する。そして、ポインタを進め、旧ポインタと新ポインタの間の文字の状態を、状態変数に記憶された状態で決定し、記憶する。以上の処理を、ポインタが文書の最後に到達するまで繰り返す。
【発明の効果】
【００１１】  本発明により、ユーザーがカスタマイズ可能な文法記述ファイルを用いて、コンパイラ・リンカを通すことなく、文書の文法を解析し、得られる情報を表示することができる。【００１２】  統合開発環境を新規に導入する場合に比べ、コンパイラやリンカを通す必要がなく、現在使用中の開発環境はそのまま使用することが出来るため、移行コストやリスクを必要としない。【００１３】  また、文法をユーザーがカスタマイズして使用することが出来るため、メジャーではないプログラミング言語であっても使用することが出来る。さらに、静的解析機能や統合開発環境を持たない言語であっても、本発明によって得られる情報を元にしたチェック機能や警告表示機能等を使用することが出来る。
【発明を実施するための最良の形態】
【００１４】  以下、本発明の実施の形態を図２〜図１１に基づき説明する。図２は本発明の実施の形態の構成図、図３は文法記述ファイルの基本文法、図４は状態遷移動作の例、図５は文法解析変数設定動作の例、図６は識別子記憶動作・関数コール箇所記憶動作の例、図７は制御構造記憶動作の例、図８はソース解析支援動作の例、図９は警告情報表示の文法記述ファイル記述例、図１０は１：１対応チェックの文法記述ファイル記述例、図１１はＣ言語用の文法記述ファイルの例である。【００１５】  図２において、１ａ，１ｂは文法記述ファイル、１ｃは文法記述データ、２は文書、３は文法解析・記憶手段、４は表示手段である。なお、本文書情報表示システムは、文書編集システムや文書参照システム内に組み込まれる。【００１６】  文法記述ファイルは、図３のような仕様で、複数個の｛状態・条件文字列・条件文字列一致時に行う動作の配列｝からなるルールを記憶したファイルである。【００１７】  １つの状態は、複数のｓｔａｔｅ［状態名］｛・・・｝構文に分けて記述することが出来る。また、状態名に＊を記述した場合は任意の状態を表し、全ての状態に共通のルールであることを示す。［状態名］に複数の状態名をカンマで区切って記述することも可能であり、その場合はその複数の状態に共通のルールであることを示す。【００１８】  条件文字列として、正規表現も記述可能であり、その場合は、ダブルクオーテーションの前にＲを記述し、例えばＲ“［ａ−ｚ］＋”のように記述する。【００１９】  文法記述ファイルは複数のファイルに分けて記述することが出来る。図２では２つのファイルとして記述されているが、３つ以上でも構わない。プロジェクトごとや、チームごと、担当者ごとに、ファイルを追加することが出来る。追加したファイルでは、文法構造を大きく変更することは出来ないが、少なくとも、後述する警告情報表示やチェックのためのルールを追加することが出来る。これにより、例えば、不具合発生時の再発防止策として、警告情報表示やチェックのルールを追加する、といった使い方が出来る。【００２０】  システムは、複数の文法記述ファイルを読み込み、状態ごとにマージして、文法記述データ１ｃとしてメモリ内に記憶する。【００２１】  次に、文法解析・記憶手段３は、以下に記載した手順で、文書２の文法を解析し、文字ごとに状態を決定していく。【００２２】  文法解析・記憶手段３は、文書内の文字の位置を記憶するポインタと、現在の状態を記憶する状態変数を持つ。処理の最初において、ポインタは文書の最初にあり、状態変数は初期状態である。文法記述データ１ｃ内で、状態名が「ｉｄｌｅ」である状態を初期状態とする。【００２３】  文法記述データ１ｃから、現在の状態の条件文字列を検索し、文書の現在のポインタ以降の文字列と一致するものを見つける。各条件文字列の長さ分だけ一致していれば、一致とみなす。【００２４】  一致する条件文字列が見つかった場合は、その条件文字列に対応する動作を順に実行し、条件文字列の長さ分だけポインタを進める。旧ポインタと新ポインタの間の文字の状態は、状態変数に格納された状態で決定される。ただし、実行される動作によっては、ポインタを進める前もしくは後に、状��変数が変更される。【００２５】  一致する条件文字列が見つからない場合は、一単語分もしくは一記号分ポインタを進める。旧ポインタと新ポインタの間の文字の状態は、状態変数に格納された状態で決定される。【００２６】  一致する条件文字列が見つからない場合でも、文法記述ファイルに条件文字列としてｄｅｆａｕｌｔが記述されている場合は、それに一致したものとみなす。【００２７】  図４は、文法記述ファイルに記述される動作のうち、状態遷移動作の例である。例えば、「ＣｈａｎｇｅＳｔａｔｅ（ｘ）  」は、状態変数の状態をｘに変更してから、ポインタを進める。「ＣｈａｎｇｅＳｔａｔｅＦｒｏｍＮｅｘｔＣｈａｒ（ｘ）  」は、ポインタを進めてから、状態変数の状態をｘに変更する。「ＰｕｓｈＳｔａｔｅ（ｘ）  」は現在の状態を保存し、状態変数の状態をｘに変更してから、ポインタを進める。「ＰｏｐＳｔａｔｅ」は状態変数の状態を、ＰｕｓｈＳｔａｔｅで保存された状態に変更してから、ポインタを進める。【００２８】  さらに、文法解析・記憶手段３は、文書内の文字列の内容と位置を記憶するための変数（以下、文法解析変数と記述する）を持つ。また、文書内の解析済みのトークン（トークンとは１つの単語や記号のことである）の内容と位置を順に記憶する配列（以下、トークンスタックと記述する）を持つ。なお、これらは、概念的には文字列の内容と位置を記憶するものであるが、文字列の内容は文書内に存在するので、実装上は、メモリや処理時間の節約のため、文書内の位置だけを記憶すればよい。【００２９】  文法解析変数には、図５記載の動作「ＳｅｔＶａｒ〜」によって文字列の内容と位置が記憶される。例えば、動作「ＳｅｔＶａｒＳｔａｒｔ（ｘ）  」が実行された位置から、動作「ＳｅｔＶａｒＥｎｄ（ｘ）  」が実行された位置までの文字列が、文法解析変数に記憶される。【００３０】  また、動作「ＳｅｔＶａｒＷｉｔｈＴｏｋｅｎＳｔａｃｋ」により、トークンスタック内の指定文字列が、文法解析変数へコピーされる。【００３１】  文法解析変数に格納された文字列は、例えば図６記載の動作「ＡｄｄＩｄｅｎｔｉｆｉｅｒ」により、関数や変数等の識別子の名前として、文法解析・記憶手段３に記憶させることが出来る。【００３２】  さらに、文法解析・記憶手段３は、行ごとに、行開始位置の状態、「ＰｕｓｈＳｔａｔｅ（ｘ）  」により保存された状態、その行で記憶された識別子の情報を記憶する。【００３３】  文書を編集したときは、編集を行った行を再度文法解析する。ただし、文法解析変数やトークンスタックを再構成する必要があるため、行開始位置の状態が初期状態である行までさかのぼって文法解析を開始し、行開始位置の状態が編集前の状態と同じになる行で文法解析を終了する。【００３４】  最後に、表示手段４は、文字ごとの状態から得られる情報を表示する。例えば、コメント部分の文字を赤色で表示する。【００３５】  さらに、表示手段４は、図６、図７、図８に記載の動作によって文法解析・記憶手段３に記憶された情報を元に、様々な情報の表示や文書のチェック結果を表示することが出来る。以下、図６、図７、図８に記載の動作ごとに説明する。【００３６】    図６記載の動作「ＡｄｄＩｄｅｎｔｉｆｉｅｒ」により、文法解析・記憶手段３は、文法解析変数に格納された文字列を、関数・変数等の識別子の名前や、付加情報や、型名として記憶し、さらに、識別子名の位置を記憶する。また、２つの関数の名前の位置の間を関数の定義位置とみなすことにより、各関数の定義位置情報を得ることが出来る。これにより、表示手段４は、以下の情報を表示することが出来る。【００３７】  ・文書表示画面上で、関数名や変数名等の識別子の名前を色付けして表示したり、文書内の関数名や変数名等の識別子の名前を一覧表示する。また、識別子名の最初の数文字を入力することで、後の文字を自動補完して入力することが出来るようにする。【００３８】  ・文書表示画面上で、関数名や変数名等の識別子の名前部分をクリックしたり、選択したり、キーボード入力したりすることにより、そのカテゴリー名（関数、変数等の種類）や付加情報（引数等）や型名を表示する。また、関数の定義や宣言の内容を表示する。【００３９】  図６記載の動作「ＦｕｎｃｔｉｏｎＣａｌｌ」により、文法解析・記憶手段３は、関数コールの存在箇所とその関数名を記憶する。さらに、同一プロジェクト内の全ての文書を解析することにより、全ての関数の呼び出し箇所と、全ての関数間のコールする／されるの関係情報が得られる。関数の呼び出し箇所がどの関数に含まれているかは、前記動作「ＡｄｄＩｄｅｎｔｉｆｉｅｒ」によって記憶された情報から得ることが出来る。これにより、表示手段４は、以下の情報を表示することが出来る。【００４０】  ・文書表示画面上で現在選択中の関数について、その関数をコールしている関数名を、コール元方向へさかのぼって表示（バックトレース表示）する。複数のコール元が存在するときは、それらを同時に表示、もしくは、複数のコール元が存在することを示すマークを表示し、ユーザーがそれをクリックすることで他のコール元を表示できるようにする。また、関数名をクリックすることにより、関数の定義や宣言を表示する。【００４１】  ・関数のコールする／されるの関係を、表や図で表示する。表や図中の関数名をクリックすると、その関数の定義や宣言を表示する。【００４２】  ・引数の型と仮引数の型を比較し、一致しない場合に、文書表示画面上の関数コール箇所の近傍に警告表示を行う。引数の型と、仮引数の型は、動作「ＡｄｄＩｄｅｎｔｉｆｉｅｒ」により記憶された情報から得ることが出来る。【００４３】  図７記載の動作「ＦｏｒＬｏｏｐＳｔａｒｔ」等により、文法解析・記憶手段３は、プログラムの制御文の種類と位置を記憶する。これにより、表示手段４は、以下の情報を表示することが出来る。【００４４】  ・制御構造を、フローチャート、ＰＡＤ図、有向グラフ等で表示する。文書表示画面中のテキストを選択すると、フローチャート等の中の対応する部分を強調表示する。また、フローチャート等の中の一箇所をクリックすると、文書表示画面中のテキストの該当する部分を表示する。【００４５】  ・ソースコード上で、擬似的にデバッガのステップ実行に近い機能を実現する。例えば、擬似ステップイン機能ボタンをクリックすると、現在の選択行にコール関数があればその関数定義を表示し、関数定義の最初の行を選択する。現在の選択行に条件分岐があればどちらに移動するかをユーザーに選択させる。現在の選択行に反復の終了があれば反復を終了するか継続するかをユーザーに選択させる。擬似ステップアウトボタンにより、コール元の行に戻る。さらに、関数コールのバックトレースを表示したり、現在の関数のローカル変数等の識別子情報を表示する。【００４６】  ・文書表示画面上に、制御ルートを矢印で表示する。例えば、アセンブラ言語において、ＪＭＰ命令の箇所を始点、ジャンプ先のラベルの箇所を終点とする矢印を表示する。【００４７】  ・ホワイトボックステストの網羅性をチェックするために、文書表示画面上の条件分岐の箇所の近傍にチェックボックスを表示し、チェックボックスへの記入が出来るようにする。さらに、網羅率を表示する。あらかじめ設定した網羅性の種類（分岐網羅等）によって、チェックボックスの数やタイトルを変える。また、文書内容と、チェックボックスへのチェック記入情報とをひとまとまりにして、テスト結果として、別ファイルへ保存したり、印刷したりできるようにする。【００４８】  図８記載の動作「ＤｉｓｐｌａｙＷａｒｎｉｎｇ」により、文法解析・記憶手段３は、警告情報を表示すべき箇所を記憶する。これにより、表示手段４は、文書表示画面の該当箇所に警告情報を表示する。警告情報の表示方法は、まずその部分の背景色を赤色にして表示し、そこを選択したときに警告情報の内容が表示される、などとする。【００４９】  さらに、図８記載の動作「ＤｉｓｐｌａｙＷａｒｎｉｎｇＩｆ」により、文法解析・記憶手段３は、指定された文法解析変数の内容の文字列にフラグが設定されている場合に限り、警告情報を表示すべき箇所を記憶する。【００５０】  文法解析・記憶手段３は、フラグ設定済み文字列を記憶する配列を持つ。動作「ＳｅｔＦｌａｇ」によって、指定された文法解析変数内の文字列が前記配列に追加される。動作「ＣｌｅａｒＦｌａｇ」によって、指定された文法解析変数内の文字列が前記配列から削除される。また、関数定義の境界で前記配列の内容は全て削除される。動作「ＤｉｓｐｌａｙＷａｒｎｉｎｇＩｆ」により、文法解析・記憶手段３は、指定された文法解析変数の内容の文字列が、前記配列に含まれているかどうかを調べることにより、文字列にフラグが設定されているかどうかを判断する。【００５１】  これにより、例えば、変数を関数に渡す前に変数のレングスチェックが必要であるのに、変数のレングスチェックの記述を忘れてしまったというような場合に、警告情報を表示することが出来る。文法記述ファイルは、図９のように記述し、条件文字列がレングスチェック関数名に一致した場合に動作「ＳｅｔＦｌａｇ」を実行し、条件文字列が事前に引数をレングスチェックすべき関数名に一致した場合に動作「ＤｉｓｐｌａｙＷａｒｎｉｎｇＩｆ」を実行するようにする。【００５２】  図８記載の動作「ＳｙｍｍｅｔｒｉｃＣｈｅｃｋＩｎ」「ＳｙｍｍｅｔｒｉｃＣｈｅｃｋＯｕｔ」により、文法解析・記憶手段３は、１：１で対応すべき文字列の存在位置と、対応チェックの種類を記憶する。これと、図７記載の動作によって得られた制御構造の情報を使用することにより、表示手段４は、プログラム実行時に１：１対応が���れなくなることがないかをチェックし、チェックエラーがあれば警告を表示することが出来る。【００５３】  例えば、図１０のように文法記述ファイルに記述することで、メモリの割り当て・解放の１：１対応をチェックすることが出来る。文法解析・記憶手段３は、文書中の文字列が条件文字列“ｍａｌｌｏｃ”と一致したら、その箇所と、対応チェックの種類“ｍｅｍｏｒｙａｌｌｏｃａｔｅ”を記憶する。条件文字列“ｆｒｅｅ”と一致したら、その箇所と、対応チェックの種類“ｍｅｍｏｒｙａｌｌｏｃａｔｅ”を記憶する。表示手段４は、対応チェックの種類ごとに、プログラムの制御構造に従っていくつかの制御ルートをトレースし、「ＳｙｍｍｅｔｒｉｃＣｈｅｃｋＩｎ」で記憶された箇所を通った回数と、「ＳｙｍｍｅｔｒｉｃＣｈｅｃｋＯｕｔ」で記憶された箇所を通った回数が一致しないルートがあれば、１：１対応が取れていないと判断し、警告情報を表示する。【００５４】  図８記載の動作「Ｉｍｐｏｒｔ」により、文法解析・記憶手段３は、別のファイル（例えばＣ言語のヘッダファイル）がそこでインポートされていることを記憶する。これにより、表示手段４は、インポートされたファイル、および、インポートされたファイル内でインポートされたファイルを文法解析するようシステムに指示し、得られた識別子の情報等を表示することが出来る。【００５５】  図８記載の動作「ＩｎｃＩｎｄｅｎｔ」「ＤｅｃＩｎｄｅｎｔ」により、文法解析・記憶手段３は、各行のインデントレベルを記憶する。最初のインデントレベルは０であり、動作「ＩｎｃＩｎｄｅｎｔ」により＋１され、動作「ＤｅｃＩｎｄｅｎｔ」により−１される。文書にはインデント幅情報が保存されており、インデントレベルが＋１されると次の行のインデントは現在行より前記インデント幅分だけ右になり、インデントレベルが−１されると次の行のインデントは現在行より前記インデント幅分だけ左になる。【００５６】  図８記載の動作「ＬｅｆｔＶａｌｕｅ」「ＲｉｇｈｔＶａｌｕｅ」により、文法解析・記憶手段３は、代入文の箇所を記憶し、さらに、文法解析変数内の文字列が代入文の左辺値／右辺値であることを記憶する。これにより、表示手段４は、左辺値／右辺値として記憶された文字列を名前とする識別子を検索し、左辺値と右辺値の型が不一致の場合に、文書表示画面上の代入文の箇所の近傍に警告情報を表示することが出来る。これは特に型チェック機能が不十分な言語を使用する場合に有効である。【００５７】  図１１は、Ｃ言語の関数名を識別子として記憶し、文書のコメント部分の文字を状態ｃｏｍｍｅｎｔとするための、文法記述ファイルの例である。実用上はさらにルールの追加が必要であるが、実施例の理解の補助のため記載した。【００５８】  なお、文法記述ファイルの記述は、ユーザーはグラフィカルなユーザーインターフェイスで編集でき、それをシステムが本実施例記載の文法に変換して保存するほうが望ましい。【００５９】  表示手段４での情報表示は、文書編集・参照中に、複雑な操作を必要とせずリアルタイムで表示され、かつ、処理速度が遅くなることで文書編集・参照の作業を妨げることがないようにするのが良い。また、文書の編集・参照を妨げない箇所��情報表示するのが良い。編集・参照作業を行う主体はあくまで人間であり、編集・参照作業をする人間をさりげなく適切に支援することが本発明の実施におけるポイントである。
【図面の簡単な説明】
【００６０】
【図１】  本発明の原理構成図である。
【図２】  本発明の実施の形態の構成図である。
【図３】  文法記述ファイルの基本文法である。
【図４】  状態遷移動作の例である。
【図５】  文法解析変数設定動作の例である。
【図６】  識別子記憶動作・関数コール箇所記憶動作の例である。
【図７】  制御構造記憶動作の例である。
【図８】  ソース解析支援動作の例である。
【図９】  警告情報表示の文法記述ファイル記述例である。
【図１０】  １：１対応チェックの文法記述ファイル記述例である。
【図１１】  Ｃ言語用の文法記述ファイルの例である。
【符号の説明】
【００６１】      １  文法記憶手段
２  文書
３  文法解析・記憶手段
４  表示手段
１ａ，１ｂ  文法記述ファイル
１ｃ  文法記述データ
【図１】
2009054125.tif 000003
【図２】
2009054125.tif 000004
【図３】
2009054125.tif 000005
【図４】
2009054125.tif 000006
【図５】
2009054125.tif 000007
【図６】
2009054125.tif 000008
【図７】
2009054125.tif 000009
【図８】
2009054125.tif 000010
【図９】
2009054125.tif 000011
【図１０】
2009054125.tif 000012
【図１１】
2009054125.tif 000013