第7章 原始文操作
7.1 概要
原始文操作機能は、原始プログラムの一部をCOBOL登録集から複写したり、原始プログラムの一部を置き換えたりする機能である。原始文操作機能には、COPY文およびREPLACE文の2つの文がある。
COPY文は、登録集原文を、COPY文を書いたプログラムに複写する。複写するときに、登録集原文の一部を置き換えることもできる。REPLACE文は、原始プログラム原文の一部を置き換える。
COPY文およびREPLACE文は、原始プログラムの任意の場所に書くことができる。また、COPY文だけで原始プログラムを構成することができる。これらの文は、翻訳時、他の文が翻訳される前に処理される。実行時は意味を持たない。
原文
原始プログラムおよびCOBOL登録集の中の、行または行の集まりを「原文」という。原始プログラムの中の原文を「原始プログラム原文」といい、COBOL登録集の中の原文を「登録集原文」という。
原文語
COBOL登録集、原始プログラムおよび仮原文の中のA領域とB領域にある文字列のうち、以下の文字列を「原文語」という。
- 空白、仮原文区切り記号および分離符の引用符を除く分離符。分離符の左括弧と右括弧は、その記述位置に関係なく、つねに原文語とみなされる。
- 定数は、1つの原文語である。文字定数、日本語定数、ブール定数および16進文字定数の場合、定数値の開始の分離符から終了の分離符までの一連の文字列が、1つの原文語である。
- 分離符と分離符の間にある、分離符でも定数でもない文字列は、1つの原文語である。ただし、注記行にある文字列および語COPYは、原文語ではない。
仮原文
原始プログラムおよびCOBOL登録集の中の、2つの仮原文区切り記号の間にある原文語、注記行および分離符の空白を「仮原文」という。「仮原文区切り記号」とは、2個の連続した等号(==)のことである。仮原文に、仮原文区切り記号は含まれない。
7.2 COPY文
登録集原文を原始プログラムに複写する。
書き方
COPY { 原文名-1 [ { OF | IN } 登録集名-1 ] }
[ REPLACING { { == 仮原文-1 == | 一意名-1 | 定数-1 | 語-1 }
BY
{ == 仮原文-2 == | 一意名-2 | 定数-2 | 語-2 } |
// 語-3 // BY // 語-4 // } … ]
構文規則
- 1つの翻訳単位の中で2つ以上のCOBOL登録集を使う場合、原文名-1は、その原文が存在するCOBOL登録集の登録集名で修飾しなければならない。(*1)
- 原文名-1は、1つのCOBOL登録集の中で一意でなければならない。
- 原文名-1および原文名定数-1の記述規則については、“言語の基本要素”を参照のこと。
- COPY文は、空白の後から書き始め、分離符の終止符で止めなければならない。
- 仮原文-1および仮原文-2は、正書法に従って書かなければならない。
- 仮原文-1には、1つ以上の原文語を書かなければならない。
- 仮原文-2には、1つ以上の原文語を書く。原文語は、省略することもできる。
- 仮原文-1および仮原文-2は、正書法に従って、2行以上にわたって記述することができるが、一意名-1および一意名-2は2行以上にわたって記述することはできない。(*2)
- 語-1、語-2、語-3および語-4は、COBOLの語の規則に従った文字列でなければならない。ただし、語-3、語-4は最後の文字がハイフンであってもよい。また、いずれの語も、語COPYを指定してはならない。
- COPY文は、右側の引用符以外の分離符または文字列が書けるところならば、どこにでも書くことができる。ただし、COPY文の中にCOPY文を書くことはできない。
- 仮原文-1、仮原文-2および登録集原文の中の1つの原文語の文字数はとくに規定はない。
- 仮原文-1に、分離符のコンマまたは分離符のセミコロンだけを書くことはできない。
- 語COPYを注記項、注記行または文字定数の中に書いた場合、語COPYは、それらを構成する文字列の一部とみなされる。
- 語-3が英数字の場合、語-4は英数字でなければならない。また、語-3が日本語文字の場合、語-4は日本語文字でなければならない。
(*1) SIT
COBOLは、登録集名を指定することはできない。原文名-1の在処は、COPYオプションによって指定する。
(*2)
SIT
COBOLは、一意名-1、一意名-2を2行以上にわたって記述することができる。
一般規則
- COPY文は、翻訳時、プログラムの中に登録集原文を複写する。登録集原文は、原文名-1で指定する。以降の説明で、「登録集原文」は、原文名-1に指定した登録集原文を表す。登録集原文を複写する規則は、以下のとおりである。
- REPLACING指定を省略した場合
登録集原文をそのまま複写する。
- REPLACING指定を書いた場合(語-3,
語-4指定ではない場合)
登録集原文中の原文語からBYの左辺と一致する文字列を検索し、一致した文字列をBYの右辺に置き換えて複写する。一致しなかった文字列は、そのまま複写する。
- REPLACING指定を書いた場合(語-3,
語-4指定の場合)
登録集原文中の原文語の一部が、語-3と一致するものを検索し、一致した部分を語-4と置き換えて複写する。
- COPY文を書いた原始プログラムの翻訳は、すべてのCOPY文を処理した後に、原始プログラムの翻訳を行うことと同じである。翻訳時、COPYで始まり終止符で終わるCOPY文全体が、登録集原文または登録集原文の一部を編集したものに置き換えられる。COPY文は、実行時には意味を持たない。(*1)
- 登録集原文は、COBOLの正書法の規則に従わなければならない。
- REPLACING指定による原文の置き換えは、以下の順序で行われる。
- 置き換えのための比較は、登録集原文中の、分離符のコンマおよび分離符のセミコロン以外の最初の原文語から開始する。この原文語を「現在の原文語」とする。この原文語の前にある空白、分離符のコンマおよび分離符のセミコロンは、そのまま複写する。
- BYの左辺を、「現在の原文語」から始まる登録集原文と1文字ずつ比較する。BY指定を2つ以上書いた場合、それらを書いた順に、BY指定のすべての作用対象を比較する。比較の方法は、以下のとおりである。
①一意名-1、語-1または定数-1を書いた場合、その内容を「現在の原文語」と比較する。
②仮原文-1を書いた場合、仮原文-1に書いた文字列全体を「現在の原文語」から始まる登録集原文と比較する。このとき、仮原文-1および登録集原文の中の、1つ以上の分離符のコンマ、1つ以上の分離符のセミコロン、および1つ以上の空白は、1つの空白とみなする。
③語-3を書いた場合、「現在の原文語」の一部と語-3が一致するか比較する。
- b.の比較を、比較の結果が一致するまで、またはBYの左辺がなくなるまで繰り返す。
- b.の比較で、どの比較の結果も一致しなかった場合、「現在の原文語」をそのまま複写する。そして、「現在の原文語」の次の原文語を「現在の原文語」にして、b.の処理に戻る。
- b.の比較で、比較の結果が一致した場合、以下の処理を行う。
①一意名-1、語-1または定数-1を書いた場合、「現在の原文語」をBYの右辺に置き換えて複写する。そして、「現在の原文語」の次の登録集原文語を「現在の原文語」にして、b.の処理に戻る。
②仮原文-1を書いた場合、仮原文-1と一致した部分を、BYの右辺に置き換えて複写する。そして、仮原文-1と一致した部分の最後の原文語の次の原文語を「現在の原文語」として、b.の処理に戻る。
③語-3を書いた場合、語-3と一致した部分のみを、語-4に置き換えて、b.の処理に戻る。
- b.~e.の処理を、登録集原文中の最後の原文語を比較するまで繰り返する。
- 登録集原文および仮原文-1の中の注記行および空白行は、置き換えのための比較で無視される。
- 登録集原文、仮原文-1および仮原文-2の中に、デバッグ行を書くことができる。比較を行うとき、登録集原文および仮原文-1の中の標識領域の“D”は無視される。(*2)
- 登録集原文中の置き換えの対象にならない原文語は、登録集原文上の領域と同じ領域に位置するように複写される。すなわち、登録集原文のA領域から始まる原文語はA領域から始まるように複写され、B領域から始まる原文語はB領域から始まるように複写される。ただし、A領域に2つ以上の原文語が存在し、そのうちのいずれかの原文語がその長さよりも長い原文語に置き換えられる場合、A領域から始まるように複写できない原文語は、B領域から始まるように複写される。
- 登録集原文中の置き換えの対象となった原文語は、新しい原文語(一意名-2、定数-2または語-2または仮原文-2の中のそれぞれの原文語)に置き換えられて、正書法に従って複写される。
- 登録集原文中の原文語が、一意名-2、定数-2または語-2で置き換えられるとき、新しい原文語(一意名-2、定数-2または語-2)は、置き換えの対象となった原文語の登録集原文上の領域と同じ領域から始まるように複写される。
- 登録集中の原文語が、仮原文-2の中のそれぞれの原文語で置き換えられるとき、仮原文-2のそれぞれの原文語は、仮原文-2上の領域と同じ領域から始まるように複写される。仮原文-2の中の原文語間の空白は、そのまま複写される。
- 以下の原文語は、デバッグ行上に存在するように複写される。(*2)
- COPY文をデバッグ行に書いた場合、そのCOPY文によって複写される登録集原文中の原文語
- 登録集原文中のデバッグ行上の原文語
- 登録集原文中の置き換えの対象となった最初の原文語がデバッグ行に位置する場合、BYの右辺に書いた原文語
- 仮原文-2の中のデバッグ行に書いた原文語
上記の原文語は、標識領域にデバッグ行を示す文字“D”を設定した行上に置かれる。これは、原文語の置き換えなどによって、登録集原文の1行が複数行になったとしても同じである。
- COPY文の処理の結果、原文語の置き換えによって、定数-2、仮原文-2または登録集原文の中に書いた定数が複数行にまたがって複写される場合、前の行から継続して複写される行の標識領域には、行のつなぎを示す“-”が設定される。ただし、デバッグ行上に複写される定数が継続されるような置き換えを行ってはならない。
- COPY文の処理の結果、原文語の置き換えによって新しい行が追加される場合、8.および9.の場合を除いて、追加される行の標識領域には、置き換えの対象となる原文語を含む行の標識領域の文字と同じ文字が設定される。ただし、その行の標識領域がハイフンである場合、追加される行の標識領域には、空白が設定される。
- 登録集原文中の注記行および空白行は、そのまま複写される。ただし、登録集原文中の注記行または空白行が、仮原文-1と一致する一連の原文語の間に存在する場合、注記行または空白行は複写されない。
- 仮原文-2の中の注記行および空白行は、仮原文-2が複写されるときはいつでも、そのまま複写される。
(*1) SIT
COBOLはインタープリタであり、実行時にCOPY文の展開処理が行われる。
(*2) SIT COBOLは、デバッグ行は未サポートである。
7.3 REPLACING文
原始プログラム原文を置き換える。
書き方1:置き換える文字列を指定し、置き換えの開始を宣言する
REPLACE { == 仮原文-1 == BY == 仮原文-2 == } …
書き方2:原文の置き換えの終了を宣言する
REPLACE OFF
(※) SIT COBOLは、REPLACE文は未サポートである。(サポート予定あり)