【问题标题】:CICS statements in the body of an IF statementIF 语句正文中的 CICS 语句
【发布时间】:2019-11-18 12:34:46
【问题描述】:

下午好, 我正在分析 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-statement cobol cics


【解决方案1】:

通过结束分隔符句点的整个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

【讨论】:

  • 哦,好的,现在很清楚了。它是给我分析的,所以我没有编译它,也无权访问其他资源,所以我不能确定。谢谢大家!
【解决方案2】:

查看编译列表以确定编译完成时编译器和 CICS 转换器的特定版本和发行版做了什么。

为一些有趣的边缘情况引入了集成翻译器。

【讨论】:

    【解决方案3】:

    您是对的,该句点终止了 IF,并且编写的代码不会完全编译,所以我怀疑编写的这段代码实际上正在被使用。 =000033==> IGYPS2011-E “ELSE”没有匹配的“IF”。 “ELSE”被丢弃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多