Общие правила
Идентификатор-1 и литерал-1 представляют собой пересылаемые данные, а идентификатор-3 — принимающее данное.
Литерал-2 и значение данного, представленного идентификатором-2, указывают одну или несколько литер, ограничивающих перемещение. Если используется фраза SIZE (РАЗМЕРОМ), данные, определенные идентификатором-1 или литералом-1, помещаются полностью. Если в качестве ограничителя используется стандартная константа, она представляет нечисловой литерал длиной в одну литеру.
Если вместо литерала-1 и литерала-2 используется стандартная константа, то она представляет данное длиной в одну литеру с использованием DISPLAY (ДЛЯ ВЫДАЧИ).
Перемещение данного при выполнении оператора STRING (СОБРАТЬ) определяется следующими правилами:
литеры из литерала-1 или из значения данного, представляемого идентификатором-1, передаются в данное, представляемое идентификатором-3, согласно правилам перемещения буквенно-цифрового в буквенно-цифровое данное, однако дополнение пробелами не производится;
если задана фраза DELIMITED (ОГРАНИЧИВАЯСЬ) без фразы SIZE (РАЗМЕРОМ), значение данного, представляемого идентификатором-1, или значение литерала-1 передается в принимающее данное в последовательности, заданной оператором STRING (СОБРАТЬ), начиная с самой левой литеры и продолжая слева направо, пока не будет достигнут конец данного или не встретится литера (литеры), заданная литералом-2 или значением данного, представленного идентификатором-2. Эта литера (литеры) не пересылается;
если задана фраза DELIMITED BY SIZE (ОГРАНИЧИВАЯСЬ РАЗМЕРОМ), значение, представленное литералом-1, или значение данного, представляемого идентификатором-1, передаются в последовательности, заданной оператором STRING (СОБРАТЬ), в данное, представляемое идентификатором-3, пока все данные не будут переданы или не будет достигнут конец данного, определяемого идентификатором-3.
Эти действия повторяются до исчерпания всех вхождений литер ала-1 или данных, представленных идентификатором-1.
Если задана фраза POINTER (УКАЗАТЕЛЬ), значение данного, представленного идентификатором-4, перед выполнением оператора STRING (СОБРАТЬ) должно быть установлено в начальное значение (не меньше 1).
Если фраза POINTER (УКАЗАТЕЛЬ) не задана, оператор выполняется так, как если бы было задано начальное значение данного, представленного идентификатором-4, равное 1.
Когда литеры пересылаются в принимающее данное, на которое ссылается идентификатор-3, пересылка литер в принимающее данное начинается от указанной значением данного, представленного идентификатором-4, позиции литеры этого данного (при условии, что значение данного, представленного идентификатором-4, не превышает длины данного, представленного идентификатором-3) и затем данное, представленное идентифи- катором-4, увеличивается на единицу перед пересылкой каждой литеры или перед завершением выполнения оператора STRING (СОБРАТЬ). Значение данного, представленного идентификатором-4, во время выполнения оператора STRING (СОБРАТЬ) изменяется только вышеописанным методом.
В результате выполнения оператора STRING (СОБРАТЬ) изменяется только та часть данного, представленного идентификатором-3, к которой было обращение во время выполнения оператора STRING (СОБРАТЬ). Оставшаяся часть данного, представленного идентификатором-3, после выполнения оператора STRING (СОБРАТЬ) не изменяется.
Перед каждой пересылкой литеры в данное, представленное идентификатором-3, если значение данного, представленного идентификатором-4, окажется меньшим 1 либо превзойдет число позиций литер в данном, представляемом идентификатором-3, дальнейшее перемещение в данное, представляемое идентификатором-3, прекращается и фраза NOT ON OVERFLOW (БЕЗ ПЕРЕПОЛНЕНИЯ), если она указана, игнорируется, а управление передается на конец оператора STRING (СОБРАТЬ). Если в формате оператора указана фраза ON OVERFLOW (ПРИ ПЕРЕПОЛНЕНИИ), то выполняется пове- лительный-оператор-1, указанный в этой фразе. Если управление передается повелительному-оператору-1, выполнение продолжается согласно правилам для каждого оператора, указанного в повелительном-операторе-1. Если выполняется оператор ветвления процедур или условный оператор, вызывающий явную передачу управления, то управление передается согласно правилам для этих операторов; в противном случае по завершении выполнения повелительного-оператора-1 управление передается на конец оператора STRING (СОБРАТЬ).
Если во время выполнения оператора STRING (СОБРАТЬ) с фразой NOT ON OVERFLOW (БЕЗ ПЕРЕПОЛНЕНИЯ) условия, описанные в общем правиле (9), не встречаются, после пересылки данных согласно другим общим правилам фраза ON OVERFLOW (ПРИ ПЕРЕПОЛНЕНИИ), если она указана, игнорируется и управление передается на конец оператора STRING (СОБРАТЬ), или, если указана фраза NOT ON OVERFLOW (БЕЗ ПЕРЕПОЛНЕНИЯ), повелительному-опера- тору-2. Если управление передается повелительному-операто- ру-2, выполнение продолжается согласно правилам для операторов, указанных в повелительном-операторе-2. Если выполняется ветвление процедуры или условный оператор, ведущий к явной передаче управления, управление передается в соответствии с правилами для этого оператора; в противном случае после завершения выполнения повелительного-оператора-2 управление передается на конец оператора STRING (СОБРАТЬ).
(И) Фраза END-STRING (КОНЕЦ-СОБРАТЬ) ограничивает область действия оператора STRING (СОБРАТЬ) (см. ч. 4, п. 6.4.3).
Если идентификатор-1 и идентификатор-2 занимают ту же область памяти, что и идентификатор-3 и идентификатор-4, или идентификатор-3 и идентификатор-4 занимают одну и ту же область памяти, результат выполнения оператора STRING (СОБРАТЬ) не определен, даже если они определены одной и той же статьей описания данных (см. п. 6.4,5 настоящей части).
Оператор SUBTRACT (ОТНЯТЬ)
Назначение
Оператор SUBTRACT (ОТНЯТЬ) используется для того, чтобы вычесть одно числовое данное или сумму двух или более числовых данных из одного или более данных и установить значения одного или более данных равными результату.
Общий формат
Формат 1
SUBTRACT f иДентиФикатор-1 j FROM {идентификатор-2
[ литерал-1 J
[ROUNDED]}...
[ON SIZE ERROR повелительный-оператор-1 ]
[NOT ON SIZE ERROR повелительный-оператор-2]
[END-SUBTRACT]
отнять |литерал1
[ идентификатор-1 J
ОТ {идентификатор-2 [ОКРУГЛЯЯ]} . ■ •
[ПРИ ПЕРЕПОЛНЕНИИ повелительный-оператор-1 ]
[БЕЗ ПЕРЕПОЛНЕНИЯ повелительный-оператор-2]
[КОНЕЦ-ОТНЯТЬ]
Формат 2
SUBTRACT І «ектвфикатор-1 ] FROM | »Д<="иф.»<атор.2
[литерал-1 j [литерал-2
GIVING {идентификатор-3 [ROUNDED]} ...
[ON SIZE ERROR повелительный-оператор-1]
[NOT ON SIZE ERROR повелительный-оператор-2]
[END-SUBTRACT]
ОТНЯТЬ литерал-1 1 ОТ < литерал-2 ]
[ идентификатор-1 | ' [ идентификатор-2 J ПОЛУЧАЯ {идентификатор-3 [ОКРУГЛЯЯ]}...
[ПРИ ПЕРЕПОЛНЕНИИ повелительный-оператор-1]
[БЕЗ ПЕРЕПОЛНЕНИЯ повелительный-оператор-2]
[КОНЕЦ-ОТНЯТЬ]
Формат 3
сттптплгт (CORRESPONDING 1 , ,
SUBTRACT {-лхРЕ> 1 идентификатор-1
I СОКК I
FROM, идентификатор-2 [ROUNDED]
[ON SIZE ERROR повелительный-оператор-1]
[NOT ON SIZE ERROR повелительный-оператор-2]
[END-SUBTRACT]птідати f СООТВЕТСТВЕННО 1
ОТНЯТЬ I } идентификатор-!
ОТ идентификатор-2 [ОКРУГЛЯЯ]
[ПРИ ПЕРЕПОЛНЕНИИ повелительный-оператор-1]
[БЕЗ ПЕРЕПОЛНЕНИЯ повелительный-оператор-2]
[КОНЕЦ-ОТНЯТЬ]
Синтаксические правила
Каждый идентификатор должен представлять числовое элементарное данное, исключая формат 2, в котором идентификатор, указанный справа от слова GIVING (ПОЛУЧАЯ), должен отно-. ситься к числовому или к числовому редактируемому данному, и формат 3, в котором каждый идентификатор должен относиться к групповому данному.
Каждый литерал должен быть числовым литералом.
Композиция операндов не должна содержать более восемнадцати цифр (см. п. 6.4.4 настоящей части). При этом в формате 1 композиция операндов определяется использованием всех операндов в заданном операторе; в формате 2 композиция операндов определяется использованием всех операндов в заданном операторе, исключая идентификаторы, которые следуют за словом GIVING (ПОЛУЧАЯ) ; в формате 3 композиция операндов оп- Іределяется отдельно для каждой пары соответствующих данных
CORR (СООТВ) есть сокращение слова CORRESPONDING (СООТВЕТСТВЕННО).
О б щ и е правила
В формате 1 значения операндов, предшествующие слову FROM (ОТ), складываются вместе, эта сумма сохраняется в про», межуточном данном. Значение этого промежуточного данного вычитается из значения данного, представленного идентификатором-2, причем результат запоминается как новое значение данного, представленного идентификатором-2; затем этот процесс повторяется для всех последующих вхождений идентификатора-2 в порядке слева направо.
В формате 2 все литералы и значения данных, представленные идентификаторами, предшествующими слову FROM (ОТ), складываются вместе и эта сумма вычитается из литерала-2 или значения данного, представленного идентификатором-2, после чего полученная разность запоминается как новое значение каждого данного, представленного идентификатором-3.
(3) Если используется формат 3, данные из группы, пред- |
||
ставленной |
идентификатором-1, |
вычитаются от соответствую- |
щих данных из группы, представленной идентификатором-2, и запоминаются в последних. |
(4) Отведение достаточного поля для выполнения вычислений без потери значащих цифр обеспечивается компилятором.
(5) Дополнительные правила и пояснения, относящиеся к этому оператору, приводятся в соответствующих параграфах (см. ч. 4, п. 6.4.3; ч. 6, пп. 6.4.1—6.4.6).
6.27. Оператор UNSTRING (РАЗОБРАТЬ) |
6.27.1. Назначение |
Оператор UNSTRING (РАЗОБРАТЬ) позволяет расчленить |
. данное, находящееся в пересылаемом поле, и поместить отдель- |
ные его части в несколько принимающих полей. |
6.27.2. О б щ и й формат |
UNSTRING идентификатор-1 |
DELIMITED BY [ALL] ( иДентиФикатоР-2 1 Г 0R [ALL] |
j идентификатор-3 111 |
[ литерал-2 J J J |
INTO {идентификатор-4 [DELIMITER IN идентификатор-5] |
[COUNT IN идентификатор-6]} ... |
[WITH POINTER идентификатор-7] |
[TALLYING IN идентификатор-8] |
[ON OVERFLOW повелительный-оператор-1] |
[NOT ON OVERFLOW повелительный-оператор-2] |
[END-UNSTRING] |
РАЗОБРАТЬ идентификатор-1 [ОГРАНИЧИВАЯСЬ [ВСЕМИ] |
J идентификатор-2 1[ИЛИ ^ВСЕМИ] |
[ литерал-1 ] |
І идентификатор-3 ] 1 1 |
[ литерал-2 J J |
В {идентификатор-4 [ОГРАНИЧИТЕЛЬ В идентифика- |
тор-5] |
[СЧЕТ В идентификатор-6]} ... |
[УКАЗАТЕЛЬ идентификатор-7]
[СЧИТАЯ В идентификатор-8]
[ПРИ ПЕРЕПОЛНЕНИИ повелительный-оператор-1 ]
[БЕЗ ПЕРЕПОЛНЕНИЯ повелительный-оператор-2]
[КОНЕЦ-РАЗОБРАТЬ]
С и н т а к с и ч е с к и е правила
Литерал-1 и литерал-2 должны быть нечисловыми литералами. Литералы могут быть стандартными константами, кроме начинающихся со слова ALL (ВСЕ).
Идентификатор-1, идентификатор-2, идентификатор-3 и идентификатор-5 должны быть определены явно или неявно как буквенно-цифровые данные.
Идентификатор-4 может быть задан как буквенное, буквенно-цифровое или числовое данное (причем в строке литер шаблона не должен использоваться символ Р(М)), описанное явно или неявно с использованием DISPLAY (ДЛЯ ВЫДАЧИ).
Идентификатор-6 и идентификатор-8 должны быть описаны как элементарные числовые целые, при этом символ Р (М) не может использоваться в строке литер шаблона.
Идентификатор-7 должен быть описан как элементарное числовое целое, его размер должен быть достаточен, чтобы содержать значение, равное размеру данного, представленного идентификатором-1, увеличенное на единицу. Символ Р (М) не может использоваться в строке литер шаблона идентификатора-?.
Фразы DELIMITER (ОГРАНИЧИТЕЛЬ) и COUNT (СЧЕТ) могут быть заданы только тогда, когда задана фраза DELIMITED (ОГРАНИЧИВАЯСЬ).
Идентификатор-1 не должен быть модифицированной ссылкой.
О б щ и е правила
Все сказанное об идентификаторе-2 и литерале-1 относится в равной мере к идентификатору-3 и литералу-2 соответственно.
Идентификатор-1 представляет собой пересылаемое поле;
Идентификатор-4 представляет собой поле принимающего данного, идентификатор-5 представляет принимающее поле для ограничителя.
Литерал-1 или данное, представленное идентификатором-2, задает границу пересылаемого данного, называемую ограничителе^
Данное, представленное идентификатором-6, представляет количество литер в пересылаемом данном, выделенных с помощью ограничителя для перемещения в принимающее данное, представленное идентификатором-4. В это количество не входят литеры ограничителя.
Значение данного, представленного идентификатором-?, указывает относительную позицию литеры в поле, определенном идентификатором-1.
К моменту завершения оператора UNSTRING (РАЗОБРАТЬ) значение данного, представленного идентификатором-8, указывает число принимающих данных, участвовавших в операции.
Если стандартная константа используется как ограничитель, она представляет собой нечисловой литерал размером в одну литеру.