33.3.4 条件翻訳結果のコンパイルリスト
条件翻訳の結果,コンパイル対象とならなかった行を,無効行と呼びます。
COBOL2002では,コンパイルリスト上で,原始プログラム中の無効行となった部分を確認できます。また,コンパイルリストに無効行を出力しない機能もあります。
- 〈この項の構成〉
(1) コンパイルリスト上の表示
条件翻訳の結果無効行となった行は,コンパイルリストに'X'が出力されます。
また,コンパイルリストに無効行を出力したくない場合は,-SrcListオプションにNoFalsePathサブオプションを付けて指定します。
コンパイルリストに関係するその他のオプションについては,「付録E.1 リストの出力」を参照してください。
- コンパイルリストの例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
- (説明)
-
翻訳変数CMPVAR1が000200行で定義されているので,ELSE側である001400,001500行は無効行となります。そのため,これらの行の先頭にXが出力されます。
- コンパイルリストの例2
-
-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
- (説明)
-
-SrcListオプションにNoFalsePathサブオプションを指定した場合,無効行となった001400,001500行は,コンパイルリストに出力されません。
その結果,001600行が詰められて,001300行の次に出力されます。
(2) 無効行の定義
無効行の定義を,次に示します。
-
条件翻訳として判定中の>>IF,>>ELSE,>>END-IF,>>EVALUATE,>>WHEN,>>END-EVALUATEが指定された行自身は,無効行とはなりません。
-
条件翻訳のための翻訳指令行でも,無効な領域にある場合は無効行となります。
-
>>SOURCE FORMATは,常に無効行となりません。
次に,各定義の例を示します。なお,例中の「X」は,その行が無効行となることを示します。
- 1.の例(その1)
-
>>IFの>>ELSE側が無効な場合,>>IFや>>ELSEなどは無効行となりません。
>>DEFINE ABC 123 >>IF ABC = 123 DISPLAY 'OK'. >>ELSE X DISPLAY 'NG'. >>END-IF
- 1.の例(その2)
-
>>IFの>>ELSE側が有効な場合の例です。
>>DEFINE ABC 123 >>IF ABC = 12345 X DISPLAY 'NG'. >>ELSE DISPLAY 'OK'. >>END-IF
- 1.の例(その3)
-
>>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
- 2.の例
-
無効な領域にある場合は,>>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
- 3.の例
-
無効な領域にある場合でも,>>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