自由形式構文

自由形式演算グループを開始するには、7 から 11 桁目に /FREE を指定し、12 から 80 桁目はブランクにしておきます。 自由形式演算ブロックは、/END-FREE を指定することで終了します。

自由形式ステートメントでは、命令コードは 8 から 80 桁内の特定の桁で始まる必要はありません。 すべての拡張は、同一行上の命令コードの直後に、括弧で囲む必要があります。 命令コードおよび拡張の間には、ブランクを入れないでください。 命令コードおよび拡張の次に、演算項目 1、演算項目 2、結果フィールド・オペランドをブランクで分離して指定します。 これらのいずれかのオペランドが命令に必要ない場合、空白のままにしておきます。 ステートメントの残りの部分は、ブランクおよび継続行を自由に使用できます。 それぞれのステートメントは、セミコロンで終了する必要があります。 セミコロンの後ろのレコードの残り部分は、ブランクになっているか、ま たは行末コメントを含んでいる必要があります。

EVAL または CALLP 命令コードの場合、拡張が不要で、変数の名前が命令コードの名前と異なる場合、 命令コードは省略できます。 例えば、以下の 2 つのステートメントは同等です。

 eval pos = %scan (',': name);
 pos = %scan (',': name);

自由形式演算ブロック内のすべてのレコードは、6 から 7 桁目をブランクにしておく必要があります。

コンパイラー指示は、以下の制約事項に沿って、自由形式演算ブロック内に指定できます。

自由形式のオペランドは、14 文字よりも長くすることができます。 以下はサポートされていません。

合計演算の開始を示すには、自由形式グループを終了し、7 から 8 桁目に指定されている制御レベルを使用して、 固定形式演算仕様書をコード化します。 合計演算は、自由形式演算構文を使用して指定することができます。 自由形式演算仕様書には、制御レベルの記入項目が含まれていないため、 特定のレベルの中断で実行される演算は、「IF *INLx;」ステートメントを使用して条件付けを行う必要があります。

図 139. 自由形式演算仕様書の例
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
 /free

         read  file;              // Get next record
         dow not %eof(file);      // Keep looping while we have
                                  // a record
             if %error;
                 dsply 'The read failed';
                 leave;
             else;
                 chain(n) name database data;
                 time = hours * num_employees
                          + overtime_saved;
                 pos = %scan (',': name);
                 name = %xlate(upper:lower:name);
                 exsr handle_record;
                 read file;
             endif;
         enddo;

      begsr handle_record;
         eval(h) time = time + total_hours_array (empno);
         temp_hours = total_hours - excess_hours;
         record_transaction();
      endsr;

 /end-free

次のように、同一のプログラム内に自由形式の演算仕様書および従来型の演算仕様書を結合できます。

図 140. 従来型演算仕様書および自由形式演算仕様書を結合する例
C                   testb     OPEN_ALL      flags                    10
/free
          if *in10;
            openAllFiles();
     endif;
      /end-free