下午好,我正在分析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主体中包含的结束--EXEC后面是一个句号,按照上述逻辑,该句点将结束句子,而其他语句将不被引用。我是正确的,还是有一个具体的情况,这是可行的?谢谢。
发布于 2019-11-18 15:51:40
结束分隔符期间的整个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发布于 2019-11-18 15:09:41
查看编译清单,以确定在编译时对特定版本做了什么,并发布了编译器和CICS翻译器。
综合翻译的引入为一些有趣的边缘案例创造了条件。
发布于 2019-11-18 12:57:17
您是正确的,句点终止IF,并且编写的代码不能很好地编译,所以我怀疑编写的代码是否真的被使用了。=000033==> IGYPS2011 2011-E一个“其他”没有匹配的“如果”。“其他”被丢弃了。
https://stackoverflow.com/questions/58914680
复制相似问题