Процедура ввода может состоять из любой процедуры выборки, модификации или копирования записей, которые становятся доступными, посредством оператора RELEASE (ПЕРЕДАТЬ) для файла, представленного именем-файла-1. Область действия такой процедуры включает все операторы, выполняющиеся в результате передачи управления по операторам CALL (ВЫЗВАТЬ), EXIT (ВЫЙТИ), GO ТО (ПЕРЕЙТИ) и PERFORM (ВЫПОЛНИТЬ), находящимся в области действия процедуры ввода, а также все операторы декларативных процедур, выполняющихся в результате выполнения операторов, находящихся в области действия процедуры ввода. В области действия процедуры ввода не должны выполняться операторы MERGE (СЛИТЬ), RETURN (ВЕРНУТЬ) или SORT (СОРТИРОВАТЬ) (см. ч. 4, п. 4.4).
Если процедура ввода определена, то управление передается ей до того как файл, представленный именем-файла-1, будет упорядочен оператором SORT (СОРТИРОВАТЬ). Компилятор встраивает механизм возврата в конец последнего оператора процедуры ввода. Когда управление достигает последнего оператора в процедуре ввода, то записи, которые были переданы для файла, представленного именем-файла-1, сортируются.
Если указана фраза USING (ИСПОЛЬЗУЯ), все записи файла (файлов), представленных именем-файла-2, передаются файлу, представленному именем-файла-1. Для каждого файла, представленного именем-файла-2, выполнение оператора SORT (СОРТИРОВАТЬ) приводит к следующим действиям:
инициируется обработка файла, которая происходит так, как будто выполняется оператор OPEN (ОТКРЫТЬ) с фразой INPUT (ВХОДНОЙ);
логические записи извлекаются и передаются операции сортировки, причем каждая запись извлекается так, как если бы выполнился оператор READ (ЧИТАТЬ) с фразами NEXT (СЛЕДУЮЩУЮ) и AT END (В КОНЦЕ). Для файла с относительной организацией, не указанного именем-файла-2 во фразе GIVING (ПОЛУЧАЯ), значение данного, являющегося относительным ключом, после выполнения оператора SORT (СОРТИРОВАТЬ) не определено;
обработка файла завершается так, как если бы был выполнен оператор CLOSE (ЗАКРЫТЬ) без каких-либо необязательныхфраз. Это завершение выполняется до сортировки файла, представленного именем-файла-1 в операторе SORT (СОРТИРОВАТЬ).
Эти неявные функции выполняются таким образом, что выполняются и соответствующие процедуры USE AFTER EXCEPTION/ ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ОШИБКИ); однако исполнение таких процедур не должно приводить к выполнению каких- либо операторов, обрабатывающих файл, представленный именем- файла-2, либо осуществляющих доступ к области записи, соответствующей имени-файла-2.
Процедура вывода может состоять из любых процедур выборки, модификации или копирования записей, которые поочередно становятся доступными в отсортированном порядке из файла, представленного именем-файла-1 посредством оператора RETURN (ВЕРНУТЬ). Область действия таких процедур включает все операторы, выполняющиеся в результате передачи управления по операторам CALL (ВЫЗВАТЬ), EXIT (ВЫЙТИ), GO ТО (ПЕРЕЙТИ) и PERFORM (ВЫПОЛНИТЬ) в области действия процедуры вывода, а также все операторы декларативных процедур, выполняющихся в результате выполнения операторов, находящихся в области действия процедуры вывода. В области действия процедуры вывода не должны находиться операторы MERGE (СЛИТЬ), RELEASE (ПЕРЕДАТЬ), SORT (СОРТИРОВАТЬ) (см. ч. 4, п. 4.4).
Если процедура вывода определена, то управление передается ей после упорядочения файла, представленного именем- файла-1, оператором SORT (СОРТИРОВАТЬ). Компилятор встраивает механизм возврата в конец последнего оператора процедуры вывода, и когда управление достигает последнего оператора процедуры вывода, механизм возврата обеспечивает завершение сортировки, и затем управление передается следующему после оператора SORT (СОРТИРОВАТЬ) выполнимому оператору. Процедура вывода получает управление, когда все записи отсортированы. Операторы RETURN (ВЕРНУТЬ) в процедуре вывода являются запросами на получение следующей записи.
Если указана фраза GIVING (ПОЛУЧАЯ), выполняется неявная процедура вывода, в результате которой все отсортированные записи записываются в файл, представленный именем-фай- ла-3. Для всех файлов, представленных именем-файла-3, выполнение оператора SORT (СОРТИРОВАТЬ) приводит к следующим действиям:
обработка файла инициируется так, как будто бы выполнен оператор OPEN (ОТКРЫТЬ) с фразой OUTPUT (ВЫХОДНОЙ). Эта инициация выполняется после выполнения всех процедур ввода;
отсортированные логические записи возвращаются и записываются в файл так, как будто выполняется оператор WRITE (ПИСАТЬ) без каких-либо необязательных фраз; для файла с относительной организацией данное, являющееся относительным ключом, для первой возвращенной записи принимает значение 1, для второй — значение 2 и т. д.
После выполнения оператора SORT (СОРТИРОВАТЬ) содержимое данного, являющегося относительным ключом, указывает на последнюю возвращенную в файл запись;
обработка файла завершается так, как будто был выполнен оператор CLOSE (ЗАКРЫТЬ) без каких-либо необязательных фраз.
Эти неявные функции выполняются так, что выполняются и соответствующие процедуры USE AFTER EXCEPTION/ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ ПРОЦЕДУРЫ ОШИБКИ), однако исполнение таких процедур не должно приводить к выполнению каких-либо операторов, обрабатывающих файл, представленный именем-файла-3, либо осуществляющих доступ к области записи, соответствующей имени-файла-3. При первой попытке записи за пределами внешне определенных границ выполняется процедупа USE AFTER STANDARD EXCEPTION/ERROR (ИСПОЛЬЗОВАТЬ ПОСЛЕ СТАНДАРТНОЙ ПРОЦЕДУРЫ ОШИБКИ), указанная для файла; если управление возвращается из такой процедуры или такая процедура не указана, обработка файла завершается, как указано выше в п. 12в.
Если файл, представленный именем-файла-3, содержит только записи фиксированной длины, записи файла, представленного именем-файла-1, содержащие меньше позиций литер, чем запись фиксированной длины, при возвращении записи в файл, представленный именем-файла-3, дополняются пробелами справа, начиная с первой позиции литеры после последней литеры в записи.
В программах, содержащих оператор SORT (СОРТИРОВАТЬ), может применяться сегментация (ч. 16). Однако имеют место следующие ограничения:
если оператор SORT (СОРТИРОВАТЬ) указан в секции, которая не является независимым сегментом, то любые процедуры ввода или вывода, указанные оператором SORT (СОРТИРОВАТЬ), должны быть указаны либо вне независимых сегментов, либо целиком содержаться в одном независимом сегменте;
если оператор SORT (СОРТИРОВАТЬ) указан в независимом сегменте, то любые процедуры ввода или вывода, на которые ссылается оператор SORT (СОРТИРОВАТЬ), должны содержаться либо полностью вне независимых сегментов, либо целиком в том же независимом сегменте, что и оператор SORT (СОРТИРОВАТЬ).Часть 12. МОДУЛЬ ОБРАБОТКИ ИСХОДНЫХ ТЕКСТОВ
ВВЕДЕНИЕ В МОДУЛЬ ОБРАБОТКИ ИСХОДНЫХ ТЕКСТОВ
Назначение
Модуль обработки исходных текстов содержит оператор COPY (КОПИРОВАТЬ) I и оператор REPLACE (ЗАМЕНИТЬ) | . Каждый из этих операторов может функционировать независимо от другого или в сочетании с другим для обеспечения возможности вставлять или заменять текст исходной программы в процессе компиляции исходной программы.
Тексты, которые становятся доступными компилятору во время компиляции, содержатся в библиотеках Кобола. Эффект интерпретации оператора COPY (КОПИРОВАТЬ) состоит в генерации текста из библиотечного текста, который рассматривается компилятором как часть исходной программы.
Кроме того, исходные программы Кобола могут быть написаны в определяемой программистом нотации, которая может быть превращена во время компиляции в синтаксически правильные фразы и операторы, ) Эффект интерпретации оператора REPLACE (ЗАМЕНИТЬ) состоит в замене текста, появляющегося в исходной программе, новым текстом, который рассматривается компилятором как часть исходной программы.
Характеристика уровней
Уровень 1 обработки исходных текстов обеспечивает возможность копирования в исходную программу текста из единственной библиотеки. Текст копируется из библиотеки без изменений.
Уровень 2 обработки исходных текстов обеспечивает дополнительную возможность замены в процессе копирования всех появлений указанного литерала, идентификатора, слова или группы слов в библиотечном тексте другим текстом. Уровень 2 обеспечивает также возможности использования во время компиляции нескольких библиотек Кобола и замены текста, появляюще- гося в исходной программе, новым текстом.
ОПЕРАТОР COPY (КОПИРОВАТЬ)
Назначение
Оператор COPY (КОПИРОВАТЬ) включает текст в исходную программу Кобола
.Общий формат
= = псевдотекст-2 = = идентификатор-2 литерал-2
слово-2
I IfF] имя"библиотеки-!
= = псевдотекст-1 = = идентификатор-!
литерал-1
слово-!
REPLACING
COPY имя-текста-1
[ИЗ имя-библиотеки-1]
КОПИРОВАТЬ имя-текста-1
=
ЗАМЕНЯЯ
= псевдотекст-1 = = идентификатор-!литерал-1
слово-1
=
НА
= псевдотекст-2 = = идентификатор-2 литерал^слово-2
Синтаксические правила
I Если во время компиляции доступна более чем одна библиотека Кобола, имя-текста-1 должно уточняться именем- библиотеки-1, идентифицирующим библиотеку Кобола, в кото- рой находится текст, соответствующий имени-текста-1.
В одной библиотеке Кобола каждое имя-текста должно быть уникальным (однозначным).
Оператору COPY (КОПИРОВАТЬ) должен предшествовать пробел. Оператор COPY (КОПИРОВАТЬ) должен заканчи- ваться разделителем точка.
(3) |
Псевдотекст-1 |
должен содержать одно |
или |
несколько |
|||
слов текста. (4) Псевдотекст-2 |
может содержать одно |
или |
несколько |
||||
слов текста или не содержать слов текста. |
|
|
Строка-литер в псевдотексте-1 и псевдотексте-2 может быть продолжена на следующей строке (см. ч. 4, п. 7.2.5).
Слово-1 и слово-2 могут быть любым одиночным словом Кобола, кроме COPY (КОПИРОВАТЬ).
Оператор COPY (КОПИРОВАТЬ) может быть указан в исходной программе всюду, где может появиться строка-литер или разделитель, отличный от закрывающего знака «кавычки», за исключением самого оператора COPY (КОПИРОВАТЬ), внутри которого оператор COPY (КОПИРОВАТЬ) не может появляться.
Реализация должна допускать длину слова текста or 1 до 322 литер в псевдотексте и библиотечном тексте.
Псевдотекст-1 не должен состоять только из разделителя Г запятая или разделителя точка с запятой.
Если слово COPY (КОПИРОВАТЬ) появляется в статье- комментарии или в том месте, где статья-комментарий может появиться, оно рассматривается как часть статьи-комментария.
Общие правила
Компиляция исходной программы, содержащей операторы COPY (КОПИРОВАТЬ), логически эквивалентна обработке веек операторов COPY (КОПИРОВАТЬ) до обработки результирующей исходной программы.
Эффект обработки оператора COPY (КОПИРОВАТЬ) состоит в том, что библиотечный текст, связанный с именем-текста-1, копируется в исходную программу, логически заменяя весь оператор COPY (КОПИРОВАТЬ), начиная с зарезервированного слова COPY (КОПИРОВАТЬ) и кончая литерой пунктуации точка включительно.
Если вариант REPLACING (ЗАМЕНЯЯ) не указан, | библиотечный текст копируется без изменений.
Если вариант указан, библиотечный текст копируется и каждое сравнившееся вхождение псевдотекста-1, идентификатора-1, слова-1 или литерала-1 в библиотечном тексте заменяется соответствующим псевдотекстом-2, идентификатором-2, словом-2 или литералом-2.
Для целей сравнения идентификатор-1, слово-1 и литерал-1 рассматриваются как псевдотекст, содержащий, соответственно, только идентификатор-1, слово-1 или литерал-1.
Операция сравнения для определения замены текста выполняется следующим образом.
Самое левое слово библиотечного текста, которое не является разделителем запятая или разделителем точка с запятой, яв- ляется первым словом текста, используемым для сравнения. Лю
бое слово текста или пробел, предшествующий этому слову текста, копируется в исходную программу. Начиная с первого слова текста, выбранного для сравнения, и первого псевдотекста-1, идентификатора-1, слова-1 или литерала-1, который был указан в варианте REPLACING (ЗАМЕНЯЯ) весь операнд варианта REPLACING (ЗАМЕНЯЯ), который предшествует слову BY (НА), сравнивается с эквивалентным количеством последовательных слов библиотечного текста.
Псевдотекст-1, идентификатор-1, слово-1 или литерал-1 совпадают с библиотечным текстом тогда и только тогда, когда упорядоченная последовательность слов текста, которые образуют псевдотекст-1, идентификатор-1, слово-1 или литерал-1, равна символ за символом упорядоченной последовательности слов библиотечного текста. При сопоставлении каждое вхождение разделителя запятая, точка с запятой или пробел в псевдотексте-1 или в библиотечном тексте рассматривается как один пробел. Любая последовательность из одного или нескольких разделителей пробел рассматривается как один пробел.
Если совпадение не имеет места, сравнение повторяется с каждым следующим последовательным псевдотекстом-1, идентификатором-!, словом-1 или литералом-1, если они указаны, в варианте REPLACING (ЗАМЕНЯЯ), до тех пор пока1 не будет обнаружено совпадение или не останется ни одного следующего последовательного операнда REPLACING (ЗАМЕНЯЯ).