1. Процедура ввода может состоять из любой процедуры вы­борки, модификации или копирования записей, которые становят­ся доступными, посредством оператора RELEASE (ПЕРЕДАТЬ) для файла, представленного именем-файла-1. Область действия такой процедуры включает все операторы, выполняющиеся в ре­зультате передачи управления по операторам CALL (ВЫЗВАТЬ), EXIT (ВЫЙТИ), GO ТО (ПЕРЕЙТИ) и PERFORM (ВЫПОЛ­НИТЬ), находящимся в области действия процедуры ввода, а так­же все операторы декларативных процедур, выполняющихся в результате выполнения операторов, находящихся в области дей­ствия процедуры ввода. В области действия процедуры ввода не должны выполняться операторы MERGE (СЛИТЬ), RETURN (ВЕРНУТЬ) или SORT (СОРТИРОВАТЬ) (см. ч. 4, п. 4.4).

  2. Если процедура ввода определена, то управление переда­ется ей до того как файл, представленный именем-файла-1, будет упорядочен оператором SORT (СОРТИРОВАТЬ). Компилятор встраивает механизм возврата в конец последнего оператора про­цедуры ввода. Когда управление достигает последнего оператора в процедуре ввода, то записи, которые были переданы для файла, представленного именем-файла-1, сортируются.

  3. Если указана фраза USING (ИСПОЛЬЗУЯ), все записи файла (файлов), представленных именем-файла-2, передаются файлу, представленному именем-файла-1. Для каждого файла, представленного именем-файла-2, выполнение оператора SORT (СОРТИРОВАТЬ) приводит к следующим действиям:

  1. инициируется обработка файла, которая происходит так, как будто выполняется оператор OPEN (ОТКРЫТЬ) с фразой INPUT (ВХОДНОЙ);

  2. логические записи извлекаются и передаются операции сор­тировки, причем каждая запись извлекается так, как если бы вы­полнился оператор READ (ЧИТАТЬ) с фразами NEXT (СЛЕДУ­ЮЩУЮ) и AT END (В КОНЦЕ). Для файла с относительной ор­ганизацией, не указанного именем-файла-2 во фразе GIVING (ПО­ЛУЧАЯ), значение данного, являющегося относительным клю­чом, после выполнения оператора SORT (СОРТИРОВАТЬ) не оп­ределено;

обработка файла завершается так, как если бы был выпол­нен оператор CLOSE (ЗАКРЫТЬ) без каких-либо необязательныхфраз. Это завершение выполняется до сортировки файла, пред­ставленного именем-файла-1 в операторе SORT (СОРТИРО­ВАТЬ).

Эти неявные функции выполняются таким образом, что выпол­няются и соответствующие процедуры USE AFTER EXCEPTION/ ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ОШИБКИ); однако испол­нение таких процедур не должно приводить к выполнению каких- либо операторов, обрабатывающих файл, представленный именем- файла-2, либо осуществляющих доступ к области записи, соответ­ствующей имени-файла-2.

  1. Процедура вывода может состоять из любых процедур вы­борки, модификации или копирования записей, которые поочеред­но становятся доступными в отсортированном порядке из файла, представленного именем-файла-1 посредством оператора RETURN (ВЕРНУТЬ). Область действия таких процедур включает все операторы, выполняющиеся в результате передачи управления по операторам CALL (ВЫЗВАТЬ), EXIT (ВЫЙТИ), GO ТО (ПЕ­РЕЙТИ) и PERFORM (ВЫПОЛНИТЬ) в области действия про­цедуры вывода, а также все операторы декларативных процедур, выполняющихся в результате выполнения операторов, находящих­ся в области действия процедуры вывода. В области действия про­цедуры вывода не должны находиться операторы MERGE (СЛИТЬ), RELEASE (ПЕРЕДАТЬ), SORT (СОРТИРОВАТЬ) (см. ч. 4, п. 4.4).

  2. Если процедура вывода определена, то управление пере­дается ей после упорядочения файла, представленного именем- файла-1, оператором SORT (СОРТИРОВАТЬ). Компилятор встраивает механизм возврата в конец последнего оператора про­цедуры вывода, и когда управление достигает последнего операто­ра процедуры вывода, механизм возврата обеспечивает заверше­ние сортировки, и затем управление передается следующему после оператора SORT (СОРТИРОВАТЬ) выполнимому оператору. Про­цедура вывода получает управление, когда все записи отсортиро­ваны. Операторы RETURN (ВЕРНУТЬ) в процедуре вывода яв­ляются запросами на получение следующей записи.

  3. Если указана фраза GIVING (ПОЛУЧАЯ), выполняется неявная процедура вывода, в результате которой все отсортирован­ные записи записываются в файл, представленный именем-фай- ла-3. Для всех файлов, представленных именем-файла-3, выпол­нение оператора SORT (СОРТИРОВАТЬ) приводит к следующим действиям:

  1. обработка файла инициируется так, как будто бы выполнен оператор OPEN (ОТКРЫТЬ) с фразой OUTPUT (ВЫХОДНОЙ). Эта инициация выполняется после выполнения всех процедур ввода;

  2. отсортированные логические записи возвращаются и запи­сываются в файл так, как будто выполняется оператор WRITE (ПИСАТЬ) без каких-либо необязательных фраз; для файла с от­носительной организацией данное, являющееся относительным ключом, для первой возвращенной записи принимает значение 1, для второй — значение 2 и т. д.

После выполнения оператора SORT (СОРТИРОВАТЬ) содер­жимое данного, являющегося относительным ключом, указывает на последнюю возвращенную в файл запись;

  1. обработка файла завершается так, как будто был выполнен оператор CLOSE (ЗАКРЫТЬ) без каких-либо необязательных фраз.

Эти неявные функции выполняются так, что выполняются и со­ответствующие процедуры USE AFTER EXCEPTION/ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), однако исполнение таких процедур не должно приводить к выполнению каких-либо операторов, обрабатывающих файл, представленный именем-файла-3, либо осуществляющих доступ к области записи, соответствующей имени-файла-3. При первой попытке записи за пределами внешне определенных границ выполняется процедупа USE AFTER STANDARD EXCEPTION/ERROR (ИСПОЛЬЗО­ВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ), ука­занная для файла; если управление возвращается из такой проце­дуры или такая процедура не указана, обработка файла заверша­ется, как указано выше в п. 12в.

  1. Если файл, представленный именем-файла-3, содержит только записи фиксированной длины, записи файла, представ­ленного именем-файла-1, содержащие меньше позиций литер, чем запись фиксированной длины, при возвращении записи в файл, представленный именем-файла-3, дополняются пробелами справа, начиная с первой позиции литеры после последней литеры в записи.

  2. В программах, содержащих оператор SORT (СОРТИ­РОВАТЬ), может применяться сегментация (ч. 16). Однако име­ют место следующие ограничения:

  1. если оператор SORT (СОРТИРОВАТЬ) указан в секции, ко­торая не является независимым сегментом, то любые процедуры ввода или вывода, указанные оператором SORT (СОРТИРОВАТЬ), должны быть указаны либо вне независимых сегментов, либо цели­ком содержаться в одном независимом сегменте;

если оператор SORT (СОРТИРОВАТЬ) указан в независи­мом сегменте, то любые процедуры ввода или вывода, на которые ссылается оператор SORT (СОРТИРОВАТЬ), должны содержать­ся либо полностью вне независимых сегментов, либо целиком в том же независимом сегменте, что и оператор SORT (СОРТИРО­ВАТЬ).Часть 12. МОДУЛЬ ОБРАБОТКИ ИСХОДНЫХ ТЕКСТОВ

  1. ВВЕДЕНИЕ В МОДУЛЬ ОБРАБОТКИ ИСХОДНЫХ ТЕКСТОВ

    1. Назначение

Модуль обработки исходных текстов содержит оператор COPY (КОПИРОВАТЬ) I и оператор REPLACE (ЗАМЕНИТЬ) | . Каж­дый из этих операторов может функционировать независимо от другого или в сочетании с другим для обеспечения возможности вставлять или заменять текст исходной программы в процессе компиляции исходной программы.

Тексты, которые становятся доступными компилятору во время компиляции, содержатся в библиотеках Кобола. Эффект интерпре­тации оператора COPY (КОПИРОВАТЬ) состоит в генерации тек­ста из библиотечного текста, который рассматривается компилято­ром как часть исходной программы.

Кроме того, исходные программы Кобола могут быть написаны в определяемой программистом нотации, которая может быть прев­ращена во время компиляции в синтаксически правильные фразы и операторы, ) Эффект интерпретации оператора REPLACE (ЗАМЕНИТЬ) состоит в замене текста, появляющегося в исход­ной программе, новым текстом, который рассматривается компи­лятором как часть исходной программы.

  1. Характеристика уровней

Уровень 1 обработки исходных текстов обеспечивает возмож­ность копирования в исходную программу текста из единственной библиотеки. Текст копируется из библиотеки без изменений.

Уровень 2 обработки исходных текстов обеспечивает допол­нительную возможность замены в процессе копирования всех по­явлений указанного литерала, идентификатора, слова или груп­пы слов в библиотечном тексте другим текстом. Уровень 2 обес­печивает также возможности использования во время компиля­ции нескольких библиотек Кобола и замены текста, появляюще- гося в исходной программе, новым текстом.

  1. ОПЕРАТОР COPY (КОПИРОВАТЬ)

    1. Назначение

Оператор COPY (КОПИРОВАТЬ) включает текст в исходную программу Кобола

  1. .Общий формат

= = псевдотекст-2 = = идентификатор-2 литерал-2

слово-2


I IfF] имя"библиотеки-!

= = псевдотекст-1 = = идентификатор-!

литерал-1

слово-!


REPLACING


COPY имя-текста-1



[ИЗ имя-библиотеки-1]


КОПИРОВАТЬ имя-текста-1



=

ЗАМЕНЯЯ

= псевдотекст-1 = = идентификатор-!

литерал-1

слово-1

=

НА

= псевдотекст-2 = = идентификатор-2 литерал^

слово-2

  1. Синтаксические правила

  1. I Если во время компиляции доступна более чем одна библиотека Кобола, имя-текста-1 должно уточняться именем- библиотеки-1, идентифицирующим библиотеку Кобола, в кото- рой находится текст, соответствующий имени-текста-1.

В одной библиотеке Кобола каждое имя-текста должно быть уникальным (однозначным).

  1. Оператору COPY (КОПИРОВАТЬ) должен предшество­вать пробел. Оператор COPY (КОПИРОВАТЬ) должен заканчи- ваться разделителем точка.

(3)

Псевдотекст-1

должен содержать одно

или

несколько

слов текста.

(4) Псевдотекст-2

может содержать одно

или

несколько

слов текста или не содержать слов текста.



  1. Строка-литер в псевдотексте-1 и псевдотексте-2 может быть продолжена на следующей строке (см. ч. 4, п. 7.2.5).

  2. Слово-1 и слово-2 могут быть любым одиночным словом Кобола, кроме COPY (КОПИРОВАТЬ).

  3. Оператор COPY (КОПИРОВАТЬ) может быть указан в исходной программе всюду, где может появиться строка-литер или разделитель, отличный от закрывающего знака «кавычки», за ис­ключением самого оператора COPY (КОПИРОВАТЬ), внутри ко­торого оператор COPY (КОПИРОВАТЬ) не может появляться.

  4. Реализация должна допускать длину слова текста or 1 до 322 литер в псевдотексте и библиотечном тексте.

  5. Псевдотекст-1 не должен состоять только из разделителя Г запятая или разделителя точка с запятой.

  6. Если слово COPY (КОПИРОВАТЬ) появляется в статье- комментарии или в том месте, где статья-комментарий может по­явиться, оно рассматривается как часть статьи-комментария.

  1. Общие правила

  1. Компиляция исходной программы, содержащей операторы COPY (КОПИРОВАТЬ), логически эквивалентна обработке веек операторов COPY (КОПИРОВАТЬ) до обработки результирую­щей исходной программы.

  2. Эффект обработки оператора COPY (КОПИРОВАТЬ) сос­тоит в том, что библиотечный текст, связанный с именем-текста-1, копируется в исходную программу, логически заменяя весь опера­тор COPY (КОПИРОВАТЬ), начиная с зарезервированного слова COPY (КОПИРОВАТЬ) и кончая литерой пунктуации точка вклю­чительно.

  3. Если вариант REPLACING (ЗАМЕНЯЯ) не указан, | библиотечный текст копируется без изменений.

Если вариант указан, библиотечный текст копируется и каж­дое сравнившееся вхождение псевдотекста-1, идентификатора-1, слова-1 или литерала-1 в библиотечном тексте заменяется соот­ветствующим псевдотекстом-2, идентификатором-2, словом-2 или литералом-2.

  1. Для целей сравнения идентификатор-1, слово-1 и лите­рал-1 рассматриваются как псевдотекст, содержащий, соответ­ственно, только идентификатор-1, слово-1 или литерал-1.

  2. Операция сравнения для определения замены текста вы­полняется следующим образом.

Самое левое слово библиотечного текста, которое не являет­ся разделителем запятая или разделителем точка с запятой, яв- ляется первым словом текста, используемым для сравнения. Лю

­бое слово текста или пробел, предшествующий этому слову тек­ста, копируется в исходную программу. Начиная с первого слова текста, выбранного для сравнения, и первого псевдотекста-1, идентификатора-1, слова-1 или литерала-1, который был указан в варианте REPLACING (ЗАМЕНЯЯ) весь операнд варианта REPLACING (ЗАМЕНЯЯ), который предшествует слову BY (НА), сравнивается с эквивалентным количеством последова­тельных слов библиотечного текста.

Псевдотекст-1, идентификатор-1, слово-1 или литерал-1 сов­падают с библиотечным текстом тогда и только тогда, когда упо­рядоченная последовательность слов текста, которые образуют псевдотекст-1, идентификатор-1, слово-1 или литерал-1, равна символ за символом упорядоченной последовательности слов библиотечного текста. При сопоставлении каждое вхождение разделителя запятая, точка с запятой или пробел в псевдотек­сте-1 или в библиотечном тексте рассматривается как один про­бел. Любая последовательность из одного или нескольких раз­делителей пробел рассматривается как один пробел.

Если совпадение не имеет места, сравнение повторяется с каждым следующим последовательным псевдотекстом-1, иден­тификатором-!, словом-1 или литералом-1, если они указаны, в варианте REPLACING (ЗАМЕНЯЯ), до тех пор пока1 не будет обнаружено совпадение или не останется ни одного следующего последовательного операнда REPLACING (ЗАМЕНЯЯ).