COBOL2002 ユーザーズガイド


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) 無効行の定義

無効行の定義を,次に示します。

  1. 条件翻訳として判定中の>>IF,>>ELSE,>>END-IF,>>EVALUATE,>>WHEN,>>END-EVALUATEが指定された行自身は,無効行とはなりません。

  2. 条件翻訳のための翻訳指令行でも,無効な領域にある場合は無効行となります。

  3. >>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