Index
PERFORM

【用途】
復帰するジャンプ命令。BASICで言うトコロのGOSUBと同じ。
また繰り返し命令としても使用される。この命令も利用頻度は激高で必須。

【使用例】
・READ処理をやりなさい。終わったら戻りなさい
   PERFORM  READ-R

・READ処理を入力ファイルが無くなるまでやりなさい
   PERFORM  READ-R UNTIL IN-REC = HIGH-VALUE

・READ処理を10回繰り返しなさい
   PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
     PERFORM READ-R
   END-PERFORM

PERFORM文


機能

PERFORM(実行)文は,幾つかの手続きに明に制御を移し,指定した手続きの実行が終わると,暗に制御をもどす.また,PERFORM文は,そのPERFORM文の範囲に含まれる一つ以上の文の実行を制御するためにも用いられる.


一般形式

【書き方1】
Image

【書き方2】
Image

【書き方3】
Image

【書き方4】
Image


構文規則

(1)

手続き名-1を書かない場合は,無条件文-1とEND-PERFORM(PERFORM文の終わり)指定を書かなければならない.手続き名-1を書く場合は,無条件文-1とEND-PERFORM指定を書いてはならない.

(2)

書き方4で,手続き名-1を書かない場合は,AFTER(後)指定を書いてはならない.

(3)

TEST BEFORE(前に検査)指定もTEST AFTER(後に検査)指定も書かない場合は,TEST BEFORE指定を書いたものとみなされる.

(4)

一意名は,数字項目でなければならない.書き方2では,一意名-1は,整数項目でなければならない.

(5)

定数は,数字定数でなければならない.

(6)

THRUとTHROUGHは同義語であり,どちらを書いてもよい.

(7)

VARYING(変更)指定やAFTER指定で指標名を使う場合,次の規則に従う.
(a)

FROM(初期値)指定とBY(刻み)指定の一意名は,整数項目でなければならない.

(b)

FROM指定の定数は,正の整数でなければならない.

(c)

BY指定の定数は,ゼロでない整数でなければならない.

(8)

FROM指定で指標名を使う場合,次の規則に従う.
(a)

VARYING指定又はAFTER指定の一意名は,整数項目でなければならない.

(b)

BY指定の一意名は,整数項目でなければならない.

(c)

BY指定の定数は,整数でなければならない.

(9)

BY指定の定数は,ゼロであってはならない.

(10)

条件-1,条件-2には“条件式”のいずれの条件式を使ってもよい.

(11)

手続き名-1と手続き名-2の両方を指定し,かついずれかの手続き名が手続き部の宣言部分中の手続き名の場合,他方の手続き名も同一の宣言節の中になければならない.

(12)

書き方4のPERFORM文に,6個のAFTER指定が記述できる.

(13)

一意名-1又は整数-1に指定できる値についてはマニュアルを参照されたい.


一般規則

(1)

一意名-4及び一意名-7のデータ項目の値は,ゼロであってはならない.

(2)

VARYING指定やAFTER指定に指標名を指定し,関連するFROM指定に一意名を指定した場合,一意名のデータ項目の値は,正でなければならない.

(3)

手続き名-1を指定した場合,このPERFORM文を“そと”PERFORM文といい,手続き名-1を省略した場合,このPERFORM文を“うち”PERFORM文という.

(4)

そとPERFORM文の手続き名-1(手続き名-2が指定されていれば,手続き名-2まで)の範囲に含まれている文,又はうちPERFORM文自身に含まれている文を,“指定された文の組”という.

(5)

END-PERFORM指定は,うちPERFORM文の範囲を区切る.

(6)

うちPERFORM文は,手続き名-1(手続き名-2が指定されていれば,手続き名-2まで)の範囲に含まれている文の代わりにうちPERFORM文の中に含まれている文が実行されることを除けば,等価なそとPERFORM文の以下に示す一般規則に従って動作する.“うち”又は“そと”と明に断わらない限り,そとPERFORM文に対する一般規則はうちPERFORM文にも適用される.

(7)

PERFORM文を実行すると,指定された文の組の最初の文に制御が移る(ただし,一般規則(10)(b),(c)及び(d)で示す場合を除く).この制御の移行は,PERFORM文の実行のたびにただ1度だけ行われる.指定された文の組に制御が移った後,以下の場所からPERFORM文の終わりに暗の制御がもとる.
(a)

手続き名-1が段落名で手続き名-2が指定されていないとき,その段落の最後にある文の後.

(b)

手続き名-1が節名で手続き名-2が指定されていないとき,その節の最後にある段落の最後の文の後.

(c)

手続き名-2が指定されていて,それが段落名のとき,その段落の最後にある文の後.

(d)

手続き名-2が指定されていて,それが節名のとき,その節の最後にある段落の最後の文の後.

(e)

うちPERFORM文では,その中に含まれている最後の文の実行後.

(8)

手続き名-1と手続き名-2の関係は,制御の流れが手続き名-1から始まって手続き名-2に至るだけでよい.GO TO(飛越し)文又はPERFORM文が,手続き名-1から手続き名-2の終わりまでの間にあってもよい.復帰点への経路が複数通りあるときは,手続き名-2はEXIT(出口)文だけの段落名でもよく,すべての経路をここに集めなければならない.

(9)

これらの指定された文の組にPERFORM文以外で制御が移ったとき,制御は,この文の組の最後の文からその次の実行文に,これらの文の組を参照するPERFORM文が一つもないのと同様に移る.

(10)

PERFORM文のすべての書き方に関する規則は,次のとおりとする.
(a)

書き方1は,指定された文の組を一回だけ実行する.その後,制御は,PERFORM文の終わりにもどる.

(b)

書き方2のTIMES(回数)指定では,整数-1又は一意名-1のデータ項目の初期値で指定された回数だけ,指定された文の組を実行する. PERFORM文を実行する際に,一意名-1のデータ項目の値がゼロ又は負のときには,制御はPERFORM文の終わりに移る.指定された回数だけ指定された文の組を実行すると,制御はPERFORM文の終わりに移る.
PERFORM文の実行中に,一意名-1のデータ項目の値を変更しても,指定された文の組の実行回数は変わらない.

(c)

書き方3のUNTIL(条件まで)指定では,UNTIL指定で記述した条件-1を満足するまで,指定された文の組を反復実行する.その後,制御はPERFORM文の最後に移る.最初から条件-1を満足していて,しかもTEST BEFORE指定が明又は暗に指定されているときは,この手続きは実行されずに,制御はPERFORM文の終わりに移る.TEST AFTER指定が書かれているときは,PERFORM文は,指定された文の組の実行後に条件が評価されていることを除いて,TEST BEFORE指定のときと同じように動作する.条件-1中の作用対象に付けられた添字や部分参照子は,条件が検査される都度評価される.

(d)

書き方4のVARYING(変更)指定は,PERFORM文の実行中に幾つかの一意名や指標名の値を規則的に変化させるときに使う.以下の規則において,VARYING,AFTER(後)及びFROM(初期値)の後の一意名に関する規則は,指標名にも適用する.指標名-1又は指標名-3を指定した場合,関連する指標の値は,そのPERFORM文の始めでその表中の要素の出現番号が設定されなければならない.指標名-2又は指標名-4を指定した場合,一意名-2又は一意名-5のデータ項目の値は,そのPERFORM文の始めで指標名-2又は指標名-4に関係付けられた表中の要素の出現番号と等しくならなければならない.以下で記述されるような引き続く指標名-1又は指標名-3の増加は,PERFORM文の終わりを除いて,関連する指標に指標名-1又は指標名-3に関連付けられた表の範囲外の値を設定することになってはならない.PERFORM文の終わりでは,指標名-1に関連付けられた指標は,一つの増分値又は減分値だけ関連する表の範囲外の値を含むことがある.
一意名-2又は一意名-5が添字付けされている場合,添字は一意名のデータ項目の内容が設定又は増加される都度評価される.一意名-3,一意名-4,一意名-6,又は一意名-7が添字付けされている場合,添字は一意名のデータ項目の内容が設定又は増加に使われる都度評価される.条件-1又は条件-2中の作用対象に付けられた添字や部分参照子は,条件が検査される都度評価される.
書き方4の幾つかの動作を図3.7から図3.10に示す.
(i)

TEST BEFORE指定が明又は暗に指定された場合
一つの一意名を変化させる場合,まず一意名一2のデータ項目の内容を,定数-1又はPERFORM文の開始時の一意名-3のデータ項目の現在値に等しくする.その後,UNTIL指定の条件を検査し,満足していなければ,指定された文の組を1回実行する.続いて,一意名-2のデータ項目の値に,定数-2又は一意名-4のデータ項目の増分又は減分を加えて,条件-1が真になるまで, この操作が繰り返される.条件-1が真になると,制御は,PERFORM文の終わりに移る.
PERFORM文の実行を始めるとき,既に条件-1が満足されていれば,制御はPERFORM文の終わりに移る.
書き方4(TEST BEFORE指定)で一つの一意名を変化させたときの制御の流れを図3.7に示す.

図3.7 書き方4で一つの一意名を変化させたときの流れ図(TEST BEFORE指定)
書き方4で一つの一意名を変化させたときの流れ図(TEST BEFORE指定)

二つの一意名のデータ項目を変化させる場合,一意名-2のデータ項目の内容を,定数-1又は一意名-3のデータ項目の現在値に等しくし,一意名-5のデータ項目の内容を,定数-3又は一意名-6のデータ項目の現在値に等しくする.その後,まず条件-1を検査し,満足していれば,制御は,PERFORM文の終わりに移る.満足していなければ,条件-2を検査する.条件-2も満足していなければ,指定された文の組を1回実行し,一意名-5のデータ項目の内容に定数-4又は一意名-7のデータ項目の内容を加えて,再び条件-2を検査する.条件の検査及び値の増加のこの繰返しは,条件を満足するまで続く.条件-2が満足されると,一意名-2のデータ項目の内容に定数-2又は一意名-4のデータ項目の内容を加え,一意名-5のデータ項目の内容を定数-3又は一意名-6のデータ項目の現在値に等しくして,再び条件-1を検査する.PERFORM文は,条件-1を満足したときに終わる.満足しないときは,条件-1 が満足されるまで繰り返される.

図3.8 書き方4で二つの一意名を変化させたときの流れ図(TEST BEFORE指定)
書き方4で二つの一意名を変化させたときの流れ図(TEST BEFORE指定)

PERFORM文の実行が終わったとき,一意名-5のデータ項目には,定数-3又は一意名-6のデータ項目の現在値が入っている.一意名-2のデータ項目には,最後に使用した一つの増分値又は減分値だけ超えた値が入っている.ただし,PERFORM文を実行し始めた時に条件-1が満足されていると,一意名-2のデータ項目には,定数-1又は一意名-3のデータ項目の現在値が入っている.

(ii)

TEST AFTER指定が書かれた場合
一つの一意名を変化させる場合,まず一意名-2のデータ項目の内容を,定数-1又はPERFORM文開始時の一意名-3のデータ項目の現在値に等しくする.その後,指定された文の組を1回実行し,UNTIL指定の条件-1を検査する.条件を満足していなければ,一意名-2のデータ項目の値に定数-2又は一意名-4のデータ項目の値の増分又は減分を加え,指定された文の組を再度実行する.条件-1が真になるまで,この操作が繰り返される.条件-1が真になると,制御は,PERFORM文の終わりに移る.

図3.9 書き方4で一つの一意名を変化させたときの流れ図(TEST AFTER指定)
書き方4で一つの一意名を変化させたときの流れ図(TEST AFTER指定)

二つの一意名のデータ項目を変化させるとき,一意名-2のデータ項目の内容を,定数-1又は一意名-3のデータ項目の現在値に等しくし,一意名-5のデータ項目の内容を,定数-3又は一意名-6のデータ項目の現在値に等しくして,指定された文の組を実行する.その後,まず条件-2を検査し,満足していなければ,一意名-5のデータ項目の内容に定数-4又は一意名-7のデータ項目の内容を加え,指定された文の組を再び実行する.これを条件-2を満足するまで繰り返し,条件-2を満足したとき条件-1を検査する.満足していなければ,一意名-2のデータ項目の内容に定数-2又は一意名-4のデータ項目の内容を加え,一意名-5のデータ項目の内容を,定数-3又は一意名-6のデータ項目の現在値に等しくして,指定された文の組を再び実行する.これを条件-1を満足するまで繰り返し,条件-1を満足したとき制御はPERFORM文の終わりに移る.
PERFORM文の実行が完全に終わった後,AFTER指定又はVARYING指定によって変更される各データ項目には,指定された文の組が最後に実行されたときと同じ値が入っている.

図3.10 書き方4で二つの一意名を変化させたときの流れ図(TEST AFTER指定)
書き方4で二つの一意名を変化させたときの流れ図(TEST AFTER指定)

PERFORM文の指定された文の組の実行中に,VARYING指定の一意名-2のデータ項目及び指標名-1,BY指定の一意名-4のデータ項目,AFTER指定の一意名-5のデータ項目及び指標名-3,又はFROM指定の一意名-3のデータ項目及び指標名-2を変更した場合は,その変更が評価されてPERFORM文の実行に影響を及ぼす.
二つの一意名のデータ項目を変化させるとき,一意名-2のデータ項目の内容が変更されるごとに一意名-5のデータ項目が,FROM指定,BY指定及びUNTIL指定の処理を一巡する.三つ以上の一意名のデータ項目を変化させるとき,その機構は,二つの一意名のときと同じで,ただ先行するAFTER指定のデータ項目が変更されるごとに各AFTER指定のデータ項目が処理を一巡する.

(11)

PERFORM文の範囲は,PERFORM文の終わりに制御が暗に渡るまでのPERFORM文の実行結果として実行されるすべての文によって論理的に構成される.その範囲は,そのPERFORM文の範囲中のCALL文,EXIT文,GO TO文及びPERFORM文によって制御が渡された結果実行されるすべての文及びそのPERFORM文の範囲中の文の実行の結果実行される宣言手続き中のすべての文を含む.PERFORM文の範囲中の文は,原始プログラム中で連続している必要はない.

(12)

下記の場合,EXIT PROGRAM文の実行によって生ずる制御の移行の結果として実行される文は,PERFORM文の範囲の一部とはみなされない.
(a)

そのEXIT PROGRAM文は,そのPERFORM文が指定された同じプログラム中で指定され,かつ,

(b)

そのEXIT PROGRAM文は,そのPERFORM文の範囲中に存在する.

(13)

手続き名-1及び手続名-2は,他のプログラムがそのPERFORM文を含むプログラムを含むか,それに含まれるかにかかわらず,その実行単位中の他のプログラムの節又は段落の名前であってはならない.PERFORM文の範囲にCALL文及びEXIT PROGRAM文が含まれるならば,その実行単位中の他のプログラムの文は,そのPERFORM文の実行の結果によってだけ実行される.

(14)

一つのPERFORM文の実行範囲に,他のPERFORM文があるとき,含まれているPERFORM文の実行範囲は,はじめのPERFORM文の論理的な実行範囲の内側に完全に含まれているか,又は完全に外側であるかでなければならない.あるPERFORM文の実行範囲内で始められた他のPERFORM文の制御は,前者のPERFORM文の出口を通ってはならない.更に,このような実行中の2個以上のPERFORM文は,共通の出口をもっていてはならない.
このコンパイラでは,実行中の2個以上のPERFORM文が,共通の出口を持っていてもよい.

例:
PERFORM文の正しい使い方の例を示す.

Image

(15)

PERFORM文の実行範囲に含むことができるのは,次のものだけとする.
(a)

節又は段落.

(b)

その実行範囲内で暗に呼ばれる宣言節中の節又は段落.


Index