機能
COPY(複写)文は、COBOL翻訳集団中に原文を組み入れる。
例
以下の例が、言語リファレンス - 追加トピックの例題の章に掲げられている。
一般形式
指令
- 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。
- COPYEXT - コピー ファイルの所在を突き止めるために使用する、ファイル名の拡張子を指定する。
- COPYLBR - ライブラリ名が.lbrに相当することを指定する。
- COPYLIST - コピー文の結果をリスティング ファイルに含めさせる。
- FOLD-COPY-NAME - ディスク上のライブラリ名とCOPY文中の原文名の間で登録集メンバー名の大文字と小文字の指定が違っている場合に、コンパイラ システムがコピー登録集メンバーを見つけ出せるようにする。
- OLDCOPY - ANS'68およびOS/VS COBOL LANGLVL(1)の規則に合うように、COPY文の取扱いを変更する。
構文規則
- 原始プログラムをCOBOLシステムに渡すときに複数のCOBOL登録集が利用できる場合は、原文名を登録集名で修飾して、原文名の原文が登録されているCOBOL登録集を一意に識別しなければならない。登録集についての詳細は、COBOLシステムのマニュアルを参照。
この制限は削除された。
- COPY文は、前に空白を1つ置き、後ろを分離符の終止符(.)で止める。
-
仮原文-1は、空でも、空白文字だけから成っても、注記行だけから成ってもならない。
- 仮原文-2は、空であってもよい。
- 仮原文-1および仮原文-2の中の文字列は、行をまたがって継続させることができる。ただし、仮原文の区切り記号(psuedo-text delimiter)は、2つとも同じ行にあること。 (COBOLプログラムの概念の章の行のつなぎ節を参照。)
- 語-1または語-2は、任意の単一のCOBOLの語であってよい。
- 文字列または分離符が書けるところならば、原始プログラム中のどこにでもCOPY文を書くことができる。ただし、COPY文の中にはCOPY文を書けない。
- 原文名は、一意の外部ファイル名を定義する。このファイル名は、利用者語の作成規則に準拠していること。
外部ファイル名定数は英数字定数であり、ファイル名に関するオペレーティング システムの規則に準拠していること。外部ファイル名定数を指定する時は、引用符で囲んでもよいし囲まなくてもよい。
原文名および引用符で囲んでいない外部ファイル名定数は、常に大文字に変換されることに注意。
-
登録集名定数は文字定数であり、ファイル名に関するオペレーティング システムの規則、または装置一意名に関するオペレーティング システムの規則に準拠していること。登録集名定数を指定する時は、引用符で囲んでもよいし囲まなくてもよい。
引用符で囲んでいない登録集名定数は、常に大文字に変換されることに注意。
-
SUPPRESSは、原始リスト上にコピー メンバーの内容を印刷しないようにするために指定する。
-
注記項の中または注記項があってもよい場所に語COPYがある場合、注記項の一部とみなされる。
注記項中にあるCOPY文は処理される。
-
外部ファイル名定数および登録集名定数は、引用符で囲まれている場合、文字$、#、@を含んでもよい。
-
部分語-1は、単一の原文語でなければならない。
-
部分語-2は、ゼロまたは単一の原文語でなければならない。
-
文字定数と各国文字定数のいずれも、部分語-1と部分語-2のいずれとしても指定してはならない。
- 登録集原文は、COBOL参照形式の規則に準拠していなければならない。
-

連結式は、外部ファイル名定数、登録集名定数、定数-1、および定数-2のどれに対しても指定してはならない。
一般規則
- COPY文を含む翻訳集団をコンパイルすることは、論理的には、すべてのCOPY文を処理してからその結果の翻訳集団をコンパイルすることと同じである。
- COPY文を処理した結果は、予約語COPYに始まり句読文字の終止符で終わるCOPY文全体を論理的に置き換える形で、原文名によって表わされる登録集原文を原始文中に複写したようになる。
- REPLACING指定をしないと、登録集原文はそのままで複写される。
REPLACING指定をすると、複写される登録集原文のうちで、仮原文-1、一意名-1、定数-1、語-1に一致するそれぞれの部分が、対応する仮原文-2、一意名-2、定数-2、語-2によって置き換えられる。
- 登録集と一致するかどうか比較する目的では、一意名-1と定数-1と語-1は、それぞれ一意名-1または定数-1または語-1だけを含む仮原文として扱われる。
- 原文を置換するかどうかを判定するための比較は、以下のように行われる。
- 分離符のカンマでもセミコロンでもない登録集原文語の左端の語が、比較の最初の対象となる。この原文語の前にある原文語または空白は、原始文中に複写される。比較対象の最初の原文語以降が、REPLACINGの作用対象全体と連続する同じ文字数だけ比較される。ここで、REPLACINGの作用対象とは、予約語BYの前までに指定した仮原文-1、一意名-1、定数-1、語-1を指す。
- 仮原文-1、一意名-1、定数-1、語-1は、その語を構成する文字の並びが登録集原文語の文字の並びと、逐一同じであるときにだけ、登録集原文と等しいと判定される。
-
LEADINGを指定した場合、部分語-1は、それを構成する文字の並びが、登録集原文語の左端文字位置から続く、同じ数の文字の並びと、逐一同じであるときにだけ登録集原文と等しいと判定される。TRAILINGを指定した場合、部分語-1は、それを構成する文字の並びが、登録集原文語の右端文字位置で終わる、同じ数の文字の並びと、逐一同じであるときにだけ登録集原文と等しいと判定される。
- 等しいと判断する際の規則は以下のとおり。
- 仮原文-1または登録集原文の中に現れる分離符の各カンマ、セミコロン、または空白は、単一の空白と見なされる。1個以上連続する空白分離符は、単一の空白と見なされる。
- 文字定数または各国語定数で使用されるものを除き、小文字は、COBOL文字集合に指定されている、対応する大文字と同等に扱われる。
- デバッグ行内の原文語は、指示領域に "D" がないものとして、比較に使用される。
-

連結式の各作用対象および各演算子は、別の原文語である。
- 照合結果が一致しなかった場合、REPLACING指定の続きがあれば、次の各仮原文-1、一意名-1、定数-1、語-1を対象にして比較が繰り返される。このようにして一致するものが見つかるか、REPLACING指定の作用対象の続きがなくなるまで、比較は繰り返し続けられる。
- REPLACING指定の作用対象のすべてが比較されたが、一致するものが見つからなかった場合、左端の登録集原文語は原始文中に複写される。次いで、その次に続く登録集原文語が左端の登録集原文語であるとみなされて、REPLACING指定中の最初の仮原文-1、一意名-1、定数-1、語-1から始まって、比較周期が再び開始される。
- 仮原文-1、一意名-1、定数-1、語-1と登録集原文との間で比較結果が一致した場合、対応する仮原文-2、一意名-2、定数-2、語-2が原始文中に入れられる。
語-1と登録集原文の間で比較結果が一致した場合、登録集原文が、一致した文字を含む実行後の原始文中で、語-1に置き換えられる。または、語-2が空の原文である場合は、削除される。
比較の対象とされた登録集原文部分のうちの右端の原文語のすぐ後ろの語が、左端の登録集原文語であるとみなされて、REPLACING指定中の最初の仮原文-1、一意名-1、定数-1、語-1から始まって、比較周期が再び開始される。
- この処理は、登録集原文中の右端の原文語が左端の登録集原文語とみなされて比較され、照合結果が一致するかまたは比較周期を完了したところで、終了する。
- 比較の目的では、登録集原文および仮原文-1中に出てくる注記行は、単一の空白とみなされる。仮原文-2および登録集原文の中に出てくる注記行は、原始文中に元のまま複写される。
- COPY文の処理を完了した結果の原文中に、COPY文が含まれていてはならない。
結果の原文中にCOPY文が含まれていてもよい。ただし、そのCOPY文および既に展開済みのCOPY文に、REPLACING指定が含まれていないことが条件である。この場合、再帰的なCOPY文(登録集原文が、その中のCOPY文により参照されている)は含まれていてはならない。
任意のレベルまで、COPY文を入れ子にしてもよい。入れ子になった任意のCOPY文の中に、REPLACING指定が含まれていてもよい。下位レベルのすべての COPY文に対して、REPLACING指定は効力を発揮する。
- 登録集原文の構文の正しさは、独立して判定することはできない。
ただし、COPY文は例外である。
すべてのCOPY文の処理が完了するまで、COBOL原始プログラム全体の構文の正しさは判定できない。
-
REPLACING指定が含まれる場合は、登録集原文に EXEC HTML文が含まれていてはならない。 この規則に反すると、予期しない動作や構文エラーが発生する可能性がある。
- 登録集から複写されたが置換はされなかった各原文語は、結果としてできあがるプログラムの中でも、登録集内の行の中でその語が占めていたのと同じ領域から始まるように複写される。しかし、登録集から複写してきたA領域から始まる原文語の後ろに別のやはりA領域から始まる原文語があって、前の方の原文語がそれよりも長いものに置換された場合、A領域に余裕がなければ、後ろの原文語はB領域から開始されることがある。結果としてできあがる原始文の中に入れられる仮原文-2の中の各原文語は、仮原文-2の中でその語が占めていたのと同じ領域から始まるように配置される。各一意名-2、定数-2、語-2は、結果としてできあがるプログラムの中で、比較の対象となった左端の登録集原文語が置換されなかったならば、位置していたのと同じ領域から�
始される。
COPY文を処理した結果として原始文中に行が追加される場合、COPY文がデバッグ行上から始まるか、または複写される原文語が登録集原文中のデバッグ行上にあると、その原文語はデバッグ行上に置かれる。BY指定の対象の原文語が組み入れられるときに、置換される最初の登録集原文語がデバッグ行上にあると、置き換わる語もデバッグ行上に配置される。上記の場合を除いて、結果としてできあがる原始文中のデバッグ行上に配置されるのは、仮原文-2の中のデバッグ行上に指定されている原文語だけである。定数-2としてまたは仮原文-2か登録集原文の中に指定されている定数が1行に収まりきらないほど長く、かつその定数がデバッグ行上にはない場合、あふれる分を収容する継続行が後ろに追加される。置換の結果、定数の続きがデバッグ行にかかる場�
は、翻訳集団はエラーとなる。.
- 比較の目的では、置換後の原文語は、COBOLプログラムの概念の章の参照形式節に記述されている正書法の規則に従って、原始文中に配置される。
- 装置一意名を明示的に指定しないと、省略時解釈の装置が使用される(省略時解釈値は、オペレーティング システムによって異なる)。
-
OLDCOPYコンパイラ指令を設定すると、COPY文の内容が原文名の複写ファイルの内容で置き換えられる際に、 COPY文の前にあるデータ名が複写ファイル中の対応するデータ名の代わりに用いられる。
-
登録集原文中で何らかの適用規則が守られている場合、データ名の接頭辞のような名前の一部をREPLACING指定を用いて変更できる。この方式の「部分的な語の置換」機能を利用するためには、変更の対象とする部分の前後を下記のように囲まなければならない。
- 一組の左かっこと右かっこで、(ABC)のように囲む。
- コロンで、:XYZ:のように囲む。
注:LEADINGおよび TRAILING指定を、部分的な語の置換に使用できる。LEADING および TRAILING 指定は、MF方言と次のCOBOL標準でサポートされているが、このサポートはANSI '85 COBOL標準には含まれていない。