ラベル データ

PROCEDURE 文および FORMAT 文以外の文のラベル プレフィックスは、文ラベルの宣言です。

LABEL 属性を使用すると、値がラベルである変数および関数を宣言できます。次に例を示します。

A: PROCEDURE; 
   DECLARE L LABEL;
      .
      .
      .
   L1:
      .
      .
      .
   L = L1;

この例では、ラベル変数 L に文ラベルの値が代入されています。その後に GOTO L; が実行されると、L1 というラベルが付いた文に制御が移ります。

ラベル値は、2 つの部分で構成される記述子です。1 つ目の部分は文 (その文に対してコンパイルされた命令) を示し、2 つ目の部分は、その文を直接含むブロックのスタック フレームを示します。前の例では、L への L1 の代入により、L1 というラベルの付いた文への指定子が L の 1 つ目の部分として、プロシージャ A の現在のスタック フレームへの指定子が L の 2 つ目の部分として、それぞれ代入されます。後続の GOTO 文の実行でスタック フレーム指定子が使用されるのは、ラベル値によって示される以外のブロックの有効化で GOTO 文が実行される場合のみです。次に例を示します。

A: PROCEDURE; 
   DECLARE L LABEL;
      .
      .
      .
   L1:
      .
      .
      .
   L = L1; 
      .
      .
      .
   GOTO L; 
      .
      .
      .
   B: PROCEDURE;
      .
      .
      .
      GOTO L;
           .
           .
           .

この例では、最初の GOTO 文が実行されると、単純に L1 に制御が移ります。これは、L1 が L に代入されたのと同じブロックの有効化の中で実行されているため (その結果、L のスタック フレーム部分は、GOTO 文が実行された時点での現在のスタック フレームを示しているため) です。一方、2 つ目の GOTO 文は、指定子が L に代入されたブロックの有効化とは異なるブロックの有効化の中で実行されています。そのため、2 つ目の GOTO 文が実行されると、L のスタック フレーム指定子に基づいて B のブロックの有効化の終了および A のブロックの有効化の復元が行われてから、L1 というラベルが付いた文に制御が移されます。A が複数の有効化を伴う再帰プロシージャである場合は、B の文 GOTO L が実行されると A の最新の有効化が復元されます。値として L に渡されるラベル変数は、L に代入された時点での A の現在の有効化を示すことに注意してください。それが A の最新の有効化であるとは限りません。関連付けられたブロックが終了した後にラベル変数を使用すると、予期しない結果が生じる可能性があります。

オプションで符号付きとなる単一の整数定数 (-32768 から +32767 の範囲) を使用して、ラベルに添え字を付けることができます。ラベルの配列は、添え字付きラベルの出現によって宣言されます。配列の要素は、同じ名前を持ち、同じブロック内に現れる、すべての添え字付きラベルです。使用されている中で最も大きい添え字が配列の上限となり、最も小さい添え字が配列の下限となります。下限と上限の間の整数の数が配列の範囲になります。配列には、範囲内の整数ごとに 1 つの要素が含まれますが、要素に対応する添え字付きラベルが存在するとは限りません。定義されていない要素を参照すると、予期しない結果になります。次に例を示します。

      GOTO CASE(K); 
CASE(1):
   .
   .
   .
CASE(2):
   .
   .
   .
CASE(3):
   .
   .
   .
CASE(6):
   .
   .
   .

この例の CASE は、6 つの要素を含む文ラベルの 1 次元配列です。要素 4 および 5 は定義されていないため、使用しないようにする必要があります。定義されていない要素を使用すると、予期しない結果になります。

PROCEDURE、FORMAT、BEGIN、ENTRY の各文のラベル プレフィックスに添え字を付けることはできません。

ラベル配列はラベル プレフィックスによって宣言されるため、DECLARE 文の中で LABEL 変数として宣言することはできません。

ラベル値では、代入、等しいかどうかの比較、引数としての受け渡し、関数からの取得は可能ですが、計算や変換は実行できません。LABEL 変数に代入できる有効なラベル値を指定することができます。ラベル値をストリーム入出力で送信することはできません。