

文 Statements
REXXでは文の区切りは改行かセミコロンです。各行の最後にセミコロンをつける必要はありません。複数行にまたがった文を記述するには、行の最後をコンマで終了します。(ただし、YTREXXでは、コンマによる行の結合はサポートしていません)
コメント Comments
REXXでは、/* から*/までをコメントとみなします。IBMのREXXでは伝統的に最初の行がコメント行である必要がありましたが、REGINAおよびYTREXXではこの制限はありません。逆にREGINAではLINUXの制限から最初の行は#!
/usr/local/bin/rexxである必要があります。
文字と文字列 Characters and Strings
REXXプログラム中で使用できる文字は、英数字および記号です。このような文字や文字列をデータとして扱いたいときは、'(クオート)または”(ダブルクオート)でくくります。また、文字列の中に'や"を含めたいときは、その文字を続けて2度記述してください。例えば、''''は「'」を示します。これは"'"と同じ意味です。REXXのデータには型という概念はありません。ある決まった演算の時以外はいつも文字列としてデータは保持されています。データ以外の場所では、英字はすべて大文字として解釈されます。
変数 Variables
REXXの変数は、単純変数とSTEM変数があります。単純変数は、任意の長さの英字で始まる英数字または_(アンダーライン)であらわされます。REXXでは、変数名はすべて大文字として扱われます。従って、alphとAlpha ALPHAはどれも同じ変数を指します。
単純変数には、代入文を用いて値を代入することができます。代入された値はいつでも文字列として保持されており、長さの制限はありません。
STEM変数はいわば配列を実現するために実装されており、単純変数のあとに.(ドット)と添え字を記述します。例えば、A.1, A.2, A.3など。もちろんA.I, A.Xなども大丈夫ですが、添え字部分に式を記述することはできません。また符号もつけることはできません。従って、A.(-1)と書きたいときは、X=-1; A.X=...と記述することになります。添え字にさらに添え字を加えることもできます。(何段階でも制限はありません)また、添え字を書かずに.(ドット)で終わったSTEM変数は、それ全体をさします。例えば、A.1=0; A.2=0... と書く代わりにA.=0と記述することが可能です。同様にX.3.=40;は、X.3.で始まる全てのSTEM変数を40に設定します。
ラベル Labels
SIGNAL命令のジャンプ先やCALL命令あるいは関数のエントリとしてラベルは使用されます。ラベルは、任意の長さの英字で始まる英数字または_(アンダーライン)です。ラベルの定義は、文の先頭にラベル名と:を空白をはさまずに記述します。プログラム中に同じ名前のラベルは出現してはなりません。
代入文 Assignments
変数名=式; の形式で記述された文は代入文として処理されます。式を計算した後、変数名に値が代入されます。
演算子 Operators
式中で使える演算子は四則演算が+-*/, 整数除算が% 剰余が// べき乗が^または**です。
比較演算は < > <= >= =(等しい) <>(等しくない)
論理演算は & (論理積) | (論理和) !(否定)
文字列演算が || (連結) スペース(空白文字を挟んでの連結)
です。演算子の強さは、(単項マイナス、プラス) べき乗 (*/%//)、比較、論理演算、文字列演算の順です。演算によっては、演算対象が数値である必要があります。もしこれを満たしていない式の場合には実行時エラーが発生します。
命令 Instructions
REXXは次のキーワードで始まる文を命令文として解釈します。*はYTREXXでインプリメントされていない命令です。**は細かい仕様が異なる命令です。
以下の命令、および代入文以外の文は全て外部コマンドとして渡されます。YTREXXでは、イベントが発生しますので、イベントハンドラを記述することで対応する処理を実現できます。REGINAでは、LINUXのコマンドとして解釈されます。
- ARG*
- 引数リストをparseするための命令です。parse命令も参照してください。PARSE
UPPER ARG と等価です。
- CALL**
- サブルーチンを呼び出すための命令です。CALL サブルーチン名 引数, 引数,
...の形式で使われます。引数はすべて値渡しです。サブルーチン内で引数を参照するには、ARG関数を使います。
- DO**
- DO〜ENDブロックを形成します。DO ENDブロックには、単純ブロックと繰り返しブロックがあります。単純ブロックはIF文中のTHENやELSEの後などにDO
ENDでくくることにより複数の文を記述することができます。繰り返しブロックは、DO
var=start TO end BY step 条件部 のように記述されます。varは繰り返し制御変数名、startはその初期値、endは終了値、stepは一回終わるごとにvarに加算される数を示します。start,end,stepはそれぞれ式でも構いません。BYは省略すると1と解釈されます。TOを省略すると終了条件はチェックされません。条件部にはWHILEかUNTILに続けて条件を記述できます。記述すると、終了条件としてチェックされます。また条件部にFOREVERを記述するとLEAVE命令を実行するまで永遠にループの中を実行しつづけます。
- DROP*
- 変数を変数領域から削除します。
- ELSE
- IF 条件 THEN 文/ブロック ;ELSE 文/ブロック の形式で記述され、条件が満たされなかったときにELSE以下の文を実行します。ELSE文はオプショナルです。IF文の入れ子の場合には、最も近いIF THENに対応します。
- THENの前には文区切りがあってもなくても構いませんが、ELSEの前には必ず必要です。また、THEN,ELSEのあとには文区切りはあっても無くても構いません。
- END
- DOブロックの終了、SELECTブロックの終了を示します。
- EXIT
- 現在のREXXプログラムを終了します。
- IF
- IF THEN ELSEブロックを形成します。
- INTERPRET
- 式をプログラムとして実行します。
- ITERATE**
- もっとも内側の繰り返しDO ENDブロックのDOに戻って実行します。
- LEAVE**
- もっとも内側の繰り返しDO ENDブロックを終了します。
- NOP
- 何もしない命令です。THEN文やWHEN OTHERWISEの後にセミコロンを書いても空文は無視されますので、そのような場合に何もしないことを明示するために使われます。
- NUMERIC*
- 有効桁数の設定、数値比較の誤差範囲の設定等に使われます。
- OPTIONS*
- インタープリタ毎の設定に使用されます。
- PARSE**
- 文字列のテンプレートマッチングを行い、変数に代入する命令です。PARSE VAR
var templateもしくはPARSE VALUE value WITH templateなどの書式で記述されます。varは変数名、valueは式を記述し、ともに計算結果をtemplateに従って文字列マッチングを行います。templateは変数名、文字列('abc'など)を空白を挟んで並べたもので、式の結果を先頭から順にtemplateに割り振っていきます。例えば、PARSE
VALUE 'A B C D E' WITH X Y Zでは、結果はX='A', Y='B', Z='C D E'となります。また、PARSE
VALUE 'A B C D E' WITH X 'C' Y では、X='A B', Y='D E'となります。変数名の代わりに.(ドット)を記述すると、その部分に対応する文字列はどこにも代入されません。
- PROCEDURE
- サブルーチンや関数定義中で、変数のスコープを設定するために使われます。サブルーチン中でPROCEDURE命令を実行すると、呼び出したプログラムと実行中のサブルーチンの間で変数名は完全に分離されます。PROCEDUREにつづいてEXPOSE
var1 var2 .. サブキーワードを記述すると、var1, var2...については、呼び出したプログラムと共有します。varにSTEM変数を指定することもできます。YTREXXでは、(var)の形式(varを評価した結果をexposeする)はサポートしていません。
- PULL*
- スタックから一行取り出し、テンプレートマッチングを行います。
- PUSH*
- スタックの先頭に一行追加します。
- QUEUE*
- スタックの最後に一行追加します。
- RETURN
- サブルーチンや関数定義を終了します。RETURN 式 と記述すると、式の計算結果を関数の値として返します。CALLで呼ばれた場合には、RCという変数に入ります。REXXでは、関数とサブルーチンは全く同一のものです。CALL
で呼ばれるか、計算式中で呼ばれるかの違いだけです。すなわち、CALL LINEOUT
X,'STR'は、RC=LINEOUT(X,'STR')と全く同じです。
- SAY
- 画面/標準出力に書き出します。
- SELECT
- SELECT WHEN OTHERWISE ENDブロックを形成します。
- SIGNAL**
- 制御をラベルで指定される場所に移動します。
- THEN
- IF THEN ELSEで使用されます。
- TRACE*
- プログラムの実行を監視し、途中経過を報告します。

