Rational Developer for System z
COBOL for Windows バージョン 7.5 言語解説書


COPY ステートメント

COPY ステートメントは、事前に書かれたテキストを COBOL コンパイル単位に入れるライブラリー・ステートメントです。

事前に書かれたソース・コード項目を、コンパイル時にコンパイル単位の中に含めることができます。したがって、インストール先は、標準のファイル記述、レコード記述、 またはプロシージャーを再度コーディングすることなく使用することができます。その後、これらの項目とプロシージャーは、ユーザー作成のライブラリーに保管できます。また、COPY ステートメントによってプログラムおよびクラス定義に組み込むこともできます。

COPY ステートメントを含むソース・コードをコンパイルするのは、すべての COPY ステートメントを処理してから、 その結果として得られるソース・テキストの処理と同じになります。

COPY ステートメントが処理されると、COPY ワードで始まりピリオドで終わる COPY ステートメント全体が論理的に置き換えられ、テキスト名 に関連するライブラリー・テキストがコンパイル単位にコピーされます。REPLACING 句を指定していない場合、ライブラリー・テキストは変更されずにコピーされます。

フォーマット
構文図を読む構文図をスキップする>>-COPY--+-テキスト名-+--+----------------------------+--------->
         '-リテラル-1-'  '-+-OF-+--+-ライブラリー名-+-'  
                           '-IN-'  '-リテラル-2-----'    
 
>--+----------+------------------------------------------------->
   '-SUPPRESS-'  
 
>--+-----------------------------------------------+--.--------><
   |            .--------------------------------. |     
   |            V                                | |     
   '-REPLACING----オペランド-1--BY--オペランド-2-+-'     
 

テキスト名ライブラリー名
テキスト名 はコピー・テキストを識別します。ライブラリー名 はコピー・テキストが存在する場所を識別します。

テキスト名 およびライブラリー名 はユーザー定義語として同一にすることができます。

テキスト名 を修飾する必要はありません。テキスト名 を修飾しない場合には、ライブラリー名は SYSLIB とみなされます。

リテラル-1リテラル-2
英数字リテラルでなければなりません。 リテラル-1 はコピー・テキストを識別します。リテラル-2 はコピー・テキストが存在する場所を識別します。

リテラルは 1 から 160 文字の長さにすることができます。

テキスト名 およびライブラリー名 の固有性は、 システム依存名の形成規則と変換規則が適用された後で判定されます。

処理規則の詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。

オペランド-1オペランド-2
疑似テキスト、ID、関数 ID、リテラル、または COBOL ワード (COPY ワードを除く) のいずれかにすることができます。

ライブラリー・テキストと疑似テキストには、ソース・テキストに記述可能な任意のワード (COPY ワードを除く)、ID、またはリテラルのいずれでも使用できます。これは、マルチバイト DBCS ユーザー定義語、DBCS リテラル、および国別リテラルを含みます。

マルチバイト・ユーザー定義語は、完全形式でなければなりません。つまり、マルチバイト・ワードを部分語で置き換えることはできません。

マルチバイト文字が含まれているワードおよびリテラルは、行をまたがって続けることはできません。

各 COPY ステートメントは、 前にスペースが 1 つなければならず、 分離文字ピリオドで終わらなければなりません。

文字ストリングまたは区切り文字が使用できるところならばどこでも、ソース・テキストの中で COPY ステートメントを使用することができます。

COPY ステートメントはネストできます。ただし、ネストされた COPY ステートメントでは REPLACING 句を指定することはできません。 また、REPLACING 句の指定のある COPY ステートメントの中にネストされた COPY ステートメントを含めることはできません。

ネストされた COPY ステートメントが再帰することはできません。 すなわち、ある COPY メンバーに関してファイルの終わりに達するまでに、 その COPY メンバーは、 1 組のネストされた COPY ステートメントの中で一度しか指定できません。 例えば、ソース・テキストに COPY X. というステートメントがあり、ライブラリー・テキスト X に COPY Y. というステートメントがあるとします。

この場合、ライブラリー・テキスト Y には COPY X ステートメントまたは COPY Y ステートメントが含まれていてはなりません。

デバッグ行は、 ライブラリー・テキストと疑似テキストの中で使用することができます。デバッグ行の中のテキスト・ワードは、“D” が標識域に 表示されていない場合と同様にマッチング規則の適用対象になります。デバッグ行が疑似テキスト内で指定されるのは、 そのデバッグ行がソース・テキストにおいて、疑似テキスト開始の区切り文字の後、対応する疑似テキスト終了の区切り文字の前で始まる場合です。

COPY ステートメントを実行した結果としてソース・テキストの中に余分な行が入れられると、 その COPY ステートメントがデバッグ行で開始される場合、または挿入されるテキスト・ワードがライブラリー・テキスト中のデバッグ行上にある場合には、 その挿入されるテキスト・ワードはデバッグ行上に置かれることになります。BY 句の中で指定されたテキスト・ワードが挿入されるときには、 そのテキスト・ワードは、 置き換えられるその最初のライブラリー・テキスト・ワードがデバッグ行上で指定されている場合には、 デバッグ行上に置かれます。

COPY ステートメントがデバッグ行上に指定されているときには、コピーされるテキストは、 そのテキスト中のコメント行がその COPY ステートメントの実行結果として得られたソース・テキストの中でコメント行として現れる場合を除き、デバッグ行上に入れられたものとして扱われます。

COPY ワードがコメント項目に置かれているか、またはコメント項目を指定できるところにある場合には、 その COPY ワードはコメント項目の一部とみなされます。

すべての COPY ステートメントと REPLACE ステートメントの処理が終了すると、 デバッグ行は、 SOURCE-COMPUTER 段落の中に WITH DEBUGGING MODE 文節が指定されていない場合には、 コメント行としてのすべての特性を持っているものとみなされます。

コメント行やブランク行は、ライブラリー・テキスト中に置かれることがあります。 ライブラリー・テキストに置かれているコメント行やブランク行は、結果ソース・テキストにそのままコピーされます。ただし、ライブラリー・テキストに置かれているコメント行やブランク行は、 そのコメント行やブランク行がオペランド-1 に一致するテキスト・ワードの並びの中にある場合 はコピーされません (置換と比較に関する規則を参照)。

*CONTROL (*CBL)、EJECT、SKIP1、SKIP2、SKIP3、または TITLE の各ステートメントを含む行を、 ライブラリー・テキストの中に記述することができます。それらの行は、COPY ステートメントの処理中はコメント行として扱われます。

ライブラリー・テキストが構文上正しいかどうかは、別々に判定することはできないので、 すべての COPY ステートメントおよび REPLACE ステートメントの処理が完全に終了するまで、 COBOL ソース・テキスト全体が構文的に正しいかどうかは判定できません。

ライブラリーからコピーされるライブラリー・テキストは、 結果として得られるプログラムの中で、 そのライブラリー・テキストがライブラリーの中にあったときと同じ領域に入れられます。ライブラリー・テキストは、標準の COBOL 85 フォーマットの規則に適合している必要があります。

注: COBOL ワードおよびセパレーター用に定義されるそれらの外側の文字は、コメント 行、コメント項目、英数字リテラル、DBCS リテラル、または国別リテラルである場合 を除いて、ライブラリー・テキストまたは疑似テキストで表示してはいけません。

 

SUPPRESS 句

SUPPRESS 句は、ライブラリー・テキストをソース・リストに印刷させないように指定します。

REPLACING 句

以下の説明では、各オペランド は、次のいずれかで構成されています。

REPLACING 句を指定すると、ライブラリー・テキストがコピーされ、ライブラリー・テキスト内にあるオペランド-1 は、それが完全に一致するたびに関連するオペランド-2 によって置き換えられます。

疑似テキスト
疑似テキスト区切り文字 (==) によって区切られた一連の文字ストリングや 区切り文字 (疑似テキスト区切り文字は含まれません)。各疑似テキスト区切り文字の両方の文字は 1 行に記述しなければなりません。 ただし、疑似テキストの文字ストリングは次に続けることができます。

疑似テキスト内の個々の文字ストリングは、いずれも最大 322 文字までが可能です。これらの文字ストリングは、ソース・コード形式の通常の継続規則に従って継続させることができます。

文字ストリングは区切り文字によって区切らなければならないことに注意してください。 詳細については、文字を参照してください。

疑似テキスト-1 は、オペランド-1 として使用されるときの疑似テキストを指し、疑似テキスト-2 は、オペランド-2 として使用されるときの疑似テキストを指しています。

疑似テキスト-1 は、区切り文字のコンマまたは区切り文字のセミコロンだけで構成することができます。疑似テキスト-2 は、ヌルであり、スペース文字またはコメント行だけで構成することができます。

疑似テキストに COPY ワードを含めることはできません。

プログラムの中にコピーされる疑似テキスト-2 の中の各テキスト・ワードは、 結果として得られるプログラムの中で、それが疑似テキスト-2 の中にあったときと同じ領域に入れられます。

疑似テキストには、ソース・テキストに記述可能な任意のワード (COPY ワードを除く)、ID、またはリテラルのいずれでも使用できます。これは、マルチバイト・ユーザー定義語、DBCS リテラル、および国別リテラルを含みます。

マルチバイト・ユーザー定義語は、完全形式でなければなりません。つまり、マルチバイト・ワードを部分語で置き換えることはできません。

マルチバイト文字が含まれているワードおよびリテラルは、行をまたがって続けることはできません。

ID
データ部の任意のセクションで定義することができます。
リテラル
数字リテラル、英数字リテラル、DBCS リテラル、または国別リテラルにすることができます。
ワード
マルチバイト・ユーザー定義語を含む、任意の 1 つの COBOL ワード (COPY を除く) にすることができます。マルチバイト・ユーザー定義語は、完全形式でなければなりません。マルチバイト・ワードを部分語で置き換えることはできません。

区切り文字以外の COBOL 文字 (例えば +、*、/、$、<、>、および =) は、 REPLACING オペランドとして使用する場合は COBOL ワードの一部として組み込むことができます。さらに、 ハイフンをその語、英数字リテラル、DBCS リテラル、または国別リテラルの最初の文字または最後の文字に使用することもできます。

マッチングを行うために ID-1リテラル-1、またはワード-1 は、それぞれ ID-1リテラル-1、またはワード-1 だけを含む疑似テキストとして扱われます。

置換と比較に関する規則

  1. 算術演算子と論理演算子は、テキスト・ワードとみなされ、 疑似テキスト・オプションによってのみ置き換えることができます。
  2. 先頭と末尾のブランクは、テキストの比較処理ではその対象となりません。 テキストの間に埋め込まれるブランクは、 テキストの比較処理では複数のテキスト・ワードを分離するものとして使用されます。
  3. オペランド-1が表意定数である場合、オペランド-1 はまったく同じ表意定数とのみ一致します。例えば、ALL “AB” がライブラリー・テキストに指定されると、“ABAB” は一致とみなされません。ALL “AB” だけが一致とみなされます。
  4. PICTURE 文字ストリングを置き換える場合、疑似テキスト・オプションを使用します。あいまいさを除くため、疑似テキスト-1 では、 PICTURE や PIC といったキーワードを含め、PICTURE 文節全体を指定するようにします。
  5. ライブラリー・テキストの中の左端の語の前にある区切り文字のコンマ、セミコロン、またはスペースが、ソース・テキストの中にコピーされます。左端のライブラリー・テキスト・ワードおよび REPLACING オプションの中に指定されている最初のオペランド-1 から開始して、 キーワード BY の前にある REPLACING オペランド全体が、それと等しい個数の連続するライブラリー・テキスト・ワードと比較されます。
  6. オペランド-1 の中の順序付けられた一連のテキスト名が、順序付けられた一連のライブラリー・ワードと 1 文字 1 文字がすべて等しい場合に限り、オペランド-1 はライブラリー・テキストと一致するものとみなします。国別文字の場合、国別文字のシーケンスは、 順序付けられた一連のライブラリー・ワードと 1 文字 1 文字がすべて 等しくなければなりません。 マッチングにおいて、区切り文字のコンマやセミコロン、 および 1 つ以上の区切り文字のスペースは、 それぞれ現れるたびにシングル・スペースであるとみなされます。しかし、オペランド-1 が区切り文字のコンマまたはセミコロンだけで構成されている場合、それは突き合わせにおいてテキスト・ワードとして扱われます (この場合、コンマやセミコロンの後に続くスペースは省略可能です)。

    ライブラリー・テキストに終了引用符が含まれており、 その直後に区切り文字としてスペース、コンマ、セミコロン、 またはピリオドがない場合、その終了引用符は区切り文字の引用符とみなされます。

  7. 一致しなければ、一致するものが検索されるまで、または REPLACING オペランドがそれ以上検索されないという時点まで、 後続のそれぞれのオペランド-1 (指定されていれば) に関して比較が繰り返されます。
  8. オペランド-1 とライブラリー・テキストが一致するごとに、関連するオペランド-2 がソース・テキストの中にコピーされます。
  9. REPLACING 句のついた COPY ステートメントを使用すれば、 語の一部を置き換えることができます。コロンによってプログラム・テキストに区切ったダミー・オペランドを挿入すると、 コンパイラーは、指定したテキストをそのダミー・オペランドに置き換えます。例 3 では、:TAG: というダミー・オペランドを例に、その使用方法を示します。

    コロンは区切り文字の役割を果たすため、TAG はスタンドアロンのオペランドになります。

  10. すべてのオペランドが比較され、一致するものが検索されなければ、左端のライブラリー・テキスト・ワードがソース・テキストの中にコピーされます。
  11. さらに、次に続く、まだコピーされていないライブラリー・テキスト・ワードが、左端のテキスト・ワードとみなされ、 最初のオペランド-1 から始めて、比較処理が繰り返されます。右端のライブラリー・テキスト・ワードが比較されるまで処理は続けられます。
  12. ライブラリー・テキストと疑似テキスト-1 に置かれているコメント行やブランク行は、 マッチングのために無視されます。ライブラリー・テキストと疑似テキスト-1 内のテキスト・ワードの並びは、参照形式の規則によって判別されます。疑似テキスト-2 に現れるコメント行またはブランク行は、 テキスト置き換えの結果として疑似テキスト-2 がソース・テキストの中に入れられるとき、結果として得られたプログラムに変更を加えずにコピーされます。ライブラリー・テキストに置かれているコメント行やブランク行は、結果ソース・テキストにそのままコピーされます。ただし、ライブラリー・テキストに置かれているコメント行やブランク行が、疑似テキスト-1 に一致するテキスト・ワードの並びの中に置かれている場合、そのコメント行やブランク行はコピーされません。
  13. 置き換え後のテキスト・ワードは、標準の COBOL 85 フォーマットの規則に従って、ソース・テキストの中に入れられます。
  14. テキスト・ワードがソース・テキストの中に入れられる場合、すでにスペース (ソース・コード行間の想定上のスペースを含む) が存在する場所にだけ、テキスト・ワードの間に追加のスペースが挿入されます。
  15. COPY REPLACING は、コンパイラー指示ステートメントの EJECT、 SKIP1、 SKIP2、 SKIP3、 または TITLE に影響を与えません。

コードの並び (ファイルおよびデータ記述、エラーおよび例外ルーチン) で、複数のプログラムに共通のものは、ライブラリーに保管することができ、COPY ステートメントと共に使用することができます。 そのような共通のコードに関して命名規則が確立されていれば、 REPLACING 句を指定する必要はありません。 プログラムごとに別の名前に変更する場合には、 そのプログラムにとって意味のある名前を与えるために REPLACING 句を使用することができます。

例 1

この例では、ライブラリー・テキスト PAYLIB は、 次のようなデータ部の項目から構成されています。

01  A.
  02  B    PIC S99.
  02  C    PIC S9(5)V99.
  02  D    PIC S9999 OCCURS 1 TO 52 TIMES
      DEPENDING ON B OF A.

プログラマーは、プログラムのデータ部の中で COPY ステートメントを次のように使用することができます。

COPY PAYLIB.

このプログラムでは、ライブラリー・テキストがコピーされます。結果テキストは、次のように書き込まれたものとして扱われます。

01  A.
  02  B    PIC S99.
  02  C    PIC S9(5)V99.
  02  D    PIC S9999 OCCURS 1 TO 52 TIMES
      DEPENDING ON B OF A.

例 2

ライブラリー・テキストの中のいくつかの (またはすべての) 名前を変更するために、 プログラマーは REPLACING 句を使用することができます。

COPY PAYLIB REPLACING A BY PAYROLL
                      B BY PAY-CODE
                      C BY GROSS-PAY
                      D BY HOURS.

このプログラムでは、ライブラリー・テキストがコピーされます。結果テキストは、次のように書き込まれたものとして扱われます。

01  PAYROLL.
  02  PAY-CODE    PIC S99.
  02  GROSS-PAY   PIC S9(5)V99.
  02  HOURS       PIC S9999 OCCURS 1 TO 52 TIMES
      DEPENDING ON PAY-CODE OF PAYROLL.

ここに示された変更は、このプログラムに対してだけ行われます。ライブラリーの中にあるテキストは変更されません。

例 3

ライブラリー・テキストの中で次のような規則に従っている場合、名前の一部 (例えばデータ名の接頭部) を REPLACING 句を使って変更することができます。

この例では、ライブラリー・テキスト PAYLIB は、 次のようなデータ部の項目から構成されています。

01  :TAG:.
  02  :TAG:-WEEK          PIC S99.
  02  :TAG:-GROSS-PAY     PIC S9(5)V99.
  02  :TAG:-HOURS         PIC S999  OCCURS 1 TO 52 TIMES
          DEPENDING ON :TAG:-WEEK OF :TAG:.

プログラマーは、プログラムのデータ部の中で COPY ステートメントを次のように使用することができます。

COPY PAYLIB REPLACING ==:TAG:== BY ==Payroll==.

注: この例で特に注意する点は、ライブラリー・テキストの中で区切り文字としてコロンや括弧を使用する必要があることです。 括弧は、添え字やテーブル・エレメントを参照するインスタンスの場合でも使用されるため、わかりやすさを考慮してコロンを使用してください。

このプログラムでは、ライブラリー・テキストがコピーされます。結果テキストは、次のように書き込まれたものとして扱われます。

01  PAYROLL.
  02  PAYROLL-WEEK        PIC S99.
  02  PAYROLL-GROSS-PAY   PIC S9(5)V99.
  02  PAYROLL-HOURS       PIC S999  OCCURS 1 TO 52 TIMES
      DEPENDING ON PAYROLL-WEEK OF PAYROLL.

ここに示された変更は、このプログラムに対してだけ行われます。ライブラリーの中にあるテキストは変更されません。

例 4

この例では、PICTURE 文節の番号を置き換えずに、 レベル番号を選択して置き換える方法を示します。

COPY xxx REPLACING ==(01)== BY ==(01)==
                   == 01 == BY == 05 ==.

ご利用条件 | フィードバック

Copyright IBM Corporation 1996, 2008.
このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)