COBOL2002 ユーザーズガイド


33.3.3 条件翻訳の利用

条件翻訳を使用すると,翻訳変数を用いた条件式の真偽に従って,ソースコードの有効/無効を制御できます。翻訳変数は,原始プログラム中にDEFINEを書いて定義する方法と,コンパイル時に-Defineオプションを指定して定義する方法があります。

翻訳指令の詳細な構文規則および一般規則については,マニュアル「COBOL2002 言語 標準仕様編」 「3 翻訳指令機能」を参照してください。

条件翻訳の使用例を,次に示します。

(例1)IF指令の使用例

IF指令は,分岐の条件翻訳をしたい場合に使用します。

>>IFに続く条件式の真偽によって,プログラムテキストの有効・無効を指示できます。

000100*>IFとDEFINED条件の例
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. IF-SYNTAX.
000400 DATA DIVISION.
000500 >>DEFINE CHR01 AS 'ABCD'
000600 WORKING-STORAGE SECTION.
000700 PROCEDURE DIVISION.
000800 >>IF CHR01 IS DEFINED
000810     *> 翻訳変数CHR01は定義されているのでこちらが有効になる
000900     DISPLAY '--- CHR01 IS DEFINED ---'.
001000 >>ELSE
001100     *> こちらの行はコンパイルの結果無効となる
001100     DISPLAY '--- CHR01 IS NOT DEFINED ---'.
001200 >>END-IF
(例2)IF指令およびDEFINED条件と-Defineオプションの例

DEFINED条件は,指定された翻訳変数名が定義済みかどうかを判定する条件文です。

次の原始プログラムでは,翻訳変数DEBUGの定義の有無によって,IF指令の真偽が決定します。コンパイル時に「-Define DEBUG」を指定すると,翻訳変数DEBUGが定義され,IF指令が真となります。-Defineオプションを指定しない場合は,IF指令が偽となります。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. TEST001.
000300 PROCEDURE DIVISION.
000400
000500 >>IF DEBUG IS DEFINED
000600     DISPLAY 'this is debug message'.
000700 >>END-IF

デバッグ行を使用しても同様の処理ができますが,デバッグ行は第4次規格の廃要素であり,次回規格改訂時には削除される予定のため,条件翻訳を使用することを推奨します。

(例3)EVALUATE指令の例−書き方1

EVALUATE指令は,多方向分岐の条件翻訳をしたい場合に使用します。

WHEN以下の条件によって,有効となるプログラムテキストが選択されます。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. TEST001.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 PROCEDURE DIVISION.
000600 >>DEFINE EXD01 AS 10
000700
000800 >>EVALUATE EXD01 *> 翻訳変数 EXD01の値を評価する
000900   >>WHEN  3
001000     DISPLAY '--- 3          ---'.
001100   >>WHEN  15        
001200     DISPLAY '--- 15         ---'.
001300   >>WHEN  9  THRU 11 *> 9から11の間にある場合
001400     DISPLAY '---  9 THRU 11 ---'. *> ここが有効となる
001500   >>WHEN OTHER
001600     DISPLAY '--- WHEN OTHER ---'.
001700 >>END-EVALUATE
(例4)EVALUATE指令の例−書き方2
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. DEFINE01.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 >>DEFINE LEVEL AS 2
000600 PROCEDURE DIVISION.
000700 >>EVALUATE TRUE
000800   >>WHEN LEVEL < 3  *> ここが真
000900     DISPLAY 'lower'.
001000   >>WHEN LEVEL > 5
001100     DISPLAY 'higher'.
001200   >>WHEN OTHER
001300     DISPLAY 'other'.
001400 >>END-EVALUATE
(例5)EVALUATE指令の例−書き方2

EVALUATE指令では,一度真の条件が現れた場合,それ以降にさらに真の条件があっても実行されません。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. DEFINE01.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 >>DEFINE LEVEL AS 2
000600 PROCEDURE DIVISION.
000700 >>EVALUATE TRUE
000800   >>WHEN LEVEL < 3 *> ここが真
000900     DISPLAY 'lower'.
001000   >>WHEN LEVEL > 5
001100     DISPLAY 'higher'.
001200   >>WHEN LEVEL < 5 *>ここも真だが,すでに真となるWHENが存在する。
001300     DISPLAY 'lower 2'. *> よってここは実行されない。
001400   >>WHEN OTHER
001500     DISPLAY 'other'.
001600 >>END-EVALUATE
(例6)-Defineオプションの使用例

次のプログラムを「ccbl2002 -Define CHR01=ABCD SAMPLE1.cbl」と指定してコンパイルした場合,「>>IF CHR01 = 'ABCD'」の条件が真となります。

ソースファイル名称:SAMPLE1.cbl
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. DEFINEOPTION.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 PROCEDURE DIVISION.
000600 >>IF CHR01 = 'ABCD'
000700     *> 翻訳変数CHR01は-DefineオプションでABCDと定義。
000750     *> よってこちらが真。
000800     DISPLAY '--- CHR01 IS "ABCD" ---'.
000900 >>ELSE
001000     *> こちらの行は偽
001100     DISPLAY '--- CHR01 IS NOT "ABCD" ---'.
001200 >>END-IF
注意事項

-Defineオプションでは,翻訳変数値を文字列として扱います。このため,数値は渡せません。