コンパイラー指示ステートメント
コンパイラー指示ステートメントとは、コンパイル時にコンパイラーに特定の処理を指示するステートメントです。コンパイルの前にソース・テキストを制御するCOPY、REPLACEステートメントがあります。本章では、コンパイラー指示ステートメントの使用方法について説明します。
1. COPY
COPYステートメントは、事前に書かれたテキストをプログラムのソース内に挿入する機能を提供します。
事前に作成されたコードを任意のコピーブック・ファイルに保存しておき、COPYステートメントの指定によりソースを挿入して使用します。コピーブック・ファイルを使用するためには、環境変数$ OFCOBCPYにコピーブックのパスを登録します。
以下は、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文字列を置き換える場合は、疑似テキストの区切り文字を使用することができます。ただし、精度を高めるためにPICTURE文字列を置き換える場合、疑似テキストには、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によって変換されます。
REPLACEステートメントの形式1 -
形式2
REPLACEステートメントで指定された変換規則は、REPLACE-OFFが現れるまで適用されます。REPLACE-OFFがない場合のREPLACE規則は、ステートメントが開始された時点から、次のREPLACEステートメントが現れるまで、あるいはプログラムの終了まで適用されます。
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
READY TRACEステートメントREADY TRACEステートメントが実行された時点以降のプロシージャ名を出力します。
-
RESET TRACE
RESET TRACEステートメントRESET TRACEステートメントが実行された時点以降のプロシージャ名は出力されません。