自由形式の演算ステートメント
自由形式ステートメントで使用可能な桁については、自由形式ステートメントを参照してください。
自由形式ステートメントでは、命令コードは使用可能な桁内の特定の位置で始まる必要はありません。
すべての拡張は、同一行上の命令コードの直後に、括弧で囲む必要があります。
命令コードおよび拡張の間には、ブランクを入れないでください。
命令コードおよび拡張の次に、演算項目 1、演算項目 2、結果フィールド・オペランドをブランクで分離して指定します。
これらのいずれかのオペランドが命令に必要ない場合、空白のままにしておきます。
ステートメントの残りの部分は、ブランクおよび継続行を自由に使用できます。
それぞれのステートメントは、セミコロンで終了する必要があります。
セミコロンの後ろのレコードの残り部分は、ブランクになっているか、ま
たは行末コメントを含んでいる必要があります。
命令コード EVAL または CALLP において、拡張が不要で、変数またはプロトタイプの名前が命令コードの名前と異なる場合には、命令コードを省略できます。
例えば、以下の 2 つのステートメントは同等です。
eval pos = %scan (',': name);
pos = %scan (',': name);
自由形式演算ブロック内のすべてのレコードは、6 から 7 桁目をブランクにしておく必要があります。
コンパイラー指示は、以下の制約事項に沿って、自由形式演算ブロック内に指定できます。
コンパイラー指示は、行の最初の項目でなければなりません。
次の行に継続することはできません。
桁制約付きコードでは、指示は 7 桁目以降の任意の位置で開始することができます。
- コンパイラー指示は、ステートメントでは許可されていません。 指示は、1 つのステートメントの終了後、次のステートメントが始まる前の新規行に表示する必要があります。
自由形式のオペランドは、14 文字よりも長くすることができます。
以下はサポートされていません。
- 数値リテラルの継続
- フィールド名の定義
- 結果標識。(結果標識を持つ命令コードを使用する必要があるほとんどの場合、 代わりに等価の組み込み関数を使用できます。)
合計演算の開始を示すには、7 から 8 桁目に指定されている制御レベルを使用して、
固定形式演算仕様書をコード化します。完全自由形式モードでは、この固定形式ステートメントはコピー・ファイルに指定しなければなりません。
合計演算は、自由形式演算構文を使用して指定することができます。
自由形式演算仕様書には、制御レベルの記入項目が含まれていないため、
特定のレベルの中断で実行される演算は、「IF *INLx;」ステートメントを使用して条件付けを行う必要があります。
- 明細演算
- 合計演算の開始
- 特定の制御レベル標識による演算の条件付け
items += 1; 1
CL0 Total TAG 2
IF *INL1; 3
EXCEPT orderTotal;
orders += 1;
totalItems += items;
items = 0;
ENDIF;
図 1. 自由形式演算仕様書の例
*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
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;
桁制限付きソースでは、次のように、自由形式の演算仕様書と従来型の演算仕様書を同じプログラム内で結合することができます。
図 2. 従来型演算仕様書および自由形式演算仕様書を結合する例
C testb OPEN_ALL flags 10
if *in10;
openAllFiles();
endif;