32.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オプションでは,翻訳変数値を文字列として扱います。このため,数値は渡せません。