您的位置:首页 > 大数据 > 人工智能

Windows下使用VIM&Cygwin,搭建Mainframe开发环境(六)---用awk/sed合并PLI/Cobol编译结果

2009-09-08 21:47 696 查看
z/OS上的PL/I 和COBOL都是Enterprise Edition了,名字看上去很牛逼,实际还是那么的落后,落后在哪里呢?­

­

COBOL的编译输出信息格式是这样的:­

IGY*-错误级别 行号 出错信息,比如:­

IGYXX0001-W 0120 A blank was missing before character "?" in column ?. A blank was assumed.­

­

这时你用120作为行号去原始的代码里找,你会发现这一行不是你要找的错误所在,这就是傻的地方.­

这个行号完全没有任何实际意义,好笑的是这个行号对应了被编译预处理过的,中间代码中的行号,而不是和你写的那个实际文件对应.­

也就是说你得用这个行号去编译结果里一行一行找到实际代码是什么内容,再根据这个具体内容到你的文件里对应到那一行再修改错误.­

­

PLI的编译输出信息是这样的:­

IBM* 错误级别 行号.文件编号 出错信息, 比如:­

IBM1507I S 120.0 Arrays of label constants may not be passed as arguments.­

­

对于不含CICS或者SQL语句的程序,你用120.0去源文件里查找到120这一行,你会发现这行正是编译器报告错误的地方.­

很不幸的是,对于含有CICS或者SQL语句的程序,它又傻了,因为编译器会展开CICS或者SQL语句,­

编译结果中展开后的行号完全不能和源代码对应起来,又是犯了和上面说的COBOL一样的傻问题.­

­

我想说IBM太傻,太懒,一点也不为用户考虑,Mircro Focus在Unix平台上的COBOL编译器就做得非常优秀,错误信息的地方同时附上错误代码和行号,而且确切的就是那一行.­

­

我要用awk和sed这些优秀的工具改造IBM的那一大坨屎,就是要和Mircro Focus一样,错误信息后面给出具体的错误语句:­

对于COBOL,结果是这样的:­

IGYXX0001-W 0120 A blank was missing before character "T" in column 14. A blank was assumed.­

MOVE ATO B­

对于PLI,结果是这样的:­

IBM1847I S 120.0 GOTO target is inside a (different) DO loop.­

GOTO LABLEA­

也就是一行出错信息,紧接着下一行就是出错的语句. ­

­

基本原理就是分别抽取编译结果中的预处理过的代码,生成一个文件,比如src,包含了具体行号和内容.­

再抽取编译结果里的出错信息,生成一个文件,比如mes.­

­

首先得用sed对这两个文件进行一些预先的处理,去掉行首的0,IBM的Mainframe上用行首(第一列)的0表示翻页什么的,以及去掉每一页的标题.­

之后的关键操作就是用awk同时读入这两个文件,首先读入src,抽取行号这一个字段作为数组下标,保存这一行内容到awk临时数组中,­

处理完src文件接着读入mes,这个时候,遇到一条编译出错信息即抽取出错信息中的行号字段,用这个行号匹配之前的临时数组,­

把对应临时数组中的内容打印在这条出错信息的下一行,基本就是这样的操作了.­

­

语句示例:­

awk 'NR==FNR{a[$1]=$0} /­

NR> FNR {if($0 ~ /IBM/){printf "/n"};print $0;if(a[$3] ~! //){print a[$3];}} /­

/tmp/compilersrc /tmp/compilermes

­

compilersrc即是预处理的代码文件,compilermes是编译出错信息.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐