(57)【特許請求の範囲】
【請求項１】
条件文におけるＥＮＤ−ＩＦ文とＣＯＮＴＩＮＵＥ文をサポートしていない旧バージョンのＣＯＢＯＬ言語によって記述された変換前ソースコードを、条件文におけるＥＮＤ−ＩＦ文とＣＯＮＴＩＮＵＥ文をサポートする新バージョンのＣＯＢＯＬ言語によって記述された変換後ソースコードへ変換する処理を、コンピュータに実行させるＣＯＢＯＬソースコード変換プログラムであって、前記コンピュータに、
前記変換前ソースコードを記憶装置から読み取る読取ステップ、
前記変換前ソースコードが記述している処理のうち、ＩＦ文とＥＬＳＥ文によって構成された条件分岐処理であってＮＥＸＴ  ＳＥＮＴＥＮＣＥ文によってその条件分岐が終端しているものを特定する第１特定ステップ、
前記変換前ソースコードが記述している処理のうち、ＩＦ文とＥＬＳＥ文によって構成された条件分岐処理であってピリオドによってその条件分岐が終端しているものを特定する第２特定ステップ、
前記第１特定ステップにおいて特定した条件分岐の終了箇所にＥＮＤ−ＩＦ文を挿入する第１挿入ステップ、
前記第２特定ステップにおいて特定した条件分岐の終了箇所にＥＮＤ−ＩＦ文を挿入する第２挿入ステップ、
を実行させ、
前記読取ステップにおいては、前記コンピュータに、前記変換前ソースコードを１文ずつ読み取るステップを実行させ、
前記ＣＯＢＯＬソースコード変換プログラムはさらに、前記コンピュータに、
前記読取ステップにおいて読み取った前記変換前ソースコードの文がＩＦ文である場合はその旨を示すＩＦ文識別子を前記コンピュータ上に構築したスタック領域の先頭にプッシュし、ＥＬＳＥ文である場合はその旨を示すＥＬＳＥ文識別子を前記スタック領域の先頭にプッシュするステップを実行させ、
前記第１特定ステップにおいては、前記コンピュータに、
前記読取ステップにおいて読み取った前記変換前ソースコードの文がＥＬＳＥ文であり、かつ前記スタック領域の先頭に前記ＥＬＳＥ文識別子が格納されている場合は、そのＥＬＳＥ文識別子が表すＥＬＳＥ文の後に条件分岐が閉じられている箇所が存在するものと判定するステップを実行させる
ことを特徴とするＣＯＢＯＬソースコード変換プログラム。
【請求項２】
前記第１挿入ステップにおいては、前記コンピュータに、
前記スタック領域の先頭から前記ＥＬＳＥ文識別子と前記ＩＦ文識別子のペアを削除する処理を、前記スタック領域の先頭が前記ＥＬＳＥ文識別子でなくなるまで繰り返すとともに、その繰り返し回数だけＥＮＤ−ＩＦ文を挿入するステップを実行させ、
前記第２挿入ステップにおいては、前記コンピュータに、
前記スタック領域の先頭から前記ＥＬＳＥ文識別子と前記ＩＦ文識別子のペアを削除する処理を、前記スタック領域の先頭が前記ＥＬＳＥ文識別子でなくなるまで繰り返すとともに、その繰り返し回数だけＥＮＤ−ＩＦ文を挿入するステップを実行させる
ことを特徴とする請求項１記載のＣＯＢＯＬソースコード変換プログラム。
【請求項３】
前記ＣＯＢＯＬソースコード変換プログラムはさらに、前記コンピュータに、
前記変換前ソースコード内のＮＥＸＴ  ＳＥＮＴＥＮＣＥ文をＣＯＮＴＩＮＵＥ文に変換する変換ステップを実行させる
ことを特徴とする請求項１記載のＣＯＢＯＬソースコード変換プログラム。
【請求項４】
前記ＣＯＢＯＬソースコード変換プログラムはさらに、前記コンピュータに、
前記第１挿入ステップおよび前記第２挿入ステップにおいて挿入したＥＮＤ−ＩＦ文の前記変換後ソースコード上における行頭からのインデントをＩＦ文のネスト深さに応じて調整するステップを実行させる
ことを特徴とする請求項１記載のＣＯＢＯＬソースコード変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＣＯＢＯＬ言語によって記述されたソースコードを変換する技術に関する。
【背景技術】
【０００２】
ＣＯＢＯＬ言語は、近年におけるオープンコンピューティング環境が登場する前から長年にわたって用いられているプログラム言語である。プログラムソースコードの品質検査はソフトウェアの品質管理における重要な要素であり、ＣＯＢＯＬ言語によって記述されたソースコードも同様である。
【０００３】
目視確認によるソースコードの品質検査は、検査精度と負担の両面において課題があるので、一般的には自動チェック技術が用いられている。しかしＣＯＢＯＬ言語によって記述されたソースコードについては、そのような自動チェック技術が他言語と比較するとあまり用いられていない傾向がある。下記特許文献１は、かかる状況に鑑みて、ＣＯＢＯＬソースコードを自動チェックする技術を開示している。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１１−１６４９５４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＣＯＢＯＬ言語は、言語仕様のバージョンアップにともなって命令文の構成がこれまで変更されてきた経緯がある。比較的バージョンの新しいＣＯＢＯＬ言語においては、条件文（ＩＦ文）は明示範囲符（ＥＮＤ−ＩＦ文）とＣＯＮＴＩＮＵＥ文によってその範囲が指定される。しかしバージョンが古いＣＯＢＯＬ言語の言語仕様は、これら２つの文をサポートしていない。したがって、例えばプログラムを実行するプラットフォームを移行する際に、旧バージョンのＣＯＢＯＬ言語によって記述された変換前ソースコードを新バージョンのＣＯＢＯＬ言語によって記述された変換後ソースコードへ変換する場合がある。この変換は一般に、プログラマがマニュアル作業によって実施している。
【０００６】
上記のような古いバージョンのＣＯＢＯＬ言語においては、条件文の分岐や終端を明示的に示す命令が存在していないので、代替的な命令文を用いて同様の処理を実現している場合がある。そうすると、特に条件文のネストが深くなるほど条件文の範囲を判定し難くなり可読性が低下するので、マニュアル作業による変換作業の効率や変換精度の観点から課題がある。
【０００７】
上記特許文献１記載の技術は、ＣＯＢＯＬソースコードの書式をチェックすることはできるものの、新旧バージョン間の変換については開示しておらず、したがってかかる変換を効率的かつ精度よく実施することができる技術が求められている。
【０００８】
本発明は、上記のような課題に鑑みてなされたものであり、旧仕様のＣＯＢＯＬ言語によって記述されたソースコードを新仕様のＣＯＢＯＬ言語によって記述されたソースコードへ自動的に変換する技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明に係るＣＯＢＯＬソースコード変換プログラムは、旧仕様のＣＯＢＯＬ言語によって記述されたソースコードにおいて条件文の終端を示すため代替的に用いられている命令を特定し、その箇所にＥＮＤ−ＩＦ文を挿入する。
【発明の効果】
【００１０】
本発明に係るＣＯＢＯＬソースコード変換プログラムによれば、条件文におけるＥＮＤ−ＩＦ文とＣＯＮＴＩＮＵＥ文をサポートしていない旧バージョンのＣＯＢＯＬ言語によって記述された変換前ソースコードを、これらをサポートする新バージョンのＣＯＢＯＬ言語によって記述された変換後ソースコードへ自動変換することができる。
【図面の簡単な説明】
【００１１】
【図１】実施形態１に係るＣＯＢＯＬソースコード変換プログラム１２０を実行するコンピュータ１００およびその周辺構成を示す図である。
【図２】変換前ソースコード３１０と変換後ソースコード３２０との間の言語仕様の違いを例示するサンプルソースコードである。
【図３】２分ヒープ２１０の例を示す図である。
【図４】ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０の構文構造を解析する手順を説明する図である。
【図５】実施形態２に係るＣＯＢＯＬソースコード変換プログラム１２０を実行するコンピュータ１００およびその周辺構成を示す図である。
【図６】スタック２２０の例を示す図である。
【図７】ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０の構文構造を解析する手順を説明する図である。
【図８】実施形態２におけるＣＯＢＯＬソースコード変換プログラム１２０の動作を説明するアルゴリズムの例である。
【図９】実施形態３に係るＣＯＢＯＬソースコード変換プログラム１２０の動作を説明する図である。
【発明を実施するための形態】
【００１２】
＜実施の形態１＞
図１は、本発明の実施形態１に係るＣＯＢＯＬソースコード変換プログラム１２０を実行するコンピュータ１００およびその周辺構成を示す図である。コンピュータ１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１１０、ＣＯＢＯＬソースコード変換プログラム１２０、記憶装置２００を備える。
【００１３】
ＣＯＢＯＬソースコード変換プログラム１２０は、変換前ソースコード３１０を変換後ソースコード３２０へ変換する処理を実装したプログラムである。ＣＯＢＯＬソースコード変換プログラム１２０、変換前ソースコード３１０、および変換後ソースコード３２０は、記憶装置２００に格納することもできるしその他適当な記憶装置に格納することもできる。
【００１４】
ＣＰＵ１１０は、ＣＯＢＯＬソースコード変換プログラム１２０を実行する演算装置である。以下では記載の便宜上、ＣＯＢＯＬソースコード変換プログラム１２０を動作主体として説明する場合があるが、実際にこれを実行するのはＣＰＵ１１０であることを付言しておく。
【００１５】
記憶装置２００は、例えばハードディスク装置やメモリ装置などのデバイスであり、ＣＯＢＯＬソースコード変換プログラム１２０が構築する２分ヒープ２１０を格納する。２分ヒープ２１０の詳細については後述する。
【００１６】
変換前ソースコード３１０は、旧バージョンのＣＯＢＯＬ言語によって記述されたソースコードである。ここでいう旧バージョンのＣＯＢＯＬ言語とは、条件文におけるＥＮＤ−ＩＦ文とＣＯＮＴＩＮＵＥ文をサポートしていない言語仕様を有するＣＯＢＯＬ言語である。したがって変換前ソースコード３１０は、特に条件文のネストが深くなった場合においてその条件文の分岐や終端を目視確認することが困難であり、上述の課題を有している。
【００１７】
変換後ソースコード３２０は、新バージョンのＣＯＢＯＬ言語によって記述されたソースコードである。ここでいう新バージョンのＣＯＢＯＬ言語とは、条件文におけるＥＮＤ−ＩＦ文とＣＯＮＴＩＮＵＥ文をサポートしている言語仕様を有するＣＯＢＯＬ言語である。
【００１８】
＜実施の形態１：新旧バージョンの違いについて＞
図２は、変換前ソースコード３１０と変換後ソースコード３２０との間の言語仕様の違いを例示するサンプルソースコードである。見易さを考慮して、変換した部分に網掛けを付与するとともに、ＩＦ条件文の範囲を示す符号を付与しているが、実際のソースコードにおいてこれらは存在していないことを付言しておく。以下に説明するソースコードも同様である。
【００１９】
変換前ソースコード３１０と変換後ソースコード３２０は、ＣＯＢＯＬ言語のバージョンの違いに起因して、条件文の記述方式について以下の違いがある。
【００２０】
変換後ソースコード３２０においては、ＣＯＮＴＩＮＵＥ文（次の実行可能な文に進む命令）がサポートされているので、条件文内における制御を次の文に進めたい場合はＣＯＮＴＩＮＵＥ文を記述すればよい。また変換後ソースコード３２０においては、ＥＮＤ−ＩＦ文（条件文における明示範囲符）がサポートされているので、ＩＦ文とＥＬＳＥ文のペアによって記述される条件文の終端においてＥＮＤ−ＩＦ文を記述することにより、当該条件文の終端を明示的に示すことができる。これにより条件文の範囲を容易に把握することができるので、例えばソースコードを目視確認する際に便宜である。
【００２１】
これに対し変換前ソースコード３１０においては、ＣＯＮＴＩＮＵＥ文とＥＮＤ−ＩＦ文がサポートされていない。そこで変換前ソースコード３１０においては、これらの代わりにＮＥＸＴ  ＳＥＮＴＥＮＣＥ文とピリオド（終端符）を用いて、条件文の分岐や範囲を制御している。したがって、特に条件文のネストが深くなった場合において、各条件文の範囲などが一見すると判別し難い課題がある。
【００２２】
そこでＣＯＢＯＬソースコード変換プログラム１２０は、変換前ソースコード３１０が記述している条件文の終端部分に対してＥＮＤ−ＩＦ文を自動挿入するとともに、ＮＥＸＴ  ＳＥＮＴＥＮＣＥ文（またはＮＥＸＴ  ＳＥＮＴＥＮＣＥ文＋ピリオド）をＣＯＮＴＩＮＵＥ文へ変換する。これにより、条件文の分岐や範囲を明確にすることを図る。
【００２３】
＜実施の形態１：２分ヒープ２１０について＞
ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０を変換するに際して、変換前ソースコード３１０のＩＦ条件文の構文構造を把握し、これを何らかのデータ形式によってコンピュータ１００上で表現する必要がある。そこでＣＯＢＯＬソースコード変換プログラム１２０は、以下に説明する原理にしたがって、変換前ソースコード３１０の構文構造を表した２分ヒープ２１０を作成する。
【００２４】
ＣＯＢＯＬ言語におけるＩＦ条件文は、１つのＩＦ文に対してその条件が成立する場合の処理と成立しない場合の処理のペアにより構成される。すなわち、必ず「ＩＦ（条件）・・・ＥＬＳＥ・・・ＥＮＤ−ＩＦ」という構文構造となる。これに対し他のプログラム言語のＩＦ条件文は、例えば「ＩＦ（条件１）・・・ＥＬＳＥ  ＩＦ（条件２）・・・ＥＬＳＥ・・・」などのように、１つのＩＦ文に対して複数の分岐先が含まれる場合がある。
【００２５】
ＣＯＢＯＬ言語におけるＩＦ条件文の上記特徴を利用すると、変換前ソースコード３１０のＩＦ条件文の構文構造は、２分ヒープ（２分ツリー構造の一種）によって表すことができる。そこでＣＯＢＯＬソースコード変換プログラム１２０は、変換前ソースコード３１０のＩＦ条件文の構文構造を記述した２分ヒープ２１０を作成し、これを用いて変換を実施する。
【００２６】
ＣＯＢＯＬソースコード変換プログラム１２０は、以下のルールにしたがって２分ヒープ２１０を作成する。
（ルール１）ＩＦ文を記述しているソースコード行は、２分ヒープ２１０の根ノードまたは親ノードとして表す。
（ルール２）親ノードが表すＩＦ条件が成立した場合の処理を記述しているソースコード行は、当該親ノードの左側子ノードとして表す。同条件が成立しなかった場合の処理を記述しているソースコード行は、当該親ノードの右側子ノードとして表す。
（ルール３）条件文以外の処理は、葉ノードとして表す。
【００２７】
図３は、２分ヒープ２１０の例を示す図である。ここではまず２分ヒープ２１０とＣＯＢＯＬソースコードとの間の対応関係を説明するため、図２で例示した変換後ソースコード３２０を２分ヒープによって表した例を示した。また両者の対応関係を示すため、変換後ソースコード３２０の各行に行番号を付与するとともに、対応する２分ヒープ２１０のノードに対して同じ番号を付与した。なお本明細書においては記載の簡易のため１文が複数行にまたがって記述されている場合を考慮していないが、その場合はそれら複数行をまとめて１つの行として取り扱えばよい。
【００２８】
変換後ソースコード３２０の１行目〜３行目は、条件１が成立した上でさらに条件２が成立した場合の処理なので、２分ヒープ２１０においては根ノードから左側子ノードに向かって２回進むことになる。３行目の処理は葉ノードによって表されている。４行目のＥＬＳＥ文は２行目のＩＦ文に対応する親ノードそのものによって表されているので、２分ヒープ２１０上では必要ない。
【００２９】
６行目の条件４が成立した場合は７行目の処理を実行し、成立しなかった場合は９行目の処理を実行する。条件４のＩＦ文はこれらによって完結しているので、９行目に対応する右側子ノードは葉ノードとなり、その配下にはノードが存在していない。したがって、右側子ノードが葉ノードである場合、その箇所においてＩＦ条件文が完結している（すなわちＥＮＤ−ＩＦ文が配置されている）とみなすことができる。同様に、５行目の条件３が成立した場合は６行目〜１０行目を実行し、成立しなかった場合は１２行目の処理を実行し、条件３のＩＦ文はこれらによって完結している。したがって１２行目に対応する右側子ノードは葉ノードである。
【００３０】
１行目のＩＦ文は、１７行目のピリオドによって終端されている。したがって１６行目の右側子ノードも葉ノードとなり、その箇所においてＩＦ条件文が完結している（すなわちＥＮＤ−ＩＦ文が配置されている）とみなすことができる。この葉ノードは、２分ヒープ２１０の右端ノードとなっている。
【００３１】
＜実施の形態１：変換前ソースコード３１０の解析＞
図４は、ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０の構文構造を解析する手順を説明する図である。ここでは図２で例示した変換前ソースコード３１０を２分ヒープによって表した例を示した。また変換後ソースコード３２０との間の対応関係を示すため、対応するソースコード行に対して変換後ソースコード３２０と同じ行番号を付与した。
【００３２】
変換前ソースコード３１０と変換後ソースコード３２０は同じ条件文の構文構造を有しているので、これらを２分ヒープ２１０として表した結果は同一である。ただし変換前ソースコード３１０はＥＮＤ−ＩＦ文を有していないので、ＩＦ条件文の終結箇所についてはこれを用いずに判定する必要がある。例えばＥＬＳＥ文の後の処理が完了すると、そのＥＬＳＥ文に対応するＩＦ文が終結したとみなすことができる。
【００３３】
ＣＯＢＯＬソースコード変換プログラム１２０は、変換前ソースコード３１０内のＮＥＸＴ  ＳＥＮＴＥＮＣＥ文またはＮＥＸＴ  ＳＥＮＴＥＮＣＥ文＋ピリオドを、ＣＯＮＴＩＮＵＥ文に変換する。この変換は単純な文字列置換によって実施することができるのでここでは格別説明しない。
【００３４】
ＣＯＢＯＬソースコード変換プログラム１２０はさらに、変換前ソースコード３１０内のＩＦ条件文の範囲を明示するため、ＥＮＤ−ＩＦ文を挿入する。以下、図４を参照しつつその手順について説明する。
【００３５】
変換前ソースコード３１０の９行目の処理が終わると、６行目から開始するＩＦ条件文が終結する。その後、プログラムの実行箇所は５行目のＩＦ条件文のＥＬＳＥ文（すなわち１１〜１２行目）に移る。変換後ソースコード３２０においてはこの過程でＥＮＤ−ＩＦ文が１０行目に配置されているので、６行目から開始するＩＦ条件文の終結箇所を目視確認し易い。ＣＯＢＯＬソースコード変換プログラム１２０は、このようにＩＦ条件文が終結している箇所に対してＥＮＤ−ＩＦ文を挿入する。
【００３６】
９行目から１１行目（および１２行目）へ至る経路は、２分ヒープ２１０上においては、右側子ノードである９行目から、１つ上の親ノードである５行目を経由して、その右側子ノードである１２行目へ実行箇所を移すことに相当する。このように右側子ノードの次に別の右側子ノードを実行する箇所は、変換前ソースコード３１０上においてはＩＦ条件文のＥＬＳＥ文が終結して１つ上のＩＦ条件文のＥＬＳＥ文へ進む箇所であるとみなすことができる。したがってＣＯＢＯＬソースコード変換プログラムは、経由した親ノードに対応するＩＦ条件文の終結を明示するため、２分ヒープ２１０上のかかる箇所に対応する変換前ソースコード３１０上の位置に対して、ＥＮＤ−ＩＦ文を挿入する。この例においては、９行目から１１行目（および１２行目）へ進む前にＥＮＤ−ＩＦ文を挿入することになる。
【００３７】
１２行目から１５行目（および１６行目）へ至る経路は、２分ヒープ２１０上においては、右側子ノードである１２行目から、２つ上の親ノードである１行目を経由して、その右側子ノードである１６行目へ実行箇所を移すことに相当する。この場合も右側子ノードの次に別の右側子ノードを実行することになる。ただし２つ上の親ノードを経由しているということは、その過程において２つのＩＦ条件文が終結していることになるので、ＣＯＢＯＬソースコード変換プログラムは１２行目から１５行目へ至る間に２つのＥＮＤ−ＩＦ文を挿入する。
【００３８】
すなわちＣＯＢＯＬソースコード変換プログラム１２０は、２分ヒープ２１０上における右側子ノードの次に別の右側子ノードを実行する場合は、経由する親ノードの個数と同数のＥＮＤ−ＩＦ文を、それら右側子ノードの間に対応するソースコード上の位置に対して挿入する。
【００３９】
１６行目のＮＥＸＴ  ＳＥＮＴＥＮＣＥ文は、ピリオドによって終端されているので、１行目のＩＦ条件文が終結していることになる。２分ヒープ２１０上においては、１６行目に対応する右側子ノードが右端ノードとなっている。ＣＯＢＯＬソースコード変換プログラム１２０は、２分ヒープ２１０上で右端ノードに到達した場合も、その後にＥＮＤ−ＩＦ文を挿入する。
【００４０】
ＣＯＢＯＬソースコード変換プログラム１２０は、以上の手順にしたがって２分ヒープ２１０の各ノードを走査することにより、変換前ソースコード３１０に対してＥＮＤ−ＩＦ文を挿入すべき個所とその個数を判定することができる。
【００４１】
＜実施の形態２＞
実施形態１で説明した２分ヒープ２１０と等価な構造は、プログラム処理上においては様々なデータ形式によって表すことができる。本発明の実施形態２では、スタック（Ｌａｓｔ−Ｉｎ  Ｆｉｒｓｔ−Ｏｕｔのデータ構造）を用いてＩＦ条件文の構文構造を表す処理例について説明する。
【００４２】
図５は、本実施形態２に係るＣＯＢＯＬソースコード変換プログラム１２０を実行するコンピュータ１００およびその周辺構成を示す図である。コンピュータ１００は、実施形態１で説明した２分ヒープ２１０と等価なデータ構造を格納するスタック２２０を記憶領域上に保持する。その他の構成は実施形態１と同様であるため、以下ではスタック２２０を用いて２分ヒープ２１０と等価な構文解析を実施する手順について主に説明する。
【００４３】
＜実施の形態２：スタック２２０について＞
ＣＯＢＯＬソースコード変換プログラム１２０は、ＣＯＢＯＬソースコードを１行ずつ（すなわち１文ずつ）読み込み、以下のルールにしたがってスタック２２０を作成する。
（ルール１）読み込んだ文がＩＦ文である場合は、スタック２２０の先頭にその旨を示す値（以下ではＩＦ文識別子と呼ぶ）をプッシュする。
（ルール２）読み込んだ文がＥＬＳＥ文である場合は、スタック２２０の先頭にその旨を示す値（以下ではＥＬＳＥ文識別子と呼ぶ）をプッシュする。
（ルール３）ＩＦ条件文が終結した場合は、スタック２２０の先頭からＥＬＳＥ文識別子とＩＦ文識別子のペアを削除する。
【００４４】
図６は、スタック２２０の例を示す図である。ここではまずスタック２２０とＣＯＢＯＬソースコードとの間の対応関係を説明するため、図２で例示した変換後ソースコード３２０をスタック２２０によって表した例を示した。また両者の対応関係を示すため、変換後ソースコード３２０の各行に行番号を付与するとともに、スタック２２０の要素の経時変化に対して同じ番号を付与した。
【００４５】
変換後ソースコード３２０の１行目〜２行目は、ＩＦ条件文が記述されているので、スタック２２０の先頭に対してそれぞれＩＦ文識別子を格納する。３行目はＩＦ文でもなくＥＬＳＥ文でもないので、スタック２２０はそのままである。４行目はＥＬＳＥ文が記述されているので、スタック２２０の先頭に対してＥＬＳＥ文識別子を格納する。
【００４６】
変換後ソースコード３２０の１０行目においてＥＮＤ−ＩＦ文により６行目のＩＦ条件文が終結しているので、スタック２２０の先頭から順にＥＬＳＥ文識別子とＩＦ文識別子を削除する。１３行目〜１４行目についても同様である。ＥＬＳＥ文識別子とＩＦ文識別子を削除することは、これらが表すＩＦ条件文が終結したことに対応するものである。
【００４７】
変換後ソースコード３２０の１７行目においてピリオドにより１行目のＩＦ条件文が終結しているので、スタック２２０の先頭から順にＥＬＳＥ文識別子とＩＦ文識別子を削除する。
【００４８】
以上の手順により、ＩＦ文識別子とＥＬＳＥ文識別子のペアは、スタック２２０に対して格納されたのと同数が必ず削除され、最終的にスタック２２０の要素は空になる。ＣＯＢＯＬソースコード変換プログラム１２０は、図６に示す手順により、ＣＯＢＯＬソースコードのＩＦ条件文の構文構造を解析することができる。
【００４９】
＜実施の形態２：変換前ソースコード３１０の解析＞
図７は、ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０の構文構造を解析する手順を説明する図である。ここでは図２で例示した変換前ソースコード３１０をスタック２２０によって表した例を示した。また変換後ソースコード３２０との間の対応関係を示すため、対応するソースコード行に対して変換後ソースコード３２０と同じ行番号を付与した。
【００５０】
変換前ソースコード３１０と変換後ソースコード３２０は同じ条件文の構文構造を有しているので、これらをスタック２２０として表した結果は同一である。ただし見易さを考慮して、ＩＦ条件文の番号をスタック２２０内の各要素の括弧書きによって示している。例えばＥＬＳＥ（２）は、条件２のＩＦ文に対応するＥＬＳＥ文である。
【００５１】
ＣＯＢＯＬソースコード変換プログラム１２０は、先に説明したルール１とルール２にしたがってスタック２２０内にＩＦ文識別子とＥＬＳＥ文識別子を格納する。ただし変換前ソースコード３１０はＥＮＤ−ＩＦ文を有していないので、ルール３におけるＩＦ条件文が終結したか否かを判定する際に、以下の手順を用いる。
【００５２】
ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０の１１行目を読み込んだ時点において、スタック２２０の先頭には８行目のＥＬＳＥ文識別子（すなわちＥＬＳＥ（４））が格納されている。スタック２２０の先頭にＥＬＳＥ文識別子が格納されている状態において、変換前ソースコード３１０からさらにＥＬＳＥ文を読み込んだ場合、スタック２２０先頭のＥＬＳＥ文識別子に対応するＩＦ条件文は終結し、実行箇所はその１つ上のＩＦ条件文に移行したとみなすことができる。そこでＣＯＢＯＬソースコード変換プログラム１２０は、変換前ソースコード３１０から読み込んだ１文がＥＬＳＥ文であり、かつスタック２２０の先頭がＥＬＳＥ文識別子である場合は、読み込んだ１文の前にＥＮＤ−ＩＦ文を挿入する。ここでは１０行目にＥＮＤ−ＩＦ文を挿入することになる。ＣＯＢＯＬソースコード変換プログラム１２０はさらに、スタック２２０の先頭からＥＬＳＥ文識別子とＩＦ文識別子のペアを削除する。
【００５３】
ＣＯＢＯＬソースコード変換プログラム１２０が変換前ソースコード３１０の１５行目を読み込んだ時点において、スタック２２０の先頭にはＥＬＳＥ文識別子が格納されているので、ＣＯＢＯＬソースコード変換プログラム１２０はＥＮＤ−ＩＦ文を挿入するとともにスタック２２０の先頭からＥＬＳＥ文識別子とＩＦ文識別子のペア（すなわちＥＬＳＥ（３）とＩＦ（３））を削除する。その上でスタック２２０の先頭にはなおＥＬＳＥ文識別子（すなわちＥＬＳＥ（２））が格納されているので、ＣＯＢＯＬソースコード変換プログラム１２０はさらにＥＮＤ−ＩＦ文を挿入するとともにスタック２２０の先頭からＥＬＳＥ文識別子とＩＦ文識別子のペア（すなわちＥＬＳＥ（２）とＩＦ（２））を削除する。
【００５４】
すなわちＣＯＢＯＬソースコード変換プログラム１２０は、スタック２２０の先頭から削除したＥＬＳＥ文識別子とＩＦ文識別子のペアと同数のＥＮＤ−ＩＦ文を、変換前ソースコード３１０に対して挿入する。
【００５５】
変換前ソースコード３１０の１６行目はピリオドによって終端されている。ＣＯＢＯＬソースコード変換プログラム１２０はこの場合もＥＮＤ−ＩＦ文を挿入するとともにスタック２２０の先頭からＥＬＳＥ文識別子とＩＦ文識別子のペア（すなわちＥＬＳＥ（１）とＩＦ（１））を削除する。
【００５６】
ＣＯＢＯＬソースコード変換プログラム１２０は、以上の手順にしたがってスタック２２０を作成することにより、変換前ソースコード３１０に対してＥＮＤ−ＩＦ文を挿入すべき個所とその個数を判定することができる。
【００５７】
図８は、本実施形態２におけるＣＯＢＯＬソースコード変換プログラム１２０の動作を説明するアルゴリズムの例である。ここではプログラム言語に依拠しない疑似言語によってアルゴリズムを例示した。なお図８における「ポップデータ」とは、スタック２２０の先頭に格納されている値のことである。
【００５８】
符号８１０の部分は、変換前ソースコード３１０の１１行目や１５行目を読み込んだ場合の処理に相当する。符号８２０の部分は、変換前ソースコード３１０の１６行目を読み込んだ場合の処理に相当する。
【００５９】
＜実施の形態３＞
図９は、本発明の実施形態３に係るＣＯＢＯＬソースコード変換プログラム１２０の動作を説明する図である。以上の実施形態において、ＣＯＢＯＬソースコード変換プログラム１２０がＥＮＤ−ＩＦ文を単純に挿入した場合、図９左図に示すように、行の先頭から開始するＥＮＤ−ＩＦ文が追加されることになる。かかるソースコードは視認性が悪いので好ましくない。
【００６０】
そこでＣＯＢＯＬソースコード変換プログラム１２０は、得られた変換後ソースコード３２０を改めて走査することによりＩＦ条件文のネスト深さを解析し、各ＥＮＤ−ＩＦ文のネスト深さに応じて適当なインデントを行頭に追加する。これにより図９右図のように視認性のよいソースコードが得られる。
【符号の説明】
【００６１】
１００：コンピュータ、１１０：ＣＰＵ、１２０：ＣＯＢＯＬソースコード変換プログラム、２００：記憶装置、２１０：２分ヒープ、２２０：スタック、３１０：変換前ソースコード、３２０：変換後ソースコード。
【図１】
0006496640.tif 000002
【図２】
0006496640.tif 000003
【図３】
0006496640.tif 000004
【図４】
0006496640.tif 000005
【図５】
0006496640.tif 000006
【図６】
0006496640.tif 000007
【図７】
0006496640.tif 000008
【図８】
0006496640.tif 000009
【図９】
0006496640.tif 000010