コンパイラー指示ステートメント

コンパイラー指示ステートメントとは、コンパイル時にコンパイラーに特定の処理を指示するステートメントです。コンパイルの前にソース・テキストを制御するCOPY、REPLACEステートメントがあります。本章では、コンパイラー指示ステートメントの使用方法について説明します。

1. COPY

COPYステートメントは、事前に書かれたテキストをプログラムのソース内に挿入する機能を提供します。

事前に作成されたコードを任意のコピーブック・ファイルに保存しておき、COPYステートメントの指定によりソースを挿入して使用します。コピーブック・ファイルを使用するためには、環境変数$ OFCOBCPYにコピーブックのパスを登録します。

以下は、COPYステートメントの形式です。

figure copy
COPYステートメントの形式

以下は、ステートメントの各設定項目についての説明です。

  • text-name、literal-1

    • 置換するソースコードが記述されているコピーブック・ファイル名を記述します。環境変数に設定されたコピーブックのパスからコピーブックを検索します。

    • コピーブック名は、ファイル名の規則が適用されます。

    • COPYステートメントで有効なコピーブック名は、最大8文字までです。

    • 8文字を超える場合は、コンパイル・オプションとして--disable-cpy-limitを使用する必要があります。

  • library-name、literal-2

    • コピーブック・ファイルのパスを記述します。

  • REPLACING句

    • REPLACING句は、operand-1に対応するテキストに一致する項目がある場合、指定されたoperand-2で置換して挿入します。

    • 以下は、オペランドに指定できる項目です。

      項目 説明

      疑似テキスト

      疑似テキスト区切り文字(==)によって区切られた一連の文字列と区切り文字を指定します。

      疑似テキストを区切る疑似テキスト区切り文字(==)は連続して現れる必要があり、1つの行内に存在しなければなりません。ただし、疑似テキスト自体は、複数の行にわたって記述することができます。

      ID

      データ部に定義された任意のセクション名を指定することができます。

      リテラル

      数字リテラル、英数字リテラル、2バイト文字リテラルを指定することができます。

      COBOLワード(COPYを除く)

      COPYを除くCOBOLワードを指定することができます。

      関数ID

      関数IDを指定することができます。

以下は、COPYステートメントの使用規則です。

  • 文字列と区切り文字が使用できるどこからも、ソース・テキスト内でCOPYステートメントを使用することができます。

  • COPYステートメントは、COPYワードで始まりピリオド(.)で終わる1つのステートメントがコピーブックの内容で置き換えられます。REPLACING句を指定した場合、指定された規則に従ってテキストの置き換えが行われます。

  • COPYステートメントはネストできます。ただし、ネストさせる場合には、REPLACING句を指定することができません。また、REPLCACING句が指定されたコピーブックをCOPYステートメントで指定することができません。10以上のコピーブックがネストされることはできません。

  • COPYステートメントが再帰することはできません。たとえば、「COPY X.」があり、コピーブックXに「COPY Y.」がある場合、コピーブックYにCOPY XまたはCOPY Yステートメントが含まれることはできません。

  • コピーブックに作成されたソースが構文に合っているのかをチェックしません。すべてのCOPYステートメントとREPLACEステートメントの処理が完全に終了してから、構文チェックが行われます。ただし、コピーブックに記述されたソース・テキストはそのまま挿入されるため、コピーブックを作成するときは、ソース・テキストの形式に合わせて記述される必要があります。

置換と比較の規則

以下は、置換と比較についての規則です。

  • 算術演算子と論理演算子は、テキスト・ワードとみなされ、疑似テキストで置き換えることができます。疑似テキスト区切り文字の前後空白は除外されます。ただし、テキストの中の空白は処理されます。

  • operand-1が表意定数の場合、同じ表意定数とのみ一致します。

    たとえば、ALL "AB"が指定された場合、「ABAB」とは一致しません。

  • PICTURE文字列を置き換える場合は、疑似テキストの区切り文字を使用することができます。ただし、精度を高めるためにPI​​CTURE文字列を置き換える場合、疑似テキストには、PICTUREとPICのようなキーワードを含むPICTURE文字列全体を指定することをお勧めします。

  • コピーブック・ファイル内に記述された区切り文字のコンマ(,)、セミコロン(;)、空白はすべて挿入されます。

  • operand-1とライブラリ・テキストは、operand-1に指定された一連の文字列の順序とライブラリ・ワードの順序がすべて等しい場合にのみ一致します。一致するものが見つかるか、あるいはREPLACINGがなくなるまで比較が行われます。

    operand-1に一致するものが見つかるたびに、operand-2に指定された内容で挿入されます。

  • REPLACING句が指定された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.

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

COPY  PAYLIB.

プログラムでは、コピーブックPAYLIBに記述されたソースが挿入されます。

以下は、REPLACINGを使用して名前を変更する例でです。

COPY  PAYLIB  REPLACING  A BY PAROLL
                         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.

このとき、指定された変換は、そのプログラムでのみ行われます。コピーブックPAYLIBは変更されません。

以下のような規則を持つコピーブックは、名前の一部(接頭辞など)をREPLACINGを指定して変更することができます。

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

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

COPY  PAYLIB REPLACING ==:TAG:== BY ==Payroll==.
または
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  S9999  OCCURS 1 TO 52 TIMES
                      DEPENDING ON PAYROLL-WEEK OF PAYROLL.

以下は、PICTURE文字列でレベル番号を指定して置き換える例です。

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

2. REPLACE

REPLACEステートメントは、ソース・プログラム内のテキストを変換するために使用します。ソース・プログラム内で文字列が使用できるどころなら、どこにでも記述することができます。

REPLACEステートメントは、変更が必要な部分を直接探して変更するのではなく、COBOLコンパイル・グループの全体、またはその一部を変更するために使用することができます。COPYステートメントが指定されたコピーブックを挿入する過程​​でのみ変換する場合とは違って、プログラム・ソース全体を対象とするという点を除けば、COPYステートメントにREPLACINGを指定した場合と同じ比較および変換規則が適用されます。

  • 形式1

    ソース・プログラム内でpseudo-text-1に一致するテキストが現れるたびに、対応されるpseudo-text-2によって変換されます。

    figure replace format1
    REPLACEステートメントの形式1
  • 形式2

    REPLACEステートメントで指定された変換規則は、REPLACE-OFFが現れるまで適用されます。REPLACE-OFFがない場合のREPLACE規則は、ステートメントが開始された時点から、次のREPLACEステートメントが現れるまで、あるいはプログラムの終了まで適用されます。

    figure replace format2
    REPLACEステートメントの形式2

以下は、ステートメントの各設定項目についての説明です。

  • pseudo-text-1

    • 1つ以上のテキスト・ワードを含む必要があります。

    • pseudo-text-1は、区切り文字のコンマ(,)、またはセミコロン(;)だけで構成することができます。

  • pseudo-text-2

    • 1つ以上または1つも指定しないことができます。何も指定しなかった場合は、削除を意味します。

pseudo-text-1とpseudo-text-2は、ソース・プログラムに記述することができる任意のテキスト・ワード(COPYを除く)を使用することができます。

コンパイラーは、COPYステートメントが指定されていると、先にこれを処理してから次のソース・プログラム内のREPLACEステートメントを処理します。COPYステートメントがある場合は、完全なソースを先に生成する必要があるためです。その後、REPLACEステートメントを使用して単純な文字列の置換が行われます。REPLACEステートメントは、内部にCOPYステートメントを含むことはできません。

COPYステートメントとREPLACEステートメントの処理が完了するまで、そのソース・プログラムの構文チェックを判別することができません。

3. READY TRACEとRESET TRACE

READY TRACEあるいはRESET TRACEステートメントは、プロシージャの実行をトレースするために使用します。

READY TRACEとRESET TRACEステートメントは、一般的なステートメントが許可されるところに位置することができます。OFCOBOLでは、compile option --traceを介してREADY TRACEとRESET TRACEを使用することができます。

コンパイル時に、そのコンパイル・オプションを指定しないと、READY TRACEとRESET TRACEステートメントは無視されます。

  • READY TRACE

    figure ready trace
    READY TRACEステートメント

    READY TRACEステートメントが実行された時点以降のプロシージャ名を出力します。

  • RESET TRACE

    figure reset trace
    RESET TRACEステートメント

    RESET TRACEステートメントが実行された時点以降のプロシージャ名は出力されません。