(57)【要約】      （修正有）【課題】ソースプログラムの検証コードの書き忘れや検証コード自体の間違いをなくす。また、ユーザ参加のレビューを容易にする。【解決手段】ソースコードとは別の検証コードのみのファイル１０３を用意し、ソースコード中に散在する検証コードをこの検証コードのみのファイル１０３に集約し、プログラム言語処理系が適切な位置に検証コードを自動挿入するようにする。【選択図】図１
2010266909.tif 000002
【特許請求の範囲】
【請求項１】
プログラム言語の処理方法であって、
プログラム中の任意の識別子について、その識別子が常に満たしていなければならない条件とその条件が満たされていない場合に実行すべき動作について、プログラムのソースコードを格納したファイルとは別のファイルに記述しておき、そのファイルをプログラム言語処理系が読み込むことにより、プログラム言語処理系が、ソースコードを構文解析して作成した中間語を走査することで、プログラム中の適切な箇所に対象とする識別子の値が与えられた条件にあっているかどうかを検査し、あっていなければ指示された動作を実行するコードを挿入するプログラム言語の処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
エラーチェック機能をもったコードを生成する言語処理方法に関する。
【背景技術】
【０００２】
実行時にプログラム中の変数が保持する値が想定した範囲および条件に合致しているかどうかを検査する手法としては、各言語のｉｆ文などの条件判定文およびＣＯＢＯＬのＤ文やＣ言語のａｓｓｅｒｔマクロなどの言語標準機能を使用する方法や形式手法（フォーマルメソッド）と呼ばれる手法が用いられている。
【０００３】
言語標準機能を使う手法は、プログラマがプログラムの中の適切な位置に問題を検出するためのコードを明示的に書き込んでいくものである。形式手法を基礎とした手法では、ソースプログラム中にコメントとして検証コードを書き込んでおき、そのソースコードを専用のツールで処理することでオブジェクトコード中に検証コードを挿入する方法がとられる。この手法は、言語標準機能では実現できなかった関数呼び出し時の引数に対する検査や添字式の検査などがおこなえるようになっている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１１−２２４２１１号公報
【非特許文献１】Ｃ言語の言語標準機能については、日本工業規格（ＪＩＳ）  「Ｘ  ３０１０」で言及されている。
【０００５】
【非特許文献２】ＣＯＢＯＬ言語の言語標準機能については、日本工業規格（ＪＩＳ）「  Ｘ  ３００２」で言及されている。
【０００６】
【非特許文献３】形式手法については、情報処理学会（編）「情報処理」、Ｖｏｌ．４９  Ｎｏ．５  Ｍａｙ  ２００８、ＰＰ４９１−４９８、「特集  フォーマルメソッドの新潮流  Ｐａｒｔ  Ｉ：歴史と概要」およびＰＰ．５１４−５２０、「特集  フォーマルメソッドの新潮流  Ｐａｒｔ  ＩＩ：産業界への応用、Ｃ言語へのフォーマルメソッドの適用」において論じられていた。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
言語標準機能を使う手法では、変数の値が有効範囲にはいっているかどうかを検証するためのコードがソースコード中に散在することになるため管理が難しくなり、検証コードの書き忘れや各検証コードに記述した判定条件の間違いといった問題が起こりやすくなる。たとえば、ソースコード中のある箇所で検証コードとして変数ａの値が１≦ａ≦５という条件を満たさなければならないと主張しているのに、他の類似の箇所にはこの検証コード自体がかかれていなかったり、あるいは１≦ａ＜５のように先の主張とは異なる主張が書かれていたりする誤りが起こりやすい。形式手法を基礎とした手法を用いる場合でも、基本的な考え方は言語標準機能を使う場合と同様に、ソースコード中の必要な箇所に検証のためのコードを書き込んでいく方法であり、言語標準機能を使う場合と同様に、検証コードの書き忘れや判定条件の間違いが起こりやすいという問題がある。
【０００８】
また、Ｃ言語のａｓｓｅｒｔのような言語標準機能を使う場合、検証コードをソースコード中に書き込むため、プログラマ以外の関係者による検証コードそのものの検証が難しいという問題がある。通常プログラムを作成する場合、プログラムを実装するプログラマのほかに、作成されるプログラムのユーザがいる。ユーザは、プログラムが処理する業務を規定し、プログラムの外部仕様を決定する。検証コードに書かれる変数の保持する値の範囲などの条件は通常外部仕様に根拠をもつため、この部分のチェックにはユーザも参加できることが望ましい。しかし、一般にユーザはプログラムのソースコードを読むことができないので、現在の検証コードをソースコード中に記述する方法では、ユーザ参加のレビューの実施が難しいという問題がある。
【課題を解決するための手段】
【０００９】
ソースコード中に散在する検証コードをソースコードとは別のファイルに集約し、プログラム言語処理系が適切な位置に検証コードを自動挿入するようにすることで、検証コードの書き忘れや検証コード自体の間違いをなくす。同時に、ソースコードとは別の検証コードのみのファイルを用意することで、ユーザ参加のレビューを容易にする。
【発明の効果】
【００１０】
同じ意味の検証コードが複数の箇所に散在して書く必要がなくなるため、検証コードの書き忘れや検証コード自体の相互矛盾が起こることを防止できる。
【００１１】
ソースコードから検証コードを分離することにより、検証コードを一種の設計文書として扱うことができるようになり、プログラムのソースコードを理解できないユーザをレビューアとして参加させることができるようになる。
【００１２】
通常検証コードは、その根拠となる上限値・下限値・制約条件などが仕様書にかかれており、実装するプログラマが仕様書と見比べながらプログラム中の適切な箇所に検証コードとして書き込んでいくという流れで作成されるが、本発明の提案するシステムでは従来プログラマが手動でおこなっていた仕様書から起こした検証コードをソースプログラム中の適切な位置に挿入する作業部分に対して、コンピュータによる自動化がおこなえる。
【発明を実施するための形態】
【００１３】
以下、本発明を実施するための最良の形態を図面に基づいて詳細に説明する。
【００１４】
図１は、本発明における一実施例であるプログラム言語処理系の構成を示すものである。このプログラム言語処理系は、コンパイラ制御部１０６、コンパイラフロント部１０７、コンパイラバック部１１３、検証コード記述ファイル解析部１０８、検証対象検索部１１０、検証コード挿入部１１２の６個のコンポーネントからなる。これらのコンポーネントは、いずれもＣＰＵ装置１１５で解釈・実行可能な機械語コードであり、主記憶装置内１０５に配置されている。
【００１５】
コンパイラ制御部１０６は、ユーザが入力装置１１６を用いて入力したソースファイル１０２のファイル名と検証コード記述ファイル１０３のファイル名をうけとり、コンパイラフロント部１０７を起動してソースファイル１０２のファイル名をわたす。コンパイラフロント部１０７の処理が正常に終了し、中間語コード１１４が生成されると、コンパイラ制御部１０６は検証コード記述ファイル解析部１０８を起動して、検証コード記述ファイル１０３のファイル名をわたす。検証コード記述ファイル解析部１０８の処理が正常に終了すると、コンパイラバック部１１３を呼び出してオブジェクトファイル１０４を生成させる。コンパイラフロント部１０７、検証コード記述ファイル解析部１０８またはコンパイラバック部１１３の処理が異常終了した場合は、出力装置１１７にエラーメッセージを表示して処理を終了する。
【００１６】
コンパイラフロント部１０７は、ユーザが作成したソースファイル１０２を外部記憶装置１０１から読み込んで解析し、主記憶装置１０５中に中間語命令に翻訳した中間語コード１１４を生成する。本実施例では中間語コード１１４を主記憶装置１０５内に配置しているが、中間語コード１１４は外部記憶装置１０１に配置するファイルであってもよいし、主記憶装置１０５中に配置される仮想ファイルであってもよい。中間語コード１１４の詳細については後述する。
【００１７】
コンパイラバック部１１３は、中間語コード１１４を読み込んで、オブジェクトコードに翻訳し、外部記憶装置１０１にオブジェクトファイル１０４として出力する。
【００１８】
本発明では、プログラマはソースファイル１０２とは別に検証コードを記述した検証コード記述ファイル１０３を作成し、外部記憶装置１０１内に配置する。検証コード記述ファイル解析部１０８は、コンパイラフロント部１０７が作成した中間語コード１１４と検証コード記述ファイル１０３を読み込んで解析し、検証中間語コードを生成したのち、検証対象検索部１１０を呼び出す。
【００１９】
検証対象検索部１１０は、中間語コード１１４と検証中間語コードを読み込み、中間語コード１１４の中間語命令部を走査し、検証対象となる特定の中間語命令列と一致する部分を検索する。検証対象となる中間語命令語列を発見した場合、検証コード挿入部１１２を呼び出し、その部分を検証用の中間語命令列で置換する。中間語コード１１４、検証中間語コード、および、検証対象となる中間語命令列の検索方法と置換方法の詳細については後述する。
【００２０】
中間語コード１１４は、シンボルテーブル、定数テーブル、中間語命令部の３つの部分からなる。シンボルテーブルは、ソースコード中に記述した変数および手続きの名前（シンボル）を記録したテーブルである。定数テーブルは、ソースコード中に記述した定数値を記録したテーブルである。中間語命令部は、中間語命令の並びを格納する。コンパイラフロント部１０７は、ソースコード１０２を解析して、ソースコード１０２で表現されたプログラムと等価な意味になる中間語命令の並びを生成して、中間語命令部に格納する。
【００２１】
コンパイラフロント部１０７が、図２に示すＣ言語プログラムを解析すると、図３のような構文解析木がえられ、図４に示すシンボルテーブル、図５に示す定数テーブル、図６にしめす中間語命令部が得られる。構文解析木は、ノードとブランチからなる木構造で表現される。ひとつのノードはブランチによって０個複数の子ノードと接続される。図３の構文解析木では、ノードは矩形で表現され、ブランチは線分で表現されている。ブランチで接続された２つのノードのうち、左に描かれたものが親ノード、右に描かれたものが子ノードである。構文解析木においては、ノードは中間語命令であり、子ノードは親ノードの命令のオペランドまたはブロックを表現する。
【００２２】
シンボルテーブルは、ソースコード中に現れるシンボルごとに１行が作成される。ａｄｄｒ欄４０１は主記憶装置１０５中のアドレスを示すものであり、実際には何らかの整数値となるが、具体的な値は実行時まで決まらないため、ここでは仮にＳ００１からＳ００４と表示している。以下同様に、主記憶装置１０５内のアドレスについては実際のアドレス値のかわりに適当な記号を割り振ることとする。図２に示すＣ言語プログラムでは、“ｓｕｂ１”、“ａ”、“ｂ”、“ｓｕｂ２”の４個のシンボルが使われているため、４つの行が登録されている。
【００２３】
定数テーブルは、ソースコード中に現れる定数を格納する。ひとつの定数に１行が作成される。ｖａｌｕｅ欄５０２には定数値を格納する。図２に示すＣ言語プログラムでは、行２０５のｉｆ文の条件式の中で定数１が使われているため、１つの行が登録されている。
【００２４】
中間語命令部は、ひとつの中間語命令ごとに１個の行が作成される。各行は、中間語命令のオペコードを格納するｏｐｃｏｄｅ欄６０２、論理的な意味での次の行のアドレスを格納するｎｅｘｔ欄６０３、親の中間語命令のアドレスを格納するｐａｒｅｎｔ欄６０４、シンボルテーブルまたは定数テーブル内の参照先のアドレスを格納するｌｉｎｋ欄６０５、現在行の子となる中間語命令のアドレスを格納する３つの欄、ｃｈｉｌｄ１欄６０６、ｃｈｉｌｄ２欄６０７、ｃｈｉｌｄ３欄６０８からなる。なお、ｌｉｎｋ欄６０５、ｃｈｉｌｄ１欄６０６、ｃｈｉｌｄ２欄６０７、ｃｈｉｌｄ３欄６０８が０になっている場合、未使用または無効を意味する。また、ｃｈｉｌｄ１欄６０６がＶＡＲとなっている中間語命令は、可変個の子ノードをもつことを意味し、ｎｅｘｔ欄６０３が示す次の中間語命令から対応するｅｎｄ中間語命令までが子ノードと解釈される。例えば、図６のアドレスＡ０１０にある中間語命令ｔｈｅｎの場合、次の命令であるアドレスＡ０１１から対応するｅｎｄであるＡ０１４までがＡ０１０の子ノードと解釈される。ｃｈｉｌｄ１欄６０６がＶＡＲの場合、ｃｈｉｌｄ２欄６０７およびｃｈｉｌｄ３欄６０８は無効である。
【００２５】
検証コード記述ファイルは、テキスト形式で記述されたファイルで、０個以上の検証記述部をもつ。検証記述部は、タグ“＜ｖａｌｉｄａｔｉｏｎ＞”７０１と“＜／ｖａｌｉｄａｔｉｏｎ＞”７１１で囲まれた部分である。検証記述部は、その内部に検証対象記述部、条件記述部、エラー時動作記述部をそれぞれひとつずつもつ。検証対象記述部は、タグ“＜ｉｄｅｎｔｉｆｉｅｒ＞”７０２と“＜／ｉｄｅｎｔｉｆｉｅｒ＞”７０４で囲まれた部分である。検証対象記述部の内部には、検証対象にする識別子を記述する。図７の例では、検証対象の識別子名として変数名ａを指定している（７０３）。条件記述部は、タグ“＜ａｓｓｅｒｔｉｏｎ＞”７０５と“＜／ａｓｓｅｒｔｉｏｎ＞”７０７で囲まれた部分であり、その内部に検証対象記述部で指定した識別子が常に満足していなければならない条件を記述する。図７の例では、“１＜＝ａ  ＆＆  ａ  ＜＝５”、すなわち識別子ａが１以上５以下になっていれば真、それ以外であれば偽となる条件式を指定している（７０６）。エラー時動作記述部は、タグ“＜ａｃｔｉｏｎ＞”７０８と“＜／ａｃｔｉｏｎ＞”７１０に囲まれた部分であり、条件記述部で指定した条件が成り立っていないときに実行するコードを記述する。図７の例では、エラー時に実行するコードとして、“ＰｒｉｎｔＭｅｓｓａｇｅ（ａ）”を指定している（７０９）。
【００２６】
以上の規定から、図７に示す検証コード記述ファイルの例では、変数ａの値が、１以上５以下という条件を満たしていない場合にＰｒｉｎｔＭｅｓｓａｇｅ（ａ）という手続きを実行するという意味になる。図８は、図７に示す検証コード記述ファイル解析した結果、作成されるべき構文解析木である。破線の矩形で囲まれた部分木８０１は、条件記述部から作成されたもの、破線の矩形で囲まれた部分木８０３はエラー時動作記述部から作成されたもの、線の矩形で囲まれた部分木８０２は中間語コードの中で検証対象記述部と一致した中間語命令列、破線の矩形で囲まれた部分木８０４は定型の部分である。
【００２７】
検証対象記述部、条件記述部、エラー時動作記述部は、ソースコードを記述したのと同じプログラム言語で記述する。この実施例では、いずれもＣ言語で記述している。検証対象記述部、条件記述部およびエラー時動作記述部では、指定されたソースファイル１０２において、大域的な有効範囲をもつ名前が参照できる。検証コード記述ファイル解析部１０８は、検証対象記述部、条件記述部、エラー時動作記述部の内部に書かれたコード部分を切り出してコンパイラフロント部１０７にわたし、中間語コードに翻訳させる。図９、図１０、図１１は、それぞれ検証対象記述部、条件記述部、エラー時動作記述部を中間語に翻訳した結果である。図８の構文解析木の部分木８０１、８０２、８０３は、主記憶装置中では、それぞれ図９、図１０、図１１のようにあらわされる。
【００２８】
図１２は、主記憶装置１０５内に配置される検証中間語コードテンプレートを示す。検証中間語コードテンプレート１１１は、図８の構文解析木の中の部分木８０４に相当する中間語命令列であり、検証用の中間語コードの定型部分を与えるものである。検証中間語コードテンプレート内の中間語命令のいくつかは、未定部分をもっている。図１２の中では、未定部分は、Ｘ４１、Ｘ４２、Ｘ４２、Ｘ４４という記号であらわしてある。
【００２９】
コンパイラフロント部１０７が、検証対象記述部、条件記述部、エラー時動作記述部を処理した際に、新しいシンボルや新しい定数を見つけると、それぞれシンボルテーブルまたは定数テーブルに追記される。図１３と図１４は、図７の検証記述ファイルを処理した結果、更新されたシンボルテーブルと定数テーブルの例を示す。図７のエラー時動作記述部に“ＰｒｉｎｔＭｅｓｓａｇｅ”という新しい手続き名があらわれるため、末尾に１行が追加されている。また、図７の条件記述部には定数として“１”と“５”があらわれるため、図５のもとの定数テーブルのうしろに２行が追加されている。
【００３０】
図１５は、検証コード管理テーブルを示す。検証コード管理テーブルには、ｉｄ欄１５０２、ｃｏｎｄ欄１５０３、ａｃｔｉｏｎ欄１５０４がある。ｉｄ欄１５０２には、コンパイラフロント部１０７が検証対象記述部を処理した結果得られた中間語命令列の先頭アドレスが格納される。ｃｏｎｄ欄１５０３には、コンパイラフロント部１０７が条件記述部を処理した結果結果得られた中間語命令列の先頭アドレスが格納される。ａｃｔｉｏｎ欄１５０４には、コンパイラフロント部１０７がエラー時動作記述部を処理した結果得られた中間語命令列の先頭アドレスが格納される。検証コード記述ファイル１０３中に記述されている検証記述部ひとつにつき１行が登録され、さらに、末尾に検証コード管理テーブルの末尾を示す行として、ｉｄ欄１５０２、ｃｏｎｄ欄１５０３、ａｃｔｉｏｎ欄１５０４のいずれも０にした行が登録される。
【００３１】
図１６は、検証対象検索部１１０が、中間語コード１１４を走査して、検証中間語コード１１４の検証対象中間語コードと一致する部分を検索する手順を示すフローチャートである。まず、検証コード管理テーブルの最初の行であるＡ５０１のｉｄ欄が０でないかどうか調べる（ステップ１６０１）。０の場合は検証コード管理テーブルが空であるので、処理を終了する。０以外の場合は検証コード管理テーブルに１個以上の行が含まれるため、実際の検索処理に進む。検索の開始位置Ａ００１および検索の終了位置Ａ０１７をそれぞれ変数ｐとｅｎｄｐに設定する（ステップ１６０２）。次に、変数ｑｔに検証コード管理テーブルの先頭行のアドレスＡ５０１を設定する（ステップ１６０３）。次に変数ｑにｑｔがさす行のｉｄ欄１５０２の値を代入する（ステップ１６０４）。ｑが０の場合は検証コード管理テーブルの末尾に到達しているので、ステップ１６０３にもどって検証コード管理の先頭から検索をやり直す。ｑが０以外の場合、次のステップ１６０６に進む（ステップ１６０５）。次に、手続きｅｑｕｉｖを呼び出して、ｐではじまる中間語命令列とｑではじまる中間語命令列が等価かどうかを調べる。等価でなければ、ステップ１６０７に進んでｑｔを次行に進め、ステップ１６０４にもどる。等価の場合は、ステップ１６０８に進んで検証コード挿入部を呼び出す（ステップ１６０６）。ｐがｅｎｄｐと同じになっていなければ、ｐはまだ中間語コードの末尾に達していないため、ｐのｎｅｘｔ欄から次の行のアドレスをとりだしてｐに設定し、ステップ１６０３にもどって検索を続行する。ｐがｅｎｄｐと同じ値になっている場合は、検索処理は既に中間語コードの末尾行までおわっているため、処理を終了する。
【００３２】
図１７に、アドレスｐ、ｑではじまる２つの中間語コード列の等価性を評価する手続きｅｑｕｉｖのフローチャートを示す。まず、結果を偽にしておく（ステップ１７０１）。
ｐとｑの両方が０の場合、ｐおよびｑではじまる中間語命令列は等価とみなし、ステップ１７０６に進んで結果を真にして終了する（ステップ１７０２）。
【００３３】
ｐおよびｑのいずれか一方が０の場合、アドレスｐ、ｑではじまる中間語命令列は等価ではないので、結果は偽のまま終了する（ステップ１７０３）。ｐとｑのどちらも０ではない場合は、ステップ１７０４に進んでｐおよびｑのさす行のｏｐｃｏｄｅ欄６０２とｌｉｎｋ欄６０５が一致しているかどうかを調べる（ステップ１７０３）。ｐおよびｑのさす行のｏｐｃｏｄｅ欄６０２とｌｉｎｋ欄６０５が一致していなければ結果は偽のまま終了する。一致している場合は、ステップ１７０５に進んでｐおよびｑのさす中間語命令の子ノード群がそれぞれ等価かどうかを調べる（ステップ１７０４）。子ノードの等価性の評価方法は、ここで示した手続きｅｑｕｉｖと同しため、ｐのｃｈｉｌｄ１欄６０６とｑのｃｈｉｌｄ１欄６０６、ｐのｃｈｉｌｄ２欄６０７とｑのｃｈｉｌｄ２欄６０７、ｐのｃｈｉｌｄ３欄６０８とｑのｃｈｉｌｄ３欄６０８について、それぞれｅｑｕｉｖを適用する。各子ノードに適用したｅｑｕｉｖの結果が、すべて真であれば、ｐとｑではじまる中間語命令列は等価であるため、ステップ１７０６に進んで結果を真にし、終了する。そうでなければ、ｐとｑではじまる中間語命令列は等価ではないため、結果は偽のままで終了する（ステップ１７０５）。
【００３４】
アドレスｐおよびｑではじまる中間語命令列が評価手続きｅｑｕｉｖによって等価と評価された場合、検証対象検索部１１０は、検証コード挿入部１１２を呼び出して、中間語コード１１４に検証用の中間語命令列を追加する。図１８は、検証コード挿入部１１２が中間語コード１１４に検証用の中間語命令列を追加する手順ｉｎｓｅｒｔを示したフローチャートである。
【００３５】
ｉｎｓｅｒｔは、まず、検証中間語コードテンプレートの複製、検証条件中間語コードの複製およびエラー時動作中間語コードの複製を、この順で中間語コード１１２の末尾に追加する（処理1、ステップ１８０１）。次に、ｉｎｓｅｒｔは、追加前の中間語コード部分と、追加した検証対象中間語コードテンプレート部分、検証条件中間語コード部分およびエラー時動作中間語コード部分の各アドレスの参照関係が適切になるように、各々のｎｅｘｔ欄６０３、ｐａｒｅｎｔ欄６０４、ｃｈｉｌｄ１欄６０６、ｃｈｉｌｄ２欄６０７、ｃｈｉｌｄ３欄６０８の値を書き換える。具体的には、次のような手順で書き換えをおこなう。ｐと検証用の中間語コードをつなぎかえるため、ｐのｐａｒｅｎｔ欄６０４からｐの親ノードのアドレスｐｐをとりだし、ｐｐのｎｅｘｔ欄６０３をＡ４０１に書き換え、Ａ４０１のｐａｒｅｎｔ欄６０４をｐｐに書き換える（ステップ１８０２）。ｐについては、Ａ４０２の子ノードに変更するため、ｐａｒｅｎｔ欄６０４をＡ４０２に書き換え、ｎｅｘｔ欄６０３をＡ４０３に書き換え、Ａ４０２のｎｅｘｔ欄６０３をｐに書き換える（ステップ１８０３）。検証中間語コードテンプレート部分については、Ａ４０１のｎｅｘｔ欄６０３とｃｈｉｌｄ１欄６０６をＡ２０１に書き換え、Ａ４０４のｎｅｘｔ欄６０３をＡ３０１に書き換える（ステップ１８０４）。検証条件中間コード部分については、Ａ２０１のｐａｒｅｎｔ欄６０４をＡ４０１に書き換え、Ａ２０７のｎｅｘｔ欄６０３をＡ４０２に書き換える（ステップ１８０５）。エラー時動作中間語コード部分については、Ａ３０１のｐａｒｅｎｔ欄６０４をＡ４０４に書き換え、Ａ３０５のｎｅｘｔ欄６０３をＡ４０５に書き換える（ステップ１８０６）。
【図面の簡単な説明】
【００３６】
【図１】本実施形態のプログラミング言語処理系のソフトウェア・コンポーネント群およびファイル等のリソース群、ハードウェア装置群の関連を示す全体構成図である。
【図２】本実施形態のプログラミング言語処理系があつかうソースコードの例である。
【図３】本実施形態のプログラミング言語処理系があつかうソースコードを、コンパイラフロント部が構文解析した結果得られる構文解析木の例である。
【図４】本実施形態のプログラミング処理系があつかうソースコードを、コンパイラフロント部が構文解析した結果得られるシンボルテーブルの例である。
【図５】本実施形態のプログラミング処理系があつかうソースコードを、コンパイラフロント部が構文解析した結果得られる定数テーブルの例である。
【図６】本実施形態のプログラミング処理系があつかうソースコードを、コンパイラフロント部が構文解析した結果得られる中間語命令列の例である。
【図７】本実施形態のプログラミング言語処理系があつかう検証コード記述ファイルの例である。
【図８】本実施形態のプログラミング言語処理系があつかう検証コード記述ファイルを、検証コード記述ファイル解析部が解析した結果、得られる検証用中間語コードの構文木の例である。
【図９】本実施形態の検証コード記述ファイル内の検証対象記述部をコンパイラフロント部が解析した結果得られる中間語命令列の例である。
【図１０】本実施形態の検証コード記述ファイル内の条件記述部をコンパイラフロント部が解析した結果得られる中間語命令列の例である。
【図１１】本実施形態の検証コード記述ファイル内のエラー時動作記述部をコンパイラフロント部が解析した結果得られる中間語命令列の例である。
【図１２】本実施形態の検証中間語コードテンプレートの例である。
【図１３】本実施形態の検証コード記述ファイル内の検証対象記述部、条件記述部、エラー時動作記述部をコンパイラフロント部が処理することで得られるシンボルテーブルの更新結果の例である。
【図１４】本実施形態の検証コード記述ファイル内の検証対象記述部、条件記述部、エラー時動作記述部をコンパイラフロント部が処理することで得られる定数テーブルの更新結果の例である。
【図１５】本実施形態の検証コード記述ファイルを検証コード記述ファイル解析部が処理した結果得られる検証コード管理テーブルの例である。
【図１６】本実施形態の検証対象検索部が中間語コード内から検証対象記述部に記述したコードと一致する部分を検索する手順を示すフローチャートである。
【図１７】本実施形態の検証対象検索部が与えられた２つの中間語命令列が等価かどうかを判断する手順を示すフローチャートである。
【図１８】本実施形態の検証コード挿入部が中間語コード内に検証用の中間語コードを挿入する手順を示すフローチャートである。
【符号の説明】
【００３７】
１０１  外部記憶装置
１０２  ソースファイル
１０３  検証コード記述ファイル
１０４  オブジェクトファイル
１０５  主記憶装置
１０６  コンパイラ制御部
１０７  コンパイラフロント部
１０８  検証コード記述ファイル解析部
１０９  検証中間語コード
１１０  検証対象検索部
１１１  検証中間語コードテンプレート
１１２  検証コード挿入部
１１３  コンパイラバック部
１１５  ＣＰＵ
１１６  入力装置
１１７  出力装置
２０１、２０２、２０３、２０４、２０５、２０６  Ｃ言語ソースコード例の文
４０１  ａｄｄｒ欄
４０２  ｓｙｍｂｏｌ欄
５０２  ｖａｌｕｅ欄
６０２  ｏｐｃｏｄｅ欄
６０３  ｎｅｘｔ欄
６０４  ｐａｒｅｎｔ欄
６０５  ｌｉｎｋ欄
６０６  ｃｈｉｌｄ１欄
６０７  ｃｈｉｌｄ２欄
６０８  ｃｈｉｌｄ３欄
７０１、７０２、７０３、７０４、７０５、７０６、７０７、７０８、７０９、７１０、７１１  検証コード記述ファイルの行
８０１  検証コード記述ファイルの検証対象記述部から生成された構文解析木
８０２  検証コード記述ファイルの条件記述部から生成された構文解析木
８０３  検証コード記述ファイルのエラー時動作記述部から生成された構文解析木
８０４  検証用の中間語命令列の定型部分
１５０２  ｉｄ欄
１５０３  ｃｏｎｄ欄
１５０４  ａｃｔｉｏｎ欄
【図１】
2010266909.tif 000003
【図２】
2010266909.tif 000004
【図３】
2010266909.tif 000005
【図４】
2010266909.tif 000006
【図５】
2010266909.tif 000007
【図６】
2010266909.tif 000008
【図７】
2010266909.tif 000009
【図８】
2010266909.tif 000010
【図９】
2010266909.tif 000011
【図１０】
2010266909.tif 000012
【図１１】
2010266909.tif 000013
【図１２】
2010266909.tif 000014
【図１３】
2010266909.tif 000015
【図１４】
2010266909.tif 000016
【図１５】
2010266909.tif 000017
【図１６】
2010266909.tif 000018
【図１７】
2010266909.tif 000019
【図１８】
2010266909.tif 000020