IF 语句主体中的 CICS 语句
CICS statements in the body of an IF statement
下午好,
我正在分析 COBOL 中的一些遗留代码,发现了这个我无法理解的特定案例。
000610 IF EIBCALEN = 0 00061011
000700 EXEC CICS 00070000
000800 SEND MAP('TCHM144') 00080007
001100 END-EXEC. 00110000
001110 ELSE 00111013
001111 IF EIBAID = DFHCLEAR OR DFHPF2 OR DFHPF3 00111113
001112 EXEC CICS SEND FROM(WS-CHAR) 00111213
001113 LENGTH(LENGTH OF WS-CHAR) 00111313
001114 ERASE 00111413
001115 END-EXEC. 00111513
001116 EXEC CICS RETURN END-EXEC. 00111613
001120* MAPONLY ERASE FREEKB 00112002
001200 EXEC CICS 00120000
001300 RETURN TRANSID('TCE4') 00130000
001400 END-EXEC. 00140000
001500 GOBACK. 00150012
据我所知,在 IF 语句的正文中有一个句号会在最高级别关闭 IF 之前的句子,但在这种情况下,IF 正文中包含的 END-EXEC 后跟一个句号,它, 遵循上述逻辑将结束句子,ELSE 将不会被引用到任何 IF。我是正确的还是在特定情况下可以这样做?谢谢。
你是对的,句点终止了 IF,并且所写的代码无法干净地编译,所以我怀疑所写的代码是否真的被使用了。
=000033==> IGYPS2011-E 一个 "ELSE" 没有匹配的 "IF"。 "ELSE" 被丢弃。
查看编译列表以确定在编译完成时编译器和 CICS 转换器的特定版本和发行版做了什么。
集成转换器的引入针对一些有趣的边缘案例。
通过结束分隔符句点的整个 EXEC
语句将被代码替换。这类似于 COPY
语句发生的情况。在下文中,两个 COPY
语句都复制了包含没有分隔符的简单加法指令的文本。在预处理期间,COPY
语句被替换为文本。 EXEC
语句也是如此。只要 EXEC
语句不引入任何分隔符句点,COBOL
关于 sentence
结尾的规则就不适用。
正如@cschneid 所建议的那样,查看清单以了解对该源代码做了什么。
以下是一个包含 COPY
语句的示例。请注意,分隔符句点对编译没有影响。
来源:
data division.
working-storage section.
1 a pic 9 value 0.
1 b pic 9 value 0.
procedure division.
begin.
display 'A: ' a
display 'B: ' b
if a = b
copy a.
else
copy b.
end-if
display 'A: ' a
display 'B: ' b
stop run
.
列表:
1 data division.
2 working-storage section.
3 1 a pic 9 value 0.
4 1 b pic 9 value 0.
5 procedure division.
6 begin.
7 display 'A: ' a
8 display 'B: ' b
9 if a = b
* 10 copy a.
11 add 1 to a
12 else
* 13 copy b.
14 add 1 to b
15 end-if
16 display 'A: ' a
17 display 'B: ' b
18 stop run
19 .
输出:
A: 0
B: 0
A: 1
B: 0
下午好, 我正在分析 COBOL 中的一些遗留代码,发现了这个我无法理解的特定案例。
000610 IF EIBCALEN = 0 00061011
000700 EXEC CICS 00070000
000800 SEND MAP('TCHM144') 00080007
001100 END-EXEC. 00110000
001110 ELSE 00111013
001111 IF EIBAID = DFHCLEAR OR DFHPF2 OR DFHPF3 00111113
001112 EXEC CICS SEND FROM(WS-CHAR) 00111213
001113 LENGTH(LENGTH OF WS-CHAR) 00111313
001114 ERASE 00111413
001115 END-EXEC. 00111513
001116 EXEC CICS RETURN END-EXEC. 00111613
001120* MAPONLY ERASE FREEKB 00112002
001200 EXEC CICS 00120000
001300 RETURN TRANSID('TCE4') 00130000
001400 END-EXEC. 00140000
001500 GOBACK. 00150012
据我所知,在 IF 语句的正文中有一个句号会在最高级别关闭 IF 之前的句子,但在这种情况下,IF 正文中包含的 END-EXEC 后跟一个句号,它, 遵循上述逻辑将结束句子,ELSE 将不会被引用到任何 IF。我是正确的还是在特定情况下可以这样做?谢谢。
你是对的,句点终止了 IF,并且所写的代码无法干净地编译,所以我怀疑所写的代码是否真的被使用了。 =000033==> IGYPS2011-E 一个 "ELSE" 没有匹配的 "IF"。 "ELSE" 被丢弃。
查看编译列表以确定在编译完成时编译器和 CICS 转换器的特定版本和发行版做了什么。
集成转换器的引入针对一些有趣的边缘案例。
通过结束分隔符句点的整个 EXEC
语句将被代码替换。这类似于 COPY
语句发生的情况。在下文中,两个 COPY
语句都复制了包含没有分隔符的简单加法指令的文本。在预处理期间,COPY
语句被替换为文本。 EXEC
语句也是如此。只要 EXEC
语句不引入任何分隔符句点,COBOL
关于 sentence
结尾的规则就不适用。
正如@cschneid 所建议的那样,查看清单以了解对该源代码做了什么。
以下是一个包含 COPY
语句的示例。请注意,分隔符句点对编译没有影响。
来源:
data division.
working-storage section.
1 a pic 9 value 0.
1 b pic 9 value 0.
procedure division.
begin.
display 'A: ' a
display 'B: ' b
if a = b
copy a.
else
copy b.
end-if
display 'A: ' a
display 'B: ' b
stop run
.
列表:
1 data division.
2 working-storage section.
3 1 a pic 9 value 0.
4 1 b pic 9 value 0.
5 procedure division.
6 begin.
7 display 'A: ' a
8 display 'B: ' b
9 if a = b
* 10 copy a.
11 add 1 to a
12 else
* 13 copy b.
14 add 1 to b
15 end-if
16 display 'A: ' a
17 display 'B: ' b
18 stop run
19 .
输出:
A: 0
B: 0
A: 1
B: 0