本文内容源于对IBM英文文档的理解与归纳,不保证其准确性。仅用于自学,转载请注明出处。
-----------------------------------------------------------------------------------------------
1.编码格式
"*"指示本行内容为注释。
"-"指示本行代码为上一行的延续。
"D"指示本行代码为调试代码,将在启用DEBUGGING模式时被编译,未启用时将被忽略。
"/"指示编译器为源码列表开始新的一页,并且本行将被视为注释。
部标题(DIVISION)
节标题(SECTION)
段名(段标题)
层指示符FD和SD,层号01和77
DECLARATIVES 和 END DECLARATIVES
END PROGRAM
*句法说明:
节(SECTIONs)和段(paragraphs)定义了程序,它们又细分为以下部分:
条目(entries):以句点(.)结尾的一系列从句。构造于标识部、环境部和数据部。
从句(clauses):连续的COBOL字符串的有序集合,用于指定条目的某个属性。构造于标识部、环境部和数据部。
句子(sentences):以句点(.)结尾的一个或多个语句的序列。构造于过程部。
语句(statements):指定程序要执行的某个动作。构造于过程部。
短语(phrases):构成从句和语句的更小单元。
2.基本结构
----|----1----|----2----|----3----|----4----|----5----|----6----|----7----|----8
//标识部
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. PGMNAME. //指定本程序名。此段是必须的,并且必须排在标识部的最前头。
//环境部
000003 ENVIRONMENT DIVISION.
//配置节
000004 CONFIGURATION SECTION.
000005 SOURCE-COMPUTER. IBM-PC WITH DEBUGGING MODE. //WITH从句指定启用调试代码。
000006 OBJECT-COMPUTER. IBM-PC.
000007 SPECIAL-NAMES.
000008 CURRENCY-SIGN IS $. //指定货币符号为"$"。
000009 DECIMAL-POINT IS COMMA. //在PIC字符串或数字字面值中交换逗号","和小数点"."的功能。
//输入输出节
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL. //命名程序所用文件,并将其与外部文件相关联。
000012 SELECT INPUT-FILE ASSIGN TO "IN.DAT".
//数据部
000013 DATA DIVISION.
//文件节
000014 FILE SECTION. //定义数据文件的结构。
000015 FD INPUT-FILE. //File Description.后面的文件名必须与前面SELECT语句中的一致。
000016 01 INPUT-RECORD-1 PIC X(100). //描述文件属性及与其关联的数据记录(可以是多个)。
000017 01 INPUT-RECORD-2 //同一存储区域的另一种定义。重定义INPUT-RECORD-1。
000018 03 ITEM-1 PIC X(20).
000019 03 ITEM-2 PIC X(80).
//工作存储节,描述程序处理过程中所涉及的不属于文件的数据记录。
//此存储区在运行单元开始时被分配,在运行单元结束时被销毁,在此过程中将保持其最后使用值。
000020 WORKING-STORAGE SECTION.
000021 01 WORK-FIELD PIC X(20).
//连接节,用于被调用程序,描述从调用程序传递过来的数据。
000022 LINKAGE SECTION.
000023 01 LNK-FIELD PIC X(10).
//过程部,被调用程序可以包含USING从句用于接收调用程序传递的参数数据,主调程序不需要。
000024 PROCEDURE DIVISION USING BY REFERENCE LNK-FIELD. //BY REFERENCE是默认值,可以省略。
000025 PGMNAME-START SECTION. //过程部处理逻辑的细分。
000026 PERFORM P-PROC-1-RTN.
000027 PERFORM P-PROC-2-RTN.
000028 EXIT PROGRAM. //返回调用程序(同GOBACK)。
000029 P-PROC-1-RTN SECTION.
000030 P-PROC-1.
000031 DISPLAY "first program:".
000032 P-PROC-1-EXT.
000033 EXIT. //相当于CONTINUE,其后的任何语句都会被执行。
000034 P-PROC-2-RTN SECTION.
000035 P-PROC-2.
000036 DISPLAY "HELLO, WORLD!".
000037 P-PROC-2-EXT.
000038 EXIT.
----|----1----|----2----|----3----|----4----|----5----|----6----|----7----|----8
3.标识部(IDENTIFICATION DIVISION)
PROGRAM-ID:指定程序名,其后可以加上RECURSIVE从句,表示本程序可以被递归执行。如
PROGRAM-ID. PGMNAME RECURSIVE.
RECURSIVE只能用于一个编译单元的最外层程序,该程序不能包含嵌套子程序。
4.环境部(ENVIRONMENT DIVISION)
配置节:CONFIGURATION SECTION描述程序编译和执行的计算机环境。
SOURCE-COMPUTER:指定用于编译本程序的计算机系统名,由编译器厂商定义。
WITH DEBUGGING MODE将启用调试代码,其中"WITH"可以省略。
OBJECT-COMPUTER:指定用于运行本程序的计算机系统名。
输入输出节:INPUT-OUTPUT SECTION可以包含两个段,FILE-CONTROL和I-O-CONTROL,后者不常用。
*文件说明:
可用的文件组织方式取决于所选用的数据存储设备:
在用于z/OS和OS/390系统的IBM Enterprise COBOL上,向操作系统作出的对输入输出设备数据记录的存储和检索请求,由两种存取方式——QSAM和VSAM,及UNIX文件系统来处理。
FILE-CONTROL:将程序中的每个逻辑文件与外部数据集联系起来,并指定文件的组织、存取方式及其他信息。可包含如下语句:([]中的词是可选的)
SELECT [OPTIONAL] INFILE ASSIGN [TO] "FILE.DAT"
ORGANIZATION [IS] *
ACCESS [MODE] [IS] *
RECORD/RELATIVE [KEY] [IS] *
ALTERNATE [RECORD] [KEY] [IS] * [[WITH] DUPLICATES]
[FILE] STATUS [IS] DATANAME1 DATANAME2.
INFILE是程序中使用的逻辑文件名,它必须在数据部文件节的FD或SD条目中被描述。
FILE.DAT可以是操作系统下的物理文件,也可以是记号名(如DD名或环境变量),可在之后利用运行时选项为其指定实际的物理文件。
OPTIONAL表示此文件不一定每次运行时都会存在。当以只读(INPUT)或读写(I-O)方式打开此文件时,如果文件不存在,将自动创建此文件。在没有OPTIONAL限定时,读取不存在的文件会报错。
ORGANIZATION指定文件的逻辑结构:
ACCESS MODE指定文件中的记录以何种方式可用:
RECORD KEY用于指定INDEXED文件记录中用作主键的项目。对于不同的记录,主键的值必须是唯一的。
RELATIVE KEY确立一个数据名,用来为RELATIVE文件的记录指定相对记录号。它不能是数据记录的一部分,必须被定义为无符号整型,且不能包含PICTURE符号"P"。
ALTERNATE RECORD KEY替换关键字是可选的,它提供了存取INDEXED文件的另一途径。当指定了DUPLICATES时,替换关键字的值对于不同记录必须是唯一的,如果没有指定DUPLICATES,其值可以有重复。对于顺序存取方式,具有相同键值的记录按其被输入文件的顺序来读写;对于随机存取方式,只有第一条记录可以被检索到。
FILE STATUS监视文件每一次输入输出操作的执行。在每一次涉及此文件的显式的或隐式的输入输出操作之后,系统都会给由FILE STATUS指定的项目设定一个值。
I-O-CONTROL:此段在COBOL程序中是可选的,用于指定程序的重新运行点和不同文件共享的内存区等。由于此段很少使用,无需详细了解。
5.数据部(DATA DIVISION)
数据部以结构化的方式描述程序中处理的所有数据。
文件节:FILE SECTION描述数据文件的结构。对于SORT/MERGE文件,必须包含一个SD描述项,对于其它文件,必须包含一个FD描述项。
FILE SECTION.
FD FILE-NAME
[IS] EXTERNAL
[IS] GLOBAL
BLOCK [CONTAINS] INT-1 [TO INT-2] CHARACTERS/RECORDS
RECORD [CONTAINS] INT-3 [TO INT-4] [CHARACTERS]
RECORD IS VARYING IN SIZE [FROM] INT-5 TO INT-6 CHARACTERS DEPENDING [ON] INT-7
01 FILE-RECORD.
03 *.
...
FILE-NAME必须与环境部相应的SELECT从句指定的名字一致。其后的从句都是可选可任意排列的。
EXTERNAL表明FILE-NAME是外部的。外部文件名能让两个程序通过共享文件来通信,此文件的存储区是与整个运行单元关联的,而不是只与其中某个程序关联。
GOLBAL表明FILE-NAME是全局的。全局文件名对声明它的程序以及直接或间接包含于该程序的每个程序都是可用的。
BLOCK CONTAINS指定物理记录的长度。INT-1和INT-2必须为非0无符号整数,它包括物理记录中任意的控制字节和填充内容(逻辑记录不包括填充内容)。如果记录不是分块的,此句可以省略。CHARACTERS用来指定一条物理记录所包含的字节数,它是默认的。RECORDS用来指定一条物理记录所包含的逻辑记录数。
RECORD指定用于存储每条记录的字节数。INT-3单独使用时用于定长记录;INT-3和INT-4一起使用时可用于定长或变长记录,但这种形式在任何情况下都不是必须的。当一个文件的所有01层描述项都具有相同的长度时,将得到定长记录。INT-7必须是无符号整型数据项。
工作存储节:WORKING-STORAGE SECTION描述不属于数据文件的数据记录,它也用于描述在源程序中被赋值并在目标文件的执行过程中保持值不变的数据项。
连接节:LINKAGE SECTION用于被调用程序,描述从调用程序传递过来的参数数据。
6.过程部(PROCEDURE DIVISION)
过程部包含程序要执行的所有语句,包括可选的DECLARATIVES和节、段、语句等。
过程部的部头格式为:
PROCEDURE DIVISION [USING [[BY] REFERENCE/VALUE] DATA-1...] [RETURNING DATA-2].
USING短语用于子程序,指定程序被调用时所接收的参数。DATA-1...必须是LINKAGE SECTION中定义为01层或77层的数据项,但在调用程序的CALL语句的USING短语中指定的数据项可以是其数据部中定义的任意层的数据项。DATA-1...的数据描述项中可以包含REDEFINES从句。可以从非COBOL程序CALL COBOL程序,或者从系统命令向COBOL主程序传递用户参数。调用程序与子程序的USING短语中的标识符是按位置而不是名字来对应的,相应的标识符必须包含相同的字节数,尽管它们的数据描述不必相同。BY REFERENCE和BY VALUE短语作用于其后的所有参数,直到出现另一个此短语。
RETURNING短语指定一个用于接收程序结果的数据项,这是一个输出参数。DATA-2必须是LINKAGE SECTION中定义为01层或77层的数据项。此短语不能用于包含ENTRY语句的程序、嵌套程序和主程序。
过程部的结束由以下之一标识:
7.数据描述
程序中所有数据间的关系在数据部中通过层指示符和层号来定义。
层指示符(level indicator)和其描述条目一起指定了程序中的每个文件。FD是文件描述的层指示符,SD是sort-merge文件描述的层指示符。
层号(level-number)和其描述条目一起指定了具体数据的属性。层号包括范围[01,49]中的一位或两位整数,以及3个特殊层号:66、77、88。
基本数据项(elementary items)是数据的基本划分。
组数据项(group items)是基本数据项的组合。组还可以组合成包含一个或多个子组的更大的组。不带GROUP-USAGE从句的组是英数字型的组,无论其所包含的基本数据项是如何表示的。GROUP-USAGE的用法为:
GROUP-USAGE [IS] NATIONAL.
每个组数据项和基本数据项都是一个单独的条目,都必须被赋予一个层号。
66 DATA-1 RENAMES DATA-2 [THROUGH/THRU DATA-3].
例1-------------------------------
01 RECORD-I
05 DN-1... .
05 DN-2... .
05 DN-3... .
05 DN-4... .
66 DN-6 RENAMES DN-1 THROUGH DN-3.
图示:
│DN-1│DN-2│DN-3│DN-4│
┕━━━DN-6━━━┙
例2-------------------------------
01 RECORD-II
05 DN-1... .
10 DN-2... .
10 DN-2A... .
05 DN-1A REDEFINES DN-1.
10 DN-3A... .
10 DN-3... .
10 DN-3B... .
05 DN-5... .
66 DN-6 RENAMES DN-2 THROUGH DN-3.
图示:
┍━━━DN-1 ━━━━┑
│DN-2 │ DN-2A │DN-5 │
┍━━━DN-1A━━━━┑
│DN-3A │DN-3│DN-3B│
┕━━DN-6━━┙
01 AGE-GROUP PIC 99. //条件变量(conditional variable)
88 INFANT VALUE 0. //条件名(condition name),下同
88 BABY VALUE 1, 2.
88 CHILD VALUE 3 THRU 12.
88 TEENAGER VALUE 13 THRU 19.
用法:
IF INFANT //如果AGE-GROUP的值为0
... //执行语句
数据分类:
Class |
Category |
Usage |
Alphabetic |
Alphabetic |
DISPLAY |
Alphanumeric |
Alphanumeric |
DISPLAY |
Alphanumeric-edited |
DISPLAY |
|
Numeric-edited |
DISPLAY |
|
DBCS |
DBCS |
DISPLAY-1 |
National |
National |
NATIONAL |
National-edited |
NATIONAL |
|
Numeric-edited |
NATIONAL |
|
Numeric |
Numeric |
DISPLAY (type zoned decimal) |
NATIONAL (type national decimal) |
||
PACKED-DECIMAL (type internal decimal) |
||
COMP-3 (type internal decimal) |
||
BINARY |
||
COMP |
||
COMP-4 |
||
COMP-5 |
||
Internal floating-point |
COMP-1 |
|
COMP-2 |
||
External floating-point |
DISPLAY |
|
NATIONAL |
数据对齐规则:
数据在基本数据项中的对齐标准取决于接收它的数据项的类型。
数值数据内部表示:
数值类型 |
PICTURE、USAGE和可选SIGN从句 |
值 |
内部表示 |
External decimal |
PIC S9999 DISPLAY |
+ 1234 |
F1 F2 F3 C4 |
- 1234 |
F1 F2 F3 D4 |
||
1234 |
F1 F2 F3 C4 |
||
PIC 9999 DISPLAY |
1234 |
F1 F2 F3 F4 |
|
PIC S9999 DISPLAY SIGN LEADING |
+ 1234 |
C1 F2 F3 F4 |
|
- 1234 |
D1 F2 F3 F4 |
||
PIC S9999 DISPLAY SIGN LEADING SEPARATE |
+ 1234 |
4E F1 F2 F3 F4 |
|
- 1234 |
60 F1 F2 F3 F4 |
||
PIC S9999 DISPLAY SIGN TRAILING SEPARATE |
+ 1234 |
F1 F2 F3 F4 4E |
|
- 1234 |
F1 F2 F3 F4 60 |
||
Binary |
PIC S9999 BINARY COMP COMP-4 |
+ 1234 |
04 D2 |
- 1234 |
FB 2E |
||
PIC S9999 COMP-5 |
+ 12345 |
30 39 |
|
- 12345 |
CF C7 |
||
PIC 9999 BINARY COMP COMP-4 |
1234 |
04 D2 |
|
PIC 9999 COMP-5 |
60000 |
EA 60 |
|
Internal decimal |
PIC S9999 PACKED-DECIMAL COMP-3 |
+ 1234 |
01 23 4C |
- 1234 |
01 23 4D |
||
PIC 9999 PACKED-DECIMAL COMP-3 |
+ 1234 |
01 23 4F |
|
- 1234 |
01 23 4F |
||
Internal floating point |
PIC 9999 COMP-1 |
+ 1234 |
43 4D 20 00 |
PIC 9999 COMP-2 |
+ 1234 |
43 4D 20 00 00 00 00 00 |
|
- 1234 |
C3 4D 20 00 00 00 00 00 |
||
External floating point |
PIC +9(2).9(2)E+99 DISPLAY |
+ 1234 |
4E F1 F2 4B F3 F4 C5 4E F0 F2 |
- 1234 |
60 F1 F2 4B F3 F4 C5 4E F0 F2 |
*内部表示为16进制表示,每个16进制字符占用4位(bits),两个16进制字符表示1个字节(byte)。
数据描述从句:
FILLER:指定程序中不被显示提到的数据项。如果省略了数据名及FILLER,则相当于使用了FILLER。在INITIALIZE语句中,FILLER数据项将被忽略。
BLANK WHEN ZERO/ZEROS/ZEROES:当数据项的值为零时,该项只包含空格。只能用于数字型和数字编辑型的基本数据项,且其PICTURE字符串不包含S或*,必须被显式或隐式地描述为USAGE DISPLAY或USAGE NATIONAL。不能用于日期字段。
JUSTIFIED/JUST [RIGHT]:右对齐。只用于英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型(alphabetic)/DBCS/national/national-edited。
OCCURS:指定一个表(数组),其元素可以通过下标来访问,下标从1开始。OCCURS不能用于01、66、77和88层的项目。多维表通过嵌套OCCURS来实现,其下标格式为(m,n,k...)或(m n k...)。格式:
OCCURS INT-1 [TO INT-2] [TIMES] DEPENDING [ON] DATA-1
ASCENDING/DESCENDING [KEY] [IS] DATA-2...
INDEXED [BY] IDX-1... .
其中,INT-2必须比INT-1大。
DEPENDING ON从句定义不定长的表。DATA-1必须是整数数据项,其当前值代表了表中当前的元素个数。
ASCENDING/DESCENDING KEY短语指定表中的数据必须按升序或降序排列。DATA-2...必须按其重要性的降序列出。所有KEY的个数不能超过12个,所有KEY的长度和不能超过256。
INDEXED BY定义表的索引。可以为一个特定的表创建索引(用INDEXED BY),此索引也可以用于其它表,只要两个表具有相同数目及相同长度的元素;也可以单独创建一个索引(用USAGE [IS] INDEX),此索引可以用于任何一个表。例:
05 TABLE-ITEM PIC X(8) OCCURS 10 INDEXED BY INX-A.
77 INX-B USAGE IS INDEX.
PERFORM VARYING INX-B FROM 1 BY 1 UNTIL INX-B > 10
DISPLAY TABLE-ITEM(INX-B)
END-PERFORM.
PICTURE/PIC [IS]:指定基本数据项的一般特征和编辑要求。PICTURE从句不可用于INDEX数据项、RENAMES主语、POINTER和内部浮点数。picture符号的含义:
紧跟在其中任一符号后的括号内的无符号非0整数表示该符号连续出现的个数。
REDEFINES:用不同的数据描述条目描述同一块计算机内存区域。格式:
level-number [DATA-1/FILLER] REDEFINES DATA-2.
DATA-1及其下级项不能包含VALUE从句。DATA-2的描述项可以有REDEFINES从句,不可以有OCCURS从句,但DATA-2可以是OCCURS数据项的下级项。DATA-1和DATA-2必须具有相同级别,但层号不必相同,且不能是66或88。DATA-1的长度可以比DATA-2的长度大,这不会改变DATA-2的长度。
如果 A REDEFINES B. 则 MOVE A TO B 和 MOVE B TO A 的结果可能是未定义的。
SIGN:为带符号数字项指定运算符的位置和表现形式。格式:
[SIGN [IS]] LEADING/TRAILING [SEPARATE [CHARACTER]].
该从句只能用于一个用语为DISPLAY或NATIONAL且其picture字符串中包含S的基本数字数据项,或者至少包含一个此类数据项的组数据项。当用于后者时,SIGN从句只作用于组中包含的如前者的数据项,其它数据项将不受此从句影响。USAGE NATIONAL必须包含SEPARATE短语。
SYNCHRONIZED:指定基本数据项在内存的自然边界上的对齐方式。可用于基本数据项和01层组数据项。格式:
SYNCHRONIZED/SYNC [LEFT/RIGHT].
USAGE:指定数据在内存中的表示格式。可用于除66和88外的任意层次的数据描述条目。组数据项的USAGE将作用于组内每一个基本数据项。当USAGE没有被显式地指定时,将默认为如下的USAGE:
计算项(computational items)用于算术运算,必须是数字型。其最大长度为18位数,除了PACKED-DECIMAL项外。如果编译器选项ARITH(COMPAT)有效,PACKED-DECIMAL的最大长度为18位数;如果ARITH(EXTEND)有效,则PACKED-DECIMAL的最大长度为31位数。其PICTURE字符串只能包含:9、S、V、P。COMP-1和COMP-2不能有PICTURE字符串。计算项包括以下用语(COMP是COMPUTATIONAL的缩写,二者等价):
位数: 内存:
1~4 2个字节
5~9 4个字节
10~18 8个字节
二进制数是big-endian的,运算符包含在最左边的位上。
PIC: 内存: 取值范围:
S9(01)~S9(04) 2个字节 2^(-15)~2^15-1
S9(05)~S9(09) 4个字节 2^(-31)~2^31-1
S9(10)~S9(18) 8个字节 2^(-63)~2^63-1
9(01)~9(04) 2个字节 0~2^16-1
9(05)~9(09) 4个字节 0~2^32-1
9(10)~9(18) 8个字节 0~2^64-1