结构和一般语法

建议使用注释来启动 REXX 程序。 REXX 程序是根据一系列条款构建的。

REXX 程序结构

建议 REXX 程序以注释开头。 REXX for CICS® 不要求 REXX 程序以注释开头。 但是,出于可移植性原因,建议使用以第一行开头的注释来启动每个 REXX 程序,并包含单词 REXX,如以下示例中所示。
图 1。 使用 REXX 程序标识的示例
/* REXX program */
   ...
   ...
   ...
EXIT
REXX 程序由一系列由以下内容组成的 子句 构建:
  • 零个或多个空格 (已忽略)
  • 令牌序列
  • 零个或多个空格 (已忽略)
  • 可以由行尾,某些关键字或冒号 (:) 隐含的分号 (;) 定界符

从概念上讲,在处理之前将从左到右扫描每个子句,并标识组成该子句的标记。 在此阶段,将识别指令关键字,除去注释,并将多个空格 (文字串除外) 转换为单个空格。 还将除去与运算符字符和特殊字符相邻的空格。

实现最大值: 子句的长度不能超过 16K。

字符数

字符是用于控制或表示数据的已定义元素集的成员。

通常可以输入带有单击键的字符。 字符的编码表示是其数字形式的表示。 例如,字符 (字母 A) 与其 编码表示 或编码不同。 各种编码字符集 (如 ASCII 和 EBCDIC) 对字母 A 使用不同的编码 (分别为十进制值 65 和 193)。 此信息使用字符来传达含义,而不是暗示特定字符代码,除非另有说明。 例外是在字符及其表示之间转换的某些内置函数。 函数 C2D, C2X, D2C, X2C和 XRANGE 依赖于使用中的字符集。

代码页指定集合中每个字符的编码。 请注意:
  • 某些代码页不包含 REXX 定义为有效的所有字符 (例如, ¬,逻辑 NOT 字符)。
  • REXX 定义为有效的某些字符在不同的代码页中具有不同的编码 (例如, !,惊叹号)。

备注

注释是由 /**/定界的字符序列 (在一行或多行上)。 在这些定界符中允许使用任何字符。

注释可以包含其他注释,只要每个注释都以必需的定界符开头和结尾。 它们称为 嵌套注释。 注释可以是任意位置的注释,也可以是任意长度的注释。 它们对程序没有影响,但它们确实充当分隔符。 两个仅包含中间注释的令牌不会被视为单个令牌。
/* This is an example of a valid REXX comment */
在注释掉包含 /**/ 作为文字串一部分的代码行时,请特别小心。 请考虑以下程序段:
01    parse pull input
02    if substr(input,1,5) = '/*123'
03      then call process
04    dept = substr(input,32,5)
要注释掉行 2 和 3 ,以下更改将不正确,因为语言处理器会将作为文字串 /*123 的一部分的 /* 解释为嵌套注释的开头。 它不会处理程序的其余部分,因为它将查找匹配的注释结束 (*/)。:
01    parse pull input
02 /* if substr(input,1,5) = '/*123'
03      then call process
04 */ dept = substr(input,32,5)
可以通过对包含 /**/的文字串使用并置来避免此类型的问题; 第 2 行将为:
if substr(input,1,5) = '/' || '*123'
您可以正确注释掉行 2 和 3 ,如下所示:
01    parse pull input
02 /* if substr(input,1,5) = '/' || '*123'
03      then call process
04 */ dept = substr(input,32,5)

令牌

令牌是从中构建子句的低级别语法的单元。 以 REXX 编写的程序由令牌组成。 它们由空格或注释或令牌本身的性质分隔。

令牌的类如下所示:
字面值字符串

文字串是包含任何字符的序列,由单引号 ' 或双引号 "定界。 使用两个连续的双引号 "" 来表示由双引号定界的字符串中的 " 字符。 同样,使用两个连续的单引号 '' 来表示由单引号定界的字符串中的 ' 字符。 字面值字符串是一个常量,在处理它时从不修改其内容。

没有字符的文字串 (即长度为 0的字符串) 称为 空字符串

以下是有效字符串的示例:
'Fred'
"Don't Panic!"
'You shouldn''t'        /* Same as "You shouldn't" */
''                      /* The null string         */
  • 紧跟 ( 的字符串被视为函数的名称。
  • 紧跟符号 Xx 的字符串被视为十六进制字符串。
  • 紧跟符号 Bb 的字符串被视为二进制字符串。

实现最大值: 文字串最多可包含 250 个字符。 计算结果的长度仅受可用存储量限制。 请参阅 REXX 一般概念 中的说明以获取更多信息。

十六进制字符串

十六进制字符串是使用其编码的十六进制表示法表示的文字串。 它是由零个或多个十六进制数字 (0-9a-fA-F) 组成的任何序列,成对分组。 必要时,假定在字符串的前面有单个前导 0 ,以生成偶数个十六进制数字。 数字组可以选择用一个或多个空格分隔,整个序列由单引号或双引号定界,后面紧跟符号 Xx。 (xX 不能是较长符号的一部分。) 空格只能出现在字节边界 (而不能出现在字符串的开头或结尾) ,以帮助提高可读性。 语言处理器将忽略它们。 十六进制字符串是由给定的十六进制数字打包而成的文字字符串。 打包十六进制数字将除去空格并将每对十六进制数字转换为其等效字符,例如: "C1" X 到 A。

即使不能直接输入字符本身,也可以使用十六进制字符串在程序中包含字符。 以下是有效十六进制字符串的示例:
'ABCD'x
"1d ec f8"X
"1 d8"x
注: 十六进制字符串不是数字的表示。 相反,它是一种转义机制,因此用户可以根据其编码来描述字符 (因此依赖于机器)。 在 EBCDIC 中, "40" X 是空白的编码。 在每种情况下,格式为 ' ..... 'x 的字符串都只是一个直截了当的字符串的替代。 在 EBCDIC "C1" x 和 "A" 中,与 "40" x 和 "空白" 相同,必须以相同的方式处理。

另外,请注意,在汇编语言中,十六进制数字以数字前面的 X 表示。 REXX 仅接受先前描述的格式的十六进制数字。 此信息可能显示以两种方式表示的十六进制数字,但当您在 REXX 中编码十六进制字符串时,请将 X 放在该数字之后。

实现最大值: 十六进制字符串 (除去了空格的字符串) 的压缩长度不能超过 250 字节。

二进制字符串

二进制字符串是使用其编码的二进制表示法表示的字面值字符串。 它是 8 (字节) 或 4 (nibbles) 组中零个或多个二进制数字 (01) 的任意序列。 第一个组的数字可以少于四位数; 在这种情况下,假定第一个数字的左边最多有三个 0 数字,总共有四个数字。 (可选) 数字组由一个或多个空格分隔,整个序列由匹配的单引号或双引号定界,后面紧跟符号 bB。 (bB 不能是较长符号的一部分。) 空格只能出现在字节或啃边界 (而不能出现在字符串的开头或结尾) ,以帮助提高可读性。 语言处理器将忽略它们。

二进制字符串是通过打包给定的二进制数字而形成的字面值字符串。 如果二进制数字的数量不是 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                /* == ''                     */

实现最大值: 十六进制字符串 (除去了空格的字符串) 的压缩长度不能超过 250 字节。

符号

符号是从以下字符集中选择的字符组:

  • 英语字母字符 (A-Za-z)

    某些代码页不包含小写英语字符 a-z

  • 数字字符 (0-9)
  • 字符 . ! ?_ (下划线)。

    感叹号字符 ! 的编码取决于正在使用的代码页。

  • 双字节字符集 (DBCS) 字符 (X'41 ' -X'FE')。 ETMODE 必须有效才能使这些字符在符号中有效。

符号中的任何小写字母字符在使用前都会转换为大写 (即,小写 a-z 转换为大写 A-Z)。

以下是有效符号的示例:
Fred
Albert.Hall
WHERE?
<.H.E.L.L.O>               /* This is DBCS */

如果符号不是以数字或句点开头,那么可以将其用作变量并为其赋值。 如果尚未为其指定值,那么其值是符号本身的字符,转换为大写 (即,小写 a-z 转换为大写 A-Z)。 以数字或句点开头的符号是常量符号,不能为其指定值。

允许另一种形式的符号支持指数格式的数字表示。 符号以数字 (0-9) 或句点开头,以序列 Ee结尾,后面紧跟可选符号 (-+) ,后面紧跟一个或多个数字 (不能后跟任何其他符号字符)。 此上下文中的符号是符号的一部分,不是运算符。

以下是指数表示法中有效数字的示例:
17.3E-12
.03e+9

实现最大值: 符号最多可以由 250 个字符组成。 其值 (如果是变量) 仅受可用存储量的限制。 请参阅 REXX 一般概念 中的说明以获取更多信息。

数字

这些是由一个或多个十进制数字组成的字符串,可选前缀为加号或减号,还可以选择包含表示小数点的单个句点 (.)。 数字还可以具有以传统指数表示法为后缀的 10 的幂: E (大写或小写) ,后跟 (可选) 加号或减号,然后后跟一个或多个定义 10 的幂的十进制数字。 无论何时将字符串用作数字,四舍五入都可能达到 NUMERIC NUMBER 指令指定的精度 (缺省值为 9 位数字)。 请参阅 数字和算术运算 以获取数字的完整定义。

数字可以有前导空格 (在符号之前和之后,如果有的话) ,也可以有尾部空格。 不能在数字的数字之间或在指数部分中嵌入空格。 请注意,符号或文字字符串可能是数字。 数字不能是变量的名称。

以下是有效数字的示例:
12
'-17.9'
127.0650
73e+128
' + 7.9E5 '
'0E000'

您可以指定带有或不带引号的数字。 请注意,表达式中的序列 -17.9 (不带引号) 不是简单的数字。 它是一个减号运算符 (如果它的左边没有任何项,那么可以是前缀减号) ,后跟一个正数。 操作的结果是数字。

整数 是一个具有零 (或无) 小数部分的数字,语言处理器通常不会以指数表示法表示。 即,它在小数点之前没有比当前设置 NUMERIC DECIMAL 更多的数字 (缺省值为 9)。

实现最大值: 以指数表示法表示的数字的指数最多可以有九位数字。

运算符字符
字符 + - \ / % * | & = ¬ > < 和序列 >= <= \> \< \= >< <> == \== // && || ** ¬> ¬< ¬= ¬== >> << >>= \<< ¬<< \>> ¬>> <<= /= /== 指示操作 (请参阅 运算符)。 其中有几个也用于解析模板,等号也用于表示赋值。 将除去与运算符字符相邻的空格。 因此,以下含义相同:
345>=123
345 >=123
345 >= 123
345 > = 123

其中某些字符可能并非在所有字符集中都可用。 在此情况下,您可以使用相应的翻译。 特别是,竖线 (|) 字符通常显示为分割竖线。

在整个语言中, not 字符 ¬是反斜杠 (\) 的同义词。 根据可用性和个人偏好,您可以互换使用这两个字符。

特殊字符
以下字符与来自运算符的各个字符一起,在字面值字符串外部找到时具有特殊意义:
,   ;   :   )   (
这些字符构成了特殊字符的集合。 它们都充当令牌定界符,并且将除去任何这些定界符旁边的空格。 例外是与括号外部相邻的空格,仅当它也与另一个特殊字符相邻时,才会将其删除 (除非该字符是括号,且空格也在其外部)。 例如,语言处理器不会除去 A (Z)中的空白。 这是不等同于函数调用 A(Z)的并置。 语言处理器会除去 (A) + (Z) 中的空白,因为这等同于 (A)+(Z)
以下示例显示了如何由令牌组成子句。
'REPEAT'   A + 3;
这由六个令牌组成:
  • 文字串 ('REPEAT')
  • 空白运算符
  • 符号 (A,可以具有值)
  • 运算符 (+)
  • 第二个符号 (3,这是数字和符号)
  • 子句定界符 (;)
将除去 A+ 之间以及 +3 之间的空白。 但是, 'REPEAT'A 之间的其中一个空白将保留为运算符。 因此,将此条款视为已写入:
'REPEAT' A+3;

隐式分号

子句中的最后一个元素是分号定界符。 语言处理器暗示分号: 在行尾,在某些关键字之后,在冒号之后,如果它跟在单个符号之后,那么在冒号之后。 这意味着仅当一行上有多个子句时,才需要包含分号,或者结束最后一个字符为逗号的指令。

行结束通常会标记子句的结束,因此, REXX 在行的大部分末尾都表示分号。 但是,存在以下例外情况:
  • 行在字符串中间结束。
  • 行在注释中间结束。 该条款将继续下一行。
  • 最后一个标记是连续字符 (逗号) ,行不会在注释中间结束。 (请注意,注释不是令牌。)

REXX 自动暗示分号在冒号之后 (当跟随单个符号,标签时) 和某些关键字之后 (当它们位于正确的上下文中时)。 具有此效果的关键字包括 :ELSE , ELSE 和 THEN。 这些特殊情况可显着减少排版错误。

注: 构成注释定界符 /**/的两个字符不得由行尾分割 (即, /* 不应出现在不同的行上) ,因为无法正确识别它们; 将添加隐式分号。 在字符串中形成文字引号的两个连续字符也受此行尾裁决的约束。

持续

将子句继续到下一行的一种方法是使用逗号 (称为 连续字符)。

逗号在功能上被空格替换,因此,不隐含分号。 一个或多个注释可以跟在行尾前的连续字符后面。 不能在字符串中间使用连续字符,否则它将作为字符串本身的一部分进行处理。 同样情况也适用于评论。 请注意,逗号保留在执行跟踪中。

以下示例显示如何使用连续字符来继续子句。
say 'You can use a comma',
    'to continue this clause.'
这将显示:
You can use a comma to continue this clause.