条件翻訳の結果,コンパイル対象とならなかった行を,無効行と呼びます。
COBOL2002では,コンパイルリスト上で,原始プログラム中の無効行となった部分を確認できます。また,コンパイルリストに無効行を出力しない機能もあります。
条件翻訳の結果無効行となった行は,コンパイルリストに'X'が出力されます。
また,コンパイルリストに無効行を出力したくない場合は,-SrcListオプションにNoFalsePathサブオプションを付けて指定します。
コンパイルリストに関係するその他のオプションについては,「付録C.1 リストの出力」を参照してください。
-SrcList,CopyAllオプションを指定した場合
D CP N ----+----1----+----2----+----3----+----4----+----5----+----6----+
000100 IDENTIFICATION DIVISION.
000200 >>DEFINE CMPVAR1 AS -123456
000500 PROGRAM-ID. AAA.
000900 PROCEDURE DIVISION.
001000 >>IF CMPVAR1 IS DEFINED
001100 DISPLAY '--- test (1) ---'.
001200 DISPLAY '--- test (2) ---'.
001300 >>ELSE
X 001400 DISPLAY '--- test (3) ---'.
X 001500 DISPLAY '--- test (4) ---'.
001600 >>END-IF
-SrcList,CopyAll,NoFalsePathオプションを指定した場合
D CP N ----+----1----+----2----+----3----+----4----+----5----+----6----+
000100 IDENTIFICATION DIVISION.
000200 >>DEFINE CMPVAR1 AS -123456
000500 PROGRAM-ID. AAA.
000900 PROCEDURE DIVISION.
001000 >>IF CMPVAR1 IS DEFINED
001100 DISPLAY '--- test (1) ---'.
001200 DISPLAY '--- test (2) ---'.
001300 >>ELSE
001600 >>END-IF
無効行の定義を,次に示します。
次に,各定義の例を示します。なお,例中の「X」は,その行が無効行となることを示します。
>>IFの>>ELSE側が無効な場合,>>IFや>>ELSEなどは無効行となりません。
>>DEFINE ABC 123
>>IF ABC = 123
DISPLAY 'OK'.
>>ELSE
X DISPLAY 'NG'.
>>END-IF
>>IFの>>ELSE側が有効な場合の例です。
>>DEFINE ABC 123
>>IF ABC = 12345
X DISPLAY 'NG'.
>>ELSE
DISPLAY 'OK'.
>>END-IF
>>EVALUATEの例です。
>>DEFINE CHAR01 AS 'ABCD'
>>EVALUATE TRUE
>>WHEN CHAR01 = 'ABCD'
DISPLAY '0001'.
DISPLAY '0002'.
>>WHEN CHAR01 = 'XYZ'
X DISPLAY '0003'.
X DISPLAY '0004'.
>>WHEN OTHER
X DISPLAY 'OTHER'.
>>END-EVALUATE
無効な領域にある場合は,>>IFなどの翻訳指令行自身も無効行となります。
>>DEFINE ABC 123
>>IF ABC = 123
DISPLAY 'OK'.
>>ELSE
X DISPLAY 'NG'.
X >>IF ABC = 456
X DISPLAY 'OK'.
X >>ELSE
X DISPLAY 'NG'.
X >>END-IF
>>END-IF
無効な領域にある場合でも,>>SOURCE FORMAT指令は,無効行になりません(>>SOURCE FORMAT指令は,どこに指定されても有効となります)。
>>DEFINE ABC 123
>>IF ABC = 123
DISPLAY 'OK'.
>>ELSE
X DISPLAY 'NG1'.
X DISPLAY 'NG2'.
>>SOURCE FORMAT IS FREE
X DISPLAY 'NG3'.
X DISPLAY 'NG4'.
>>END-IF