REPLACE ステートメントは、ソース・テキストのテキストを置き換えるために使用されます。
REPLACE ステートメントは、ソース・テキストの中で文字ストリングが使えるところならばどこにでも記述できます。これが別々にコンパイルされたプログラムの中の最初のステートメントである場合を除き、 前に分離文字ピリオドを置かなければなりません。 また、分離文字ピリオドで終わる必要があります。
REPLACE ステートメントは、1 つの COBOL コンパイル・グループ全体を変更するために使用することも、 またはコンパイル・グループの一部を変更するために使用することもできます。 この際、変更を必要とする場所を手作業で探して修正する必要がありません。単純なストリングの置換が簡単な方法で行えます。 これは、COPY ライブラリーにあるテキストだけを対象にするのではなく、 ソース・テキスト全体を対象に動作するという点を除けば、 COPY ステートメントに REPLACING 句を指定した場合と同じです。
REPLACE ワードがコメント項目に置かれているか、 またはコメント項目が指定できるところにある場合には、 その REPLACE ワードはコメント項目の一部とみなされます。
フォーマット 1 .----------------------------------------. V | >>-REPLACE----==--疑似テキスト-1--==--BY--==--疑似テキスト-2--==-+--.------><
ソース・テキストの中で疑似テキスト-1 に一致したテキストが現れるたびに、 対応する疑似テキスト-2 によって置き換えられます。
現在有効なテキストの置換は、フォーマット 2 の REPLACE 形式を使用すると、中断されます。フォーマット 2 を指定しない場合、ある 1 つの REPLACE ステートメントの実行は、それが指定されたところから有効になり、次の REPLACE ステートメントが現れるか、または別々にコンパイルされたプログラムの終了まで処理が行われます。
疑似テキスト-1 は、区切り文字のコンマまたは区切り文字のセミコロンだけで構成することができます。
疑似テキスト-1 および疑似テキスト-2 には、ソース・テキストに記述可能な任意のテキスト・ワード (COPY ワードを除く) を使用できます。これは、国別リテラル、DBCS リテラル、および DBCS ユーザー定義語を含みます。
COBOL ワードおよびセパレーター用に許可されるそれらの外側の文字は、コメント 行、コメント項目、英数字リテラル、DBCS リテラル、または国別リテラルである場合 を除いて、ライブラリー・テキストまたは疑似テキストで表示してはいけません。
DBCS ユーザー定義語は、完全形式でなければなりません。つまり、DBCS ワードを部分語で置き換えることはできません。
疑似テキスト-1 および疑似テキスト-2 には、1 バイト文字および DBCS 文字をコメント行またはコメント項目に含めることができます。
疑似テキスト内の個々の文字ストリングは、いずれも最大 322 文字長までが可能です。ただ し、DBCS 文字を含むストリングを継続することはできません。
コンパイラーは、COPY ステートメントの指定があればそれをすべて処理してから、 ソース・テキストの REPLACE ステートメントを処理します。完全なソース・テキストを組み立てるために COPY ステートメントがまず処理されなければなりません。その後で REPLACE ステートメントを使用して単純なストリングの置換を実施し、そのソース・テキストを修正できます。REPLACE ステートメントは、それ自体に COPY ステートメントを含むことができません。
REPLACE ステートメントの処理を行った結果として得られるテキストは、 REPLACE ステートメントを含むことはできません。
疑似テキストを構成する文字ストリングおよび区切り文字は、領域 A または領域 B のいずれかで始めることができます。ただし、疑似テキスト開始区切り文字の次の行の標識領域にハイフンがある場合、その行の領域 A はブランクにしなければなりません。行の継続に関する通常の規則が、テキスト・ワードの形成に適用されます。(継続行を参照してください。)
テキスト置換を判別する比較演算は、 REPLACE ステートメントの後に置かれたソース・プログラム・テキスト・ワードの左端と最初の疑似テキスト-1 から開始されます。 疑似テキスト-1 は、 連続しているソース・プログラム・テキスト・ワードのうち同じ順序位置にあるソース・テキスト・ワードと比較されます。疑似テキスト-1 の中の順序付けられた一連のテキスト・ワードが、順序付けられた一連のソース・テキスト・ワードと 1 文字 1 文字がすべて等しい場合に限り、疑似テキスト-1 はソース・テキストと一致するものとみなします。国別文字の場合、国別文字のシーケンスは、 順序付けられた一連のライブラリー・ワードと 1 文字 1 文字がすべて 等しくなければなりません。
マッチングにおいて、区切り文字のコンマ、セミコロン、またはスペースは、 それが出現するたびにシングル・スペースとみなされます。 また、1 つ以上のスペース区切り文字の並びは、シングル・スペースとして扱われます。
しかし、疑似テキスト-1 が区切り文字のコンマまたはセミコロンだけで構成されている場合、 コンマまたはセミコロンは突き合わせにおいてテキスト・ワードとして扱われます (この場合、コンマやセミコロンの後に続くスペースは省略可能です)。
一致するものが現れないときは、連続している疑似テキスト-1 のそれぞれについて比較が繰り返されます。これは、一致するものが見つかるか、または比較する次の疑似テキスト-1 がなくなるまで行われます。
すべての疑似テキスト-1 の並びの比較が終了し、 しかも一致するものがない場合には、並んでいる次のソース・テキスト・ワードが最も左端のソース・テキスト・ワードとみなされ、比較サイクルが再び最初の疑似テキスト-1 との間で開始されます。
疑似テキスト-1 とソース・テキストの間で一致したものがあると、対応している疑似テキスト-2 が、ソース・テキストの中の一致したテキストと置き変わります。突き合わせが行われたテキスト・ワードの右端の直後に続くソース・テキスト・ワードが、今度は左端のソース・テキスト・ワードとみなされます。比較サイクルは、再び疑似テキスト-1 の最初のものとの間で開始されます。
比較演算は、REPLACE ステートメントの範囲内にあるソース・テキストの中の右端のテキスト・ワードが、突き合わせの対象となるか、 またはそれが左端のソース・テキスト・ワードとみなされて完全な比較サイクルの対象となるまで続けられます。
ソース・テキストおよび疑似テキスト-1 の中に現れるコメント行とブランク行は、 マッチングの際には無視されます。 ソース・テキストと疑似テキスト-1 の中のテキスト・ワードの並びは、 参照形式に関する規則によって判別されます (参照形式を参照)。疑似テキスト-2 の中にあるコメント行とブランク行は、疑似テキスト-2 がテキスト置換の結果ソース・テキストの中に入れられるときには常に、 結果として得られるプログラムの中に変更されずにそのまま入れられます。ソース・テキストに置かれているコメント行やブランク行は、 そのまま保存されます。ただし、ソース・テキストに置かれているコメント行やブランク行が、疑似テキスト-1 に一致するテキスト・ワードの並びの中に置かれている場合、そのコメント行やブランク行は保存されません。
*CONTROL (*CBL)、EJECT、SKIP1/2/3、または TITLE の各ステートメントを含む行を、ソース・テキストの中に記述することができます。これらの行は、REPLACE ステートメントの処理中は、コメント行として扱われます。
疑似テキストには、デバッグ行を入れることができます。 デバッグ行の中のテキスト・ワードは、「D」が標識域に表示されていない場合と同様にマッチング規則の適用対象になります。
デバッグ行に REPLACE ステートメントが指定されている場合、このステートメントは、標識域に「D」がないものとして扱われます。
すべての COPY ステートメントと REPLACE ステートメントの処理が終了すると、 デバッグ行は、SOURCE-COMPUTER 段落の中に WITH DEBUGGING MODE 節が指定されていない場合には、 コメント行としてのすべての特性を持っているものとみなされます。
COPY ステートメントと REPLACE ステートメントを除き、ソース・テキストの構文が正しいかどうかは、 すべての COPY ステートメントと REPLACE ステートメントの処理が完了するまで判別することはできません。
REPLACE ステートメントの処理の結果としてソース・テキストの中に挿入されたテキスト・ワードは、 参照形式に関する規則に従ってソース・テキストの中に入れられます。疑似テキスト-2 のテキスト・ワードがソース・テキストに挿入されるとき、スペース (ソース行間の想定上のスペースを含む) がすでに存在するテキスト・ワードの間にのみ追加のスペースが挿入されます。
REPLACE ステートメントの処理の結果として追加の行がソース・テキストに挿入される場合、 挿入された行の標識域には、置き換えられるテキストが開始する行にある文字と同じものが入ります。 ただし、その行がハイフンを持つ場合には、挿入される行はスペースを持つことになります。
疑似テキスト-2 内にあるリテラルが長すぎて、 結果として得られたプログラムの中で次の行に継続しない限り 1 行に収まらない場合は、 そのリテラルがデバッグ行に入れられるのでない限り、 そのリテラルの余分な部分を入れる追加の継続行が挿入されます。デバッグ行において次の行に継続しなければならないリテラルを置換する要求が生じると、 プログラムにエラーが発生します。
結果として得られるプログラムの中に入れられるはずの疑似テキスト-2 の各ワードは、 結果として得られるプログラムの中でも、それが疑似テキスト-2 の中にあるときと同じ領域から開始されます。