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