一、PL/1的字符集及书写
1、PL/1的字符集
PL/1的字符集一般分为48个字符与60个字符两种,目前采用60个字符的字符集。
1.1 29个字母字符
A,B,…….,Z,$,@,#
1.2 10个数字
0,1,2,3,4,5,6,7,8,9
1.3 21个专用字符(如下所示)
♀ |
空格 |
% |
百分号 |
= |
等号 |
; |
分号 |
+ |
加号 |
: |
冒号 |
- |
减号 |
< |
小于 |
* |
星号(乘号) |
> |
大于 |
/ |
斜线(除号) |
| |
或 |
( |
左括号 |
& |
与 |
) |
右括号 |
┒ |
非 |
, |
逗号 |
_ |
短划号 |
. |
小数点 |
? |
问号 |
’ |
引号 |
|
|
2、L/I源程序的书写
2.1源程序从第2列开始写至第72列为止
2.2每个语句(Statement)以“;”结束
2.3注释(Comment)以“/*”开始,以“*/”结束,其间可出现任何字符。
2.4第1列上的字符用作打印时的控制字符
1 |
: |
换新页 |
♀ |
: |
换一行 |
0 |
: |
换二行(空一行,现换一行) |
- |
: |
换三行(空二行,再换一行) |
二、数据和表达式(DATA and Expression)
数据类型分两类:
n 运算型数据
A、 算术数据
a:定点十进数(Fixed decimal data)
b: 定点二进数(Fixed binary data)
B、 数值字符数据(numeric character data)
C、 字符串数据(String data)
n 控制型数据
A、 文件数据(file data)
B、 标号数据(label data)
C、 入口数据(entry data)
D、 定位数据(locator data)
1、运算型数据
1.1算术数据有下列4个特性
进位制(Base): 十进位、二进位;
记数法(scale): 定点、浮点
精确度(precision):(P:表示有效数位;q:表示有效小数位)
型(mode): 实型、复型等。
1.1.1定点十进数
例:
定点十进数 |
3.1416 |
732 |
003 |
0.0012 |
-528 |
精确度 |
(5.4) |
(3.0) |
(3.0) |
(4.4) |
(4.0) |
存储形式 (十六进制) |
31,41,60 |
73,20 |
00,30 |
0,01,20 |
528,0 |
注: 对定点十进数(p,q)
² 占用存贮的字符数==[p/2]+1
² P最大值是15,占8个字符
² (p,q)未指明时,系统约定为(5,0)
1.1.2定点二进数
例: 定点二进数 0001 0110 11111111
十六进制表示 16 F F
十进制表示 22 - 1
注:
² 最大有效数位31,占4字符
² 未指明时系统约定值为FIXED BIN(15), 占2字符.
² 位数低于15位的也占2字符
² 位数高于15位的,则占4字符
² 变量名以I,J,K,L,M,N开始,若未指明时,约定为FIXED BIN(15);以其它
字母开始约定为FIXED DEC(6)
1.2 数值字符数据
它是介于算术数据与字符串数据间的数据
数 |
|
123 |
|
732.10 |
|
98.7 |
|||||||||
书写 |
|
PIC ‘999’ |
|
PIC ‘999V.99’ |
|
PIC ‘99V9’ |
|||||||||
存贮形式 |
|
F1 |
F2 |
F3 |
|
F7 |
F3 |
F2 |
4B |
F1 |
F0 |
|
F9 |
F8 |
F7 |
其中: V表明在数据域中该位置出现一个隐含的十进位或二进位小数点.
若V后面还有“.”,表明相应数据域位置包含一个小数点
注:
u 数值字符数据主要是构成定点十进数,定点二进数可打印的形式;
u 在PIC后面引号(”)中的数字字符个数最多15个;
u 数值字符数据可进行算术运算,但须经转换;
u 如果一个数字字符定义为PIC ‘ZZZV.’,则不管此字符是否有值,都显示为“ .”。
1.2.1定点十进数(FD)、定点二进数(FB)和PIC间的转换
例: DCL A PIC‘99’
DCL B PIC‘99’
DCL C PIC‘99’
C==A+B
则为欲求得C,须经:
A FIXED DEC,
B FIXED DEC
A_FD + B_FD
FIXED DEC PIC 赋予C
在算术运算时,必须转为FIXED DEC 才能进行
转换表
R C |
FB |
FD |
PIC |
FB |
—— |
C FB |
C FD FD FB |
FD |
R FB |
—— |
C FD |
PIC |
R FD FD FB |
R FD |
C FD R FD |
注:一般金额采用 FIXED DEC
整数采用 FIXED BIN
PIC用于 输入/输出 它是字符与算术数据间的桥梁。
1.3 串数据(String data)
1.3.1 字符串数据(Character String data)
值 PL/1写法 存贮形式
‘ABC’ CHAR(6) C1,C2,C3,40,40,40
‘A102’ CHAR(4) C1,F1,F0,F2
‘A’ CHAR(4) C1,40,40,40
² 字符串数据通常在程序内赋值时用.
例: X==‘THIS REPORT IS ’
² 赋值时,字符串数据括于单引号内
² 赋值时,在字符串右边不足部分,系统自动以“空白 ”符补足
例: DCL X CHAR(5)
… …
X =‘A’; X值会是 A后跟随4个空格
² 字符串内出现单引号时,必须以两个单引号(称为Null String)表示,否则会引起
混淆。
例: 设赋值给X,其值为:JOHN’S CAP
则必须写为 X==‘JOHN’’S CAP’
(注:若写为X==‘JOHN’S CAP’,则S CAP’被略)
² 重复的字符串数据可用重复因子表示
例: X==(N)’BCC ‘表示X有值为 BCC ,BCC ,…….(N个)
1) 重复因子必须放在括号内;
2) 重复因子只对紧接的一个字符生效
例: PIC’(4)AB’ 乃表示PIC’AAAAB’
² CHARACTER PICTURE SPECIFICATION
PIC’9’表示数字0~9
PIC’A’表示字母A~z
PIC’X’表示任何字符
1.3.2 (二进)位串数据(BIT String data)
值 PL/I写法 存贮形式
‘1’B BIT(1) 占1字符
‘1111’B BIT(4) 占1字符
(64)’0’B BIT(64) 占8字符
² 位串数据赋给变量是从左到右进行,若串数据长度,超过变量说明的长度,则以变量
长度为准,截去串数据右端的位;若串数据长度短于变量说明的长度,也以变量长度
为准,右边自动以0补足.
² 位串数据通常用于检查 真/假 条件
真 TRUE_______’1’B
假 FALSE_______’0’B
例: DCL EOF BIT(1)
——–
__在检查“真”时可写:IF EOF=‘1’B 或 IF EOF
—在检查“假”时可写:IF EOF=‘0’B 或 IF ﹁EOF
2、控制型数据
2.1文件数据(File data):它表示PL/I文件的信息
l 它是PL/1的输入/输出文件名字
l 即JCL的输入/输出DD名字,File name和DDname互相对应
例: DCL INFILE INPUT RECCRD FILE
DCL OUTFILE OUTPUT STREAM FILE
2.2标号数据(label data)
l 作为语句标号引用
例: LOOP:——-
——-
——-
GO TO LOOP;
l 作为语句标号变量
例: DCL CIRCLE LABEL
LOOP1:———
——–
———
LOOP2:——–
——–
——–
CIRCLE==LOOP1;
… …
GO TO CIRCLE; ——–> 等价于 GO TO LOOP1
… …
2.3 入口数据(ENTRY Data)
——用作过程(Procedure)的入口点(entry point)
例:A:PROC OPTIONS(MAIN)
… …
B:PROC;
A,B即为入口点,称为入口数据,可由CALL语句来调用 CALL B;
——用作入口变量(entry variable)
例:DCL A ENTRY VARIABLE;
DCL(A1,A2)ENTRY;
IF X THEN A=A1; ELSE A=A2; CALL A; |
等价于: IF X THEN CALL A1; ELSE CALL A2; |
2.4 定位数据(Locator data)
根据POINTER变量所取的值作为指定的地址
例: DCL P POINTER
DCL A CHAR(8)
DCL X CHAR(8)
l 基于POINTER
DCL B FIXED DEC(15) BASED(P);
P=ADDR(A)
此时B不占空间,根据P描述,也即为B 描述为FIXED DEC(15)
若P=ADDR(X)
则B又随P描述X了,于是B是活动的,随P变化.
l 基于ADDRess
DCL B FIXED DEC(7) BASED (ADDR(A))
此时,B 是固定的,它由A的地址唯一确定
001500 DCL CIC1 FIXED BIN(15);
001600 DCL CIC2 FIXED BIN(15);
001700 DCL CIC3 FIXED BIN(15);
001800 DCL CIC4 FIXED BIN(15);
001900 DCL CI1PTR POINTER;
002000 DCL CI1PTRF FIXED BIN(31) BASED(ADDR(CI1PTR));
002100 DCL CI2PTR POINTER;
002200 DCL CI2PTRF FIXED BIN(31) BASED(ADDR(CI2PTR));
002300 DCL UTSCIFC CHAR(4089) VAR;
002400 DCL 1 CIF1 BASED(ADDR(UTSCIFC)),
002500 2 CITOTL FIXED BIN(15), /* TOTAL RECORD LENGTH */
002600 2 UTSCIFC_BEG_DMY
002800 2 CIIDQTY FIXED BIN(15), /* ID QUANTITY */
009800 2 CIMTCAC FIXED DEC(15), RELATIVE MTC SAVING AC NO.*/
009810 2 CIHKDAC FIXED DEC(15), /* RELATIVE HKD SAVING AC NO.*/
009820 2 CIFCYAC FIXED DEC(15), /* RELATIVE FCY SAVING AC NO.*/
009830 2 CIPBCINT CHAR(1), /* PBC INT INDICATOR */
009900 2 CIPCLASS FIXED DEC(1), /* PRIVILEGE CLASS */
009910 2 CINAT CHAR(9), /* NATIONNALITY */
009920 2 CICDTDAT(10) CHAR(6), /* TAX RATE FOR BRANCH */
010000 2 CIHKDPVC FIXED DEC(15,2),/* STAFF HKD PRIV.CERT TOT P */
010100 2 CIHKDP FIXED DEC(15,2),/* HKD CERT TOTAL PRINCIPAL */
010200 2 CIUSDP FIXED DEC(15,2),/* USD CERT TOTAL PRINCIPAL */
011300 2 CIIDNO(CIC1 REFER(CIIDQTY))
011410 CHAR(19), /* ID NUMBER */
011500 2 CIIDNO_END_DMY CHAR(0),
011600 2 CISIGNO(CIC2 REFER(CISIGQTY))
011700 CHAR(8), /* SIGNATURE NO */
011800 2 CISIGNO_END_DMY
011900 CHAR(0),
012000 2 CINAME CHAR(CIC3 REFER(CINAMEL)),
012100 /* CUSTOMER NAME */
012200 2 CINAME_END_DMY CHAR(0),
012300 2 CITRAILER CHAR(1); /* OFF SET */
012400 DCL 1 CIF12 BASED(CI1PTR),
012500 2 CIADDUM CHAR(1), /* ADDRESS */
012620 2 CIADDR(3) CHAR(32); /* ADDRESS 040717 ADD */
012700 DCL 1 CIF13 BASED(CI2PTR),
012800 2 CIACCTQ FIXED BIN(15), /* RELATED ACCOUNT QUANTITY */
012900 2 CIACCT(CIC4 REFER(CIACCTQ))
013000 FIXED DEC(15); /* ACCOUNT NUMBER */
013080 /* ’ ’ GET TAX RATE FROM CIN */
****** **************************** Bottom of Data ***************************
有关指针CI1PTR和指针CI2PTR的使用如下:
CI1PTR = ADDR(CITRAILER);
CI2PTRF = CI1PTRF + 97;
3、数据组织(data cyganigation)
3.1数组(array)
l 一组同属性(attribute)的数据元素
l 一个数组只有一个名字
l 数组内的各项由其在数组内的相应位置表明
一维数组
例: DCL A(8) FIXED DEC(3);
表示数组A有8个元素,每个都是FIXED的三位数字,分别称A(1),A(2),A(3),……,A(8).
二维数组
例: DCL B(4,2) FIXED DEC(3);
PL/I中元素排序以“行”为主
B(1,1),B(1,2),B(2,1),B(2,2),
B(3,1),B(3,2),B(4,1),B(4,2)
界(bound) 下界 上界
数组A 1 8
数组B 1 4
数组B 1 2
范围(extent)
数组A: 8
数组B: 4,2
l 数组维数最大为15维
l 下界不为1时,上、下界必须明确写
一维数组 DCL C(4:11) 下界为4,上界为11,范围是8。
二维数组 DCL D(-4:3,4:11)
第一维下界为-4,上界为3
第二维下界为4, 上界为11
范围是8,8
l A(I)其中A表示数组名称(array name),I表示下标(Subscript)
下标值若非定点二进整数,则一定转为FIXED BINARY(15)
3.2结构(Structure)
l 有逻辑性的数据成分(data element)的组合
l 各数据成分的属性(attribute)可以不同
l 组成形式是层次结构(hierarchy)
例: DCL 1 PAYROLL,
2 NAME,
3 FNAME CHAR,
3 LNAME CHAR,
2 HOURS,
3 REGULAR FIXED DEC,
3 OVERTIME FIXED DEC
2 RATE,
3 REGULAR FIXED DEC,
3 OVERTIME FIXED DEC;
注:PAYROLL是主结构(major structure),NAME、HOURS、RATE是次结构(minor structure),FNAME、LNAME、REGULAR、OVETTIME等是基本名字(elementary name)
l 结构名字必须是单义唯一的,为免混淆采用限定名(qualified name)
如 HOURS.REGULAR
RATE. EGULAR
l 结构数组(array of structure)
结构内是以数组出现如:
一维结构数组:DCL 1 A(8),
2 B CHAR(3),
2 C FIXED DEC(4);
二维结构数组:DCL 1 A(6,6),
2 B (4),
3 C FIXED BIN(4)
3 D FIXED BIN(4)
2 E…….
指称元素采用限定名如 A(1,2),B(3),C
3.3其它属性(attribute)
3.3.1 DEFINE
变量数组元素的存储位置可被其它变量(或数组元素)所定义,并可指定位置(position)
例1. DCL A(10,10);
DCL B(10,10) DEF A;
例2. DCL A CHAR(50);
DCL B CHAR(10) DEF A;
DCL C CHAR(15) DEF A POS(11);
DCL D CHAR(25) DEF A POS(26);
3.3.2 LIKE
结构与结构间其结构形式、名字、属性等,可在说明语句(DECLARE)中用LIKE这个属性照抄。
例: DCL 1 A
2 B
2 C
3 D
3 E
当有说明语句:
DCL 1 X LIKE A;
即为:DCL 1 X
2 B
2 C
3 D
3 E
可以有:
² 主结构与主结构间用LIKE属性
² 主结构与次结构间用LIKE属性
² 次结构与主结构间用LIKE属性
² 次结构与次结构间用LIKE属性
3.3.3 INIT 赋初值(可为常数、字符串、表达式等)
² 赋常数为初值
DCL A FIXED DEC(5,4) INIT(3.1416);
² 赋字符串为初值
DCL NAME CHAR(B) INIT(‘BANK OF CHINA’)
² 用表达式作为赋初值
DCL B INIT(M*N);
² 用内部函数来赋初值
DCL DATE BUILTIN;
DCL YMD PIC’99/99/99’ INIT(DATE);
² 对数组赋初值
整个数组元素: DCL A(10) FIXED BIN(15) INIT((10)0)
部分数组元素: DCL A(15) CHAR(10)
INIT(‘ASM’,’COBOL’,*,’PL/I’)
则仅对A(1),A(2),A(4)分别赋初值为:ASM COBOL PL/I
² 对几个变量同时赋初值
DCL (A,B,C) FIXED BIN(15) INIT(0);
即同时对A,B,C赋以0
² 对一个内存进行初始化:
如:
0DCL TEST_RECORD CHAR(31);
DCL 1 TEST_REC BASED(ADDR(TEST_RECORD)),
2 TEST_BKNO FIXED DEC(3),
2 TEST_BK2C FIXED DEC(3),
2 TEST_CUR CHAR(3),
TEST_REC = ‘’;
这样可以对TEST_BKNO、TEST_BK2C、TEST_CUR按它们对应的类型进行初始化。
² 动态初始化:
DCL W FIXED BIN(15) INIT(REMQTY);
注:REMQTY是一个带返回值的程序。有REMQTY在编译前处理,因此REMQTY程序内用的变量最好是局部变量,特别读的COPY BOOK一定要定义为局部变量。
4、表达式(expression)
4.1运算符
算术运算 +,-,*,/,**
逻辑运算 ┑,|,&
比较运算 <,=,>,<=,>=,┑<,┑=,┑>
连接运算 ‖
4.2算术运算的优先级
** |
* |
+ |
/ |
- |
若要更改运算的优先顺序,可采用括号或前缀符作人为规定
4.3逻辑运算
A |
B |
|
┑A |
┑B |
A & B |
A | B |
1 1 0 0 |
1 0 1 0 |
|
0 0 1 1 |
0 1 0 1 |
1 0 0 0 |
1 1 1 0 |
4.4比较运算
4.4.1算术比较
当运算对进行比较时,若进位制、精确度、型等不同则先进行数据转换
4.4.2字符比较
从左到右逐个字符相比
4.4.3位(二进位)的比较
从左到右逐位进行比较
注:1. 不同长的串进行比较时,把短者延长与长者相等后再作比较,
字符,延长部分是以空格补足
二进位,延长部分是以“0”B补足
2. 优先顺序
属性相同时:代数的、字符的、二进位的
属性不同时:二进位的、字符的、代数的
例:BIT与 FIXED DEC 作比较
则BIT –> FIXED BIN和FIXED DEC –> FIXED BIN再相比
3. 比较结果以BIT的一位表示
真——-’1’B 假——-’0’B
4.5 连接运算
把串(字符串、二进位字符串)进行合并的运算,
但若BIT与CHAR进行此运算,BIT一定要转换成CHAR再作合并。
4.6运算符的优先顺序
**,prefix+, prefix-,┑
*,/
infix+, infix-
‖
<,┑<,<=,=,┑=,>=,>,┑>
&
|
4.7数组表达式(Harray Expression)
4.7.1数组是由一组数据元素组成,而IF语句是只试验单一条件,所以数组不能用于IF语句里.
例: 设A为数组
则只能有IF A(I)……THEN 其中A(I)为A的某一元素,
不能写IF A…… THEN…….
4.7.2数组的运算
例:设数组A(3,2)
则 A*3的结果是:A(1,1)*3, A(1,2)*3,
A(2,1)*3,A(2,2)*3,
A(3,1)*3,A(3,2)*3
若B=A*3 则B必须与A有相同的界和范围
² A+-B 对应元素相加、减
² A*/B 对应元素相乘、除
4.8结构表达式(Structure expression)
4.8.1 结构与变量的运算,即是结构中基本名字与变量进行相应运算
例: DCL 1 A
2 B
3 C
3 D
2 E
3 F
设A * X即 A.C * X
A.D * X
A.F * X
4.8.2 结构与结构的运算,两结构的组成形式应一样,结果是:两结构的相应基本名字作所规定的运算.
例: DCL 1 A
2 B
3 C
3 D
2 E
3 F
DCL 1 X
2 Y
3 V
3 W
2 Z
3 P
求A*X 结果是: C*V
D*W
F*P
4.8.3结构和结构的赋值
将一个结构的某些元素的数据赋给另一结构内,同名的元素(用BY NAME 的赋值语句)
例: DCL 1 A
2 B
2 C
3 D
3 E
2 F
2 G
DCL 1 X
2 C
3 D
3 W
2 F
2 Z
3 P
若 X=A BY NAME;
则 X.C.D=A.C.D
X.F=A.F
4.8.4数组与结构的表达式
例: DCL 1 A
2B
2C
DCL X(2)
DCL Y(2) LIKE A
为求 Y=X+A
计算结果是: Y(1).B=X(1)+A.B
Y(2).B=X(2)+A.B
Y(1).C=X(1)+A.C
Y(2).C=X(2)+A.C