PLI 到 COBOL 的转换数据类型 【不搞Mainframe的可能看不懂,冷门的语言】

此文非常小众,只是想认识一下圆子里面的做大型机的朋友。文章内容是这几年做语言转换积累来下的资料。全部原创的内容,觉得有些可惜,想给做大型机开发的朋友,不过,也没有专门的地方发表,借园子的人气找点朋友。

资料有800K的Excel和一个VBNET写的自动转换软件。



数据类型整理






























































































数据类型 实例 说明








BIT DCL ENDTR         BIT(1); 1个Bit位,通常用做FLAG








CHAR DCL EDSTR         CHAR(99); 字符








EXTERNAL ENTRY DCL MSTWZ00       EXTERNAL ENTRY; 外部程序








FILE DCL MSFILE        RECORD INPUT; 外部文件








FIXED DCL MONCNT(3)     FIXED(15); 如果FIXED 没有 BIN 或者 DEC 来修饰








FIXED BIN DCL KBTBL(4)      BIN FIXED(15) ;   2进制数








FIXED DEC(DEC) DCL IPCNT         FIXED DEC(15,0);                        10进制数








FUNCTION DCL DATE          BUILTIN; PL1函数








G DCL TENNM         G(20) 日本语项目








PIC DCL YY            PIC'Z9',   编辑用字符








PTR DCL EX1           PTR;  指针










































































































* FUNCTION ,EXTERNAL ENTRY,BIT 在COBOL里面已经废止或者使用其他方法实现


























* 数据部中出现的INCLUDE有可能是数据结构,有可能是初始化程序!这个需要通过外部的COPY句情报文件来确定.




































































数据类型别转换说明




























































































BIT 【COBOL没有对应类型】                                                                        























































实例:

DCL ENDTR         BIT(1);






































识别方法: 判断是否拥有以 BIT( 开头的单词






































参数

INIT

初始值










































LENGTH

长度











































REPEAT

重复次数,或者是多维数组






































COMMENT
注释











































NAME

名称





































* COMMENT,NAME,REPEAT 为所有成员的共通参数,下面的文档将省略。































转换方法: COBOL的 字符型(X)






















































































* 如果这个BIT型只是长度为1的用做标示的变量,可以简单的用字符型代替。




























* 如果这个BIT型是从文件中读取的话,8个BIT作为一个CHAR。然后通过字符转2进制的子程序来作为标志位使用。








































































PL1:

DCL AAA   BIT(8)   INIT('00000001'B)



































COBOL:
01 AAA   PIC X(01) VALUE X'01'. 




















































































CHAR                                                                                      




EXTERNAL ENTRY 【COBOL没有对应类型】                                                                    























































实例:

DCL MSTWZ00       EXTERNAL ENTRY;




































识别方法: 判断是否拥有 EXTERNAL 和 ENTRY






































参数:

不存在










































转换方法: 直接删除









































* 需要将外部程序名记录下来,在CALL方法时,将做外内部过程,外部程序的判断标准。





标准需要再考虑















































































































FILE 【暂时对应方案不明】                                                                        























































实例:

DCL MSFILE        RECORD INPUT;





































识别方法:
















































如果出现单独的 FILE 关键字 ,可以断定是 FILE类型。由于 FILE 关键字可以省略,所以不能使用 FILE 关键字来作为识别的依据。



















从文件的读取方式上说,有RECORD单位读取和STREAM流读取两种,从文件的作用上说,有INPUT,OUTPUT和UPDATE,EXTERNAL





















如果出现关键字 RECORD 或者 STREAM 的同时,还出现关键字 INPUT 或者 OUTPUT 或者 UPDATE,则可以断定这是个文件定义。
















参数

ISPRINT
是否为PRINT类型








































FILEFORMAT
RECORD或者STREAM








































FILEIO

INPUT,OUTPUT,UPDATE,EXTERNAL































转换方法

















































       FD %filename                                                             

















       RECORD CONTAINS   %length CHARACTERS                                        

















       BLOCK CONTAINS   0 RECORDS                                              

















       LABEL RECORD    IS STANDARD                                              

















       RECORDING MODE IS F.                                                  

















       01 %filename-REC   PIC X(%length).                                        

















%filename-REC只需要注明程序的长度就可以了,程序不使用这个变量

















































































每个文件,文件状态和结束标志需要定义在数据部里





































    01 MSFILE-ST   PIC X(02).                           文件状态标志[可选]            

















    01 SYSINX-ST   PIC X(02).                           文件状态标志[可选]            

















    01 MSFILE-EOF PIC X(01) VALUE'0'.                                          

















    01 SYSINX-EOF PIC X(01) VALUE'0'.                                          


































































VSAM文件还需要指定 ACCESS MODE,RECORD KEY,ORGANIZATION











































































FIXED(FIXED BIN,FIXED DEC)                                                                      























































* FIXED 如果没有明确的 BIN 或者 DEC 的说明,默认为DEC。

















































































实例:

DCL MONCNT(3)     FIXED(15);






































识别方法: 如果只拥有 FIXED 关键字,不管是否拥有 DEC,都作为 FIXED DEC。
































如果只拥有 FIXED 关键字,还拥有关键字 BIN, 则作为 FIXED BIN。




























参数

INIT

初始值










































LENGTH

长度







































转换方法

















































FIXED BIN:













































FIXED BIN(15)




PIC S9(4) COMP

































FIXED BIN(31)




PIC S9(8) COMP

































FIXED DEC:













































DEC(n)






PIC S9(n) COMP-3

































FIXED DEC(n)





PIC S9(n) COMP-3

































FIXED(n) 





PIC S9(n) 

FIXED省略DEC的情况时,COMP-3也省略






















* FIXED BIN 暂时不考虑 15,31以外的情况。



链接:PL1技巧和注意点











































































































































































FUNCTION 【COBOL没有对应类型】       链接:函数处理                                                      























































实例:

DCL DATE          BUILTIN;






































识别方法: 只要拥有 BUILTIN 关键字。






































参数:

不存在










































转换方法: 直接删除























































































G                                                                                        






















































实例:

DCL TENNM         G(20)






































识别方法:
拥有关键字 G








































参数


INIT

初始值










































LENGTH

长度






































转换方法:
01 TENNM         PIC G(20)    USAGE DISPLAY-1































* G型初始化或者赋值时候,默认的是加上 0x0E 和 0x0F 。


































由于这个原因,G型实际可以存放字符大小和定义大小相差1。如果是N型的话,没有这个问题 需要验证
























如果G型拥有初始值的话,如果初始值里有左右括号(可能还有其他未知的符号),或者某些汉字的内码是左右括号的话,会造成编译错误。















建议把所有汉字初始值的地方的单引号用双引号代替(这个问题可能同样出现在其他的VALUE中)







































































PIC                                                                                      























































实例:

DCL YY            PIC'Z9'






































识别方法: PIC 关键字









































参数:

INIT

初始值










































PIC

PIC格式






































转换方法: 对于一般PIC格式,可以完全使用PL1的格式







































01 YY                        PIC Z9







































下面两种情况,必须特别处理










































1.带有 "/" 的项目 和 带有 "."的项目









































DCL DATE            PIC’9999/99/99'







































需要根据将 / 以及 /前后项目拆开










































01 YY                        PIC 9999 DATE














































 02 YEAR    PIC (4)9











































 02 FILLER PIC X INIT('/')





防止初始化
































 02 MONTH   PIC (2)9











































 02 FILLER PIC X INIT('/')





防止初始化
































 02 DAY     PIC (2)9










































?需要确认:COBOL里面 / 符号不占位置,PL1里面占位置?




































2.带有"Y"的项目













































Y的作用是将0转换为空格












































Specifies that a zero in the specified digit position is replaced































unconditionally by the blank character







































DCL DATE            PIC ‘99Y99’








































需要用Z来分开改写












































01 DATE.














































 02 YEAR    PIC 99.












































 02 MONTH   PIC Z99.







































        根据项目经验和客户QA的决定,将Y改为9              





























* 可能还有其他不能直接转换的情况







































* ----9V.999 V 怎么转换,有的情况一律拆分开来?































9999.99.99








































































































































PTR                                                                                      























































实例:

DCL EX1           PTR;







































识别方法: 以 PTR 结尾









































参数:

不存在










































转换方法: EX1                        USAGE IS POINTER.





























































































































原文地址:https://www.cnblogs.com/TextEditor/p/2083483.html