REXX 式の概要

REXX 式は、1 個以上のと、項の間に挟まれたゼロ個以上の演算子で構成されます。演算子は、項に作用する演算を表します。式は、左から右に評価され、通常の代数と同じ方法で、 括弧および演算子優先順位によってその順番が変わります。括弧が見つかると (関数呼び出しを識別する括弧は除きます)、 括弧の間にある副次式全体が、項が要求されたときに即時に評価されます。評価の過程でエラーが発生しない限り、式全体が評価されます。

REXX ステートメントはフリー・フォーマットです。つまり、ワード間に余分なスペースを挿入してもエラーになりません。

ここで、選択基準式で使用できる項について説明します。使用可能な演算子が、次のパネルに示されています。
リテラル・ストリング
リテラル・ストリングは、任意の文字を含む、 一重引用符 (') または二重引用符 (") で区切られたシーケンスです。2 つの連続した二重引用符 ("") は、二重引用符で区切られたストリング内の " 文字を表します。2 つの連続した一重引用符 ('') は、 一重引用符で区切られたストリング内の ' 文字を表します。リテラル・ストリングは定数であり、処理されるときにその内容が変更されることはありません。
以下は、有効なストリングです。
'Fred'
"Don't Panic!"
'You shouldn''t'        /* Same as "You shouldn't" */

直後に ( が続くストリングは、関数の名前と見なされます。(直後に記号 X または x が続くストリングは、16 進数ストリングとみなされます。直後に記号 B または b が続くストリングは、バイナリー・ストリングとみなされます。

16 進数ストリングは、エンコード方式の 16 進表記を使用して表現したリテラル・ストリングです。ペアでグループになっている 0 個以上の 16 進数字 (0-9、a-f、A-F) による任意のシーケンスです。16 進数字を偶数個にするために、必要に応じてストリングの前に 1 個の先行 0 が想定されます。数字のグループは、オプションで 1 つ以上のブランクによって分離され、シーケンス全体は、一重引用符または二重引用符によって区切られ、直後に記号 X または x が続きます。(x や X は、これより長い記号に含めることはできません)。16 進数ストリングは、与えられた 16 進数字をパックして形成されるリテラル・ストリングです。16 進数字をパックすると、ブランクが除去され、16 進数字の各ペアが、対応する文字に変換されます。例えば、'C1'X A.

16 進数ストリングを使用すると、文字自体を直接入力できない場合でも、 プログラムに文字を組み込むことができます。以下は、有効な 16 進数ストリングです。
'ABCD'x
"1d ec f8"X
"1 d8"x

バイナリー・ストリングは、そのエンコード方式の 2 進表記を使用して表現したリテラル・ストリングです。8 個 (バイト) または 4 個 (ニブル) がグループになった、ゼロ個以上の 2 進数字 (0 または 1) による任意のシーケンスです。最初のグループが、4 桁未満の場合があります。 その場合には、最初の数字の左側に最大 3 個までの 0 を補い、合計 4 桁にします。数字のグループは、オプションで 1 つ以上のブランクによって分離され、シーケンス全体は、突き合わせする一重引用符または二重引用符によって区切られ、直後に記号 b または B が続きます。

バイナリー・ストリングは、与えられた 2 進数字をパックすることによって作られるリテラル・ストリングです。2 進数字の数が 8 の倍数でない場合は、パックの前に先行ゼロが左側に追加され、8 の倍数にされます。バイナリー・ストリングを使用すると、ビット単位で文字を明示的に指定できます。

以下は、有効なバイナリー・ストリングです。
'11110000'b        /* == 'f0'x                  */
"101 1101"b        /* == '5d'x                  */
'1'b               /* == '00000001'b and '01'x  */
'10000 10101010'b  /* == '0001 0000 1010 1010'b */
''b                /* == ''                     */
記号
引用符のない文字ストリングで、英大文字に変換されます。# で始まる記号はすべて、処理対象のセグメント内のフィールドに対する参照として扱われ、そのフィールドの値が使用されます。これ以外の記号は、すべて定数として扱われます。

FM/IMS は、テンプレートで定義された各フィールドに固有のフィールド参照番号を割り当てます。選択基準式のフィールドを参照するときは、接頭部 #. を付けて、そのフィールドのフィールド参照番号に指定します。参照できるのは、現在処理中のセグメント内に定義されているフィールドだけです。別のセグメント・タイプに定義されているフィールドは参照できません。また、セグメント識別基準で参照できるフィールドは、 セグメントの静的部分 (つまり、OCCURS DEPENDING ON 文節によって定義される 可変長配列よりも前の部分) に定義されているフィールドだけになります。

REXX 式の評価は、型なし の文字ストリングの形式でのみデータを処理します (型なしは、COBOL の場合のように、バイナリーやパック 10 進数のような特定のデータ・タイプではないためです)。したがって、数字フィールドを参照すると、FM/IMS はそのフィールドの値を、選択基準式の評価時に REXX が処理できる数値文字ストリングに変換します。文字ストリング内の整数および小数点以下の桁数は、テンプレートのフィールド定義によって決まります。例えば、COBOL あるいは PL/I の PICTURE 文節 999V99 のパック 10 進フィールドを参照すると、FM/IMS は、フィールドの値を文字ストリングに変換します。 この文字ストリングは、数字、仮想小数点のピリオド、および値がマイナスの場合には、 先行する符号文字で構成されます (例えば、-123.45)。数値フィールドは、COBOL あるいは PL/I の PICTURE 文節に符号シンボルが含まれているいないにかかわらず、 すべて符号付きとして扱われますので注意が必要です。

場合によっては、数値フィールドの値を、数字ストリングに変換することなく評価することがあります。そのためには、フィールド参照番号の接頭部を #u ではなく、#. にします。これは、この数字を数字ストリングに変換しないように FM/IMS に指示します。例えば、2 バイトの 2 進数値フィールド (フィールド参照番号は 45) が、X'FFFF' という特殊値かどうかを検査するときは、次のようにコーディングできます。
#u45 = 'FFFF'x

配列内のフィールドを参照するときは、必要な数の添字を括弧で囲み、コンマで区切って、フィールド参照を修飾する必要があります。指定する添字の数は、参照するフィールドを含む配列の次元数と同じにする必要があります。COBOL の条件では、フィールド自身の OCCURS 文節も含めて、フィールドを含む階層の OCCURS 文節ごとに添字が必要です。指定する添字は、1 から、OCCURS 文節に指定されているフィールドの出現の最大回数までの範囲にある正の整数にする必要があります。参照するフィールドが (OCCURS DEPENDING ON 文節を使って指定される) 可変長配列内にある場合は、 どのセグメントについても、存在しない可能性があるオカレンスのフィールドを 参照しないようにする必要があります。存在しないフィールドを参照すると、選択基準は満たされず、 そのセグメントは選択されません。

注: OCCURS DEPENDING ON 文節のオブジェクトは、配列と同じセグメントの静的部分 (つまり、 セグメントの OCCURS DEPENDING ON 文節によって定義される可変長配列よりも前の部分) に フィールドとして定義しなければなりません。OCCURS DEPENDING ON 文節のオブジェクトがそのように定義されていない場合は、 その配列内のすべてのフィールド、 およびその配列以降のセグメント内のすべてのフィールドを参照できません。
関数呼び出し
REXX 組み込み関数の呼び出しです。
副次式
左括弧と右括弧で囲まれた式内の項です。