Операторы CICS в теле оператора IF

Добрый день, я анализирую некоторый устаревший код в 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 на самом высоком уровне, но в этом случае за END-EXEC, содержащимся в теле IF, следует точка, которая, следуя вышеупомянутому логика закрыла бы предложение, а ELSE не относился бы ни к какому ЕСЛИ. Я прав или есть конкретный случай, когда это сработает? Спасибо.


person guster47    schedule 18.11.2019    source источник
comment
Если один из ответов правильный, отметьте его так (галочкой), чтобы помочь будущим пользователям.   -  person Ben Cox    schedule 30.01.2020


Ответы (3)


Весь оператор 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
person Rick Smith    schedule 18.11.2019
comment
Оооо, ок, теперь понятно. Он был предоставлен мне для анализа, поэтому я не компилирую его и не имею доступа к другим ресурсам, поэтому я не могу быть в этом уверен. Спасибо всем! - person guster47; 18.11.2019

Просмотрите список компиляции, чтобы убедиться, что было сделано с этой конкретной версией и выпуском компилятора и транслятора CICS на момент компиляции.

Внедрение встроенных трансляторов привело к некоторым интересным пограничным случаям.

person cschneid    schedule 18.11.2019

Вы правы, точка завершает IF, и написанный код не будет компилироваться чисто, поэтому я сомневаюсь, что этот код в том виде, в котором он написан, действительно используется. =000033==> IGYPS2011-E "ELSE" не имеет соответствующего "IF". "ELSE" было отброшено.

person George    schedule 18.11.2019