Выражение «COPY» с «REPLACING» в языке COBOL - PullRequest
5 голосов
/ 12 сентября 2011

Я получаю ошибку компиляции как,

Оператор "COPY" с фразой "REPLACING" был найден во вложенном "COPY".

Это наш параметр компиляции, в котором мы не можем использовать глагол REPLACING во вложенной копии.У нас есть одна тетрадь, в которой есть несколько операторов копирования с заменой глагола.Может кто-нибудь помочь мне решить эту ошибку?

Ответы [ 2 ]

12 голосов
/ 12 сентября 2011

Вложение COPYBOOKS в COBOL - небольшая хитрость.Как правило, вы можете вложить тетради только в том случае, если они не содержат фразу REPLACING и не вызывают рекурсию.

Предположим, у вас были следующие две тетради:

ABC COPYBOOK

  01 :A:-VAR-A1     PIC X.
  01 :A:-VAR-A2     PIC X.
  COPY XYZ REPLACING ==:A:== BY ==B==.

и

COBPYOOK XYZ

  01 :A:-VAR-X1     PIC X.
  01 :A:-VAR-X2     PIC X.

Вложение в COPYBOOK ABC недопустимо, поскольку оно содержит фразу REPLACING.

Однако вы можете сделать следующее.Удалите RELACING из COPYBOOK ABC, чтобы он стал:

COPYBOOK ABC

  01 :A:-VAR-A1     PIC X.
  01 :A:-VAR-A2     PIC X.
  COPY XYZ.

Теперь включите COPYBOOK ABC в исходную программу следующим образом:

  REPLACE ==:A:== BY ==B==.
  COPY ABC.
  REPLACE OFF.

Директива REPLACE вызывает замену всех вхождений :A: на B до тех пор, пока не встретится директива REPLACE OFF, и эти замены происходят после того, как все директивы COPY были выполнены.Чистый результат приведенных выше утверждений будет следующим:

  01 B-VAR-A1     PIC X.    <== from ABC
  01 B-VAR-A2     PIC X.    <== from ABC
  01 B-VAR-X1     PIC X.    <== Nested copy of XYZ from ABC
  01 B-VAR-X2     PIC X.    <== Nested copy of XYZ from ABC

Это единственный «законный» способ выполнения замены вложенных тетрадей в COBOL, о котором мне известно.

1 голос
/ 01 ноября 2012

Хотя ответ Нила может быть правильным для варианта Cobol, который он и OP используют, стоит отметить, что некоторые компиляторы Cobol будут разрешать вложенные COPY ... REPLACING операторы.

Действительно, мыу меня есть много случаев, когда мы используем это в нашем коде.

Например, у меня есть много программ модуля Cobol, которые включают копимбер следующим образом:

COPY 'uwxxxxsel.prg' REPLACING
             LEADING "xxxxSEL" BY "AREASEL".

и 'uwxxxxsel.prg'copymember содержит следующий COPY другого файла следующим образом:

COPY 'uwf8list.prg'
       REPLACING LEADING 'XXXXXX-F8-' BY 'SELECT-F8-'
                 ==FUNCTION-KEY== BY ==F8-FUNCTION-KEY==.

, и это прекрасно работает.

Я использую это как своего рода структуру "наследования" для общей функциональности.

Есть одна ошибка с нашим компилятором.Более высокий уровень REPLACING не продолжается после вложенного REPLACING, но пока вложенный REPLACING является последним в копировальном элементе, все в порядке.

...