ГОСТ 22558-89 сторінка 50 з 116
[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, указывает число принимающих данных, участвовавших в операции.
Если стандартная константа используется как ограничитель, она представляет собой нечисловой литерал размером в одну литеру.
Если задана фраза ALL (ВСЕМИ), одно или несколько последовательных вхождений литерала-1 или значения данного, представленного идентификатором-2, обрабатываются так же, как одно вхождение, которое помещается в принимающее поле согласно общему правилу 13 г.
Когда при просмотре данного, представленного идентификатором-!, обнаруживаются два последовательных вхождения ограничителя, текущее принимающее поле заполняется пробелами, если оно описано как буквенное или буквенно-цифровое, или нулями, если оно описано как числовое.
Литерал-1 или значение данного, представленного идентификатором-2, может содержать любые литеры из множества литер машины.
Каждый литер ал-1 или данное, представленное идентификатором-2, представляет один ограничитель. Когда ограничитель содержит две или более литеры, эти литеры должны находиться в указанном ограничителем порядке в последовательных позициях пересылаемого данного, чтобы быть распознанными в качестве ограничителя.
Если во фразе DELIMITED BY (ОГРАНИЧИВАЯСЬ) задано два или более ограничителя, между ними существует условие OR (ИЛИ). Каждый ограничитель поочередно сравнивается с рассматриваемыми позициями, пересылаемого поля в указанной последовательности. При обнаружении совпадения рассматриваемые литеры считаются единым ограничителем. Ни одна литера в пересылаемом поле не может рассматриваться принадлежащей нескольким ограничителям.
К началу работы оператора UNSTRING (РАЗОБРАТЬ) данное, определяемое идентификатором-4, является текущим принимающим полем, в которое пересылаются литеры данного,
представленного идентификатором-1. Позиции последнего просматриваются согласно следующим правилам:
если задана фраза POINTER (УКАЗАТЕЛЬ), строка литер, представленная идентификатором-1, просматривается, начиная с относительной позиции литеры, указанной значением данного, представленного идентификатором-?. Если фраза POINTER (УКАЗАТЕЛЬ) не задана, проверка строки литер начинается с самой левой ее позиции;
если задана фраза DELIMITED BY (ОГРАНИЧИВАЯСЬ), просмотр прекращается при обнаружении вхождения ограничителя, заданного литералом-1 или значением данного, представленного идентификатором-2 (см. общее правило 11). Если фраза DELIMITED BY (ОГРАНИЧИВАЯСЬ) не задана, число просматриваемых литер равно размеру текущего принимающего данного (однако, если знак принимающего данного занимает отдельную позицию литеры, число просматриваемых литер полагается на единицу меньшим размера текущего принимающего поля данного).
Если вхождение ограничителя не обнаружено, просмотр оканчивается на последней позиции литеры данного, представленного идентификатором-1;
просмотренные литеры (за исключением литер, совпадающих с ограничителем, если они имеются) рассматриваются как элементарные буквенно-цифровые данные и пересылаются в текущее принимающее поле согласно правилам оператора MOVE (ПОМЕСТИТЬ) (см. п. 6.19 настоящей части);
если задана фраза DELIMITER (ОГРАНИЧИТЕЛЬ), обнаруженные при просмотре литеры ограничителя рассматриваются как элементарное буквенно-цифровое данное и помещаются согласно правилам оператора MOVE (ПОМЕСТИТЬ) в данное, представленное идентификатором-5.
Если вхождение ограничителя в данное, представленное идентификатором-1, не обнаружено, то данное, представленное идентификатором-5, заполняется пробелами; |
если задана фраза COUNT IN (СЧЕТ), то количество I просмотренных литер (исключая литеры ограничителя, если они | имеются) помещается согласно правилам для перемещения ї элементарного данного в данное, представленное идентифика- [ тором-6; S
если задана фраза DELIMITED BY (ОГРАНИЧИВАЯСЬ), то после заполнения очередного принимающего данного про- | смотр продолжается с первой литеры справа от ограничителя., f Если фраза DELIMITED BY (ОГРАНИЧИВАЯСЬ) не задана, I' просмотр продолжается от первой литеры, находящейся справа | от последней пересланной литеры; | I ж) после завершения пересылки в принимающее данное, [ представленное идентификатором-4, текущим принимающим ‘ полем становится данное, представленное следующим вхожде- ( ниєм идентификатора-4, и все описанные выше действия повторяются до тех пор, пока не будут исчерпаны все литеры в данном, определяемом идентификатором-1, или не будут заполнены все принимающие поля.
Начальная установка значения данного, связанного с фразой POINTER (УКАЗАТЕЛЬ) или TALLYING (СЧИТАЯ), осуществляется пользователем.
' (15) Значение данного, представленного идентификатором-?, увеличивается на единицу при просмотре каждой литеры в данном, представленном идентификатором-1. После завершения выполнения оператора UNSTRING (РАЗОБРАТЬ) с фразой POINTER (УКАЗАТЕЛЬ) значение данного, представленного идентификатором-?, становится равным начальному значению плюс число просмотренных литер данного, представленного идентификатором-1.
После завершения выполнения оператора UNSTRING і (РАЗОБРАТЬ) с фразой TALLYING (СЧИТАЯ) значение данного, представленного идентификатором-8, становится равным его начальному значению плюс число принимающих полей, участвовавших в выполнении оператора.
Условие переполнения возникает при следующих ситуациях:
если к моменту начала ^работы оператора UNSTRING (РАЗОБРАТЬ) значение данного, представленного идентификатором-?, меньше 1 или больше размера данного, представленного идентификатором-1;
если в некоторый момент выполнения оператора UNSTRING (РАЗОБРАТЬ) данное, представленное идентификатором-!, содержит непросмотренные позиции, а все принимающие поля уже использованы.
При обнаружении условия переполнения выполнение оператора UNSTRING (РАЗОБРАТЬ) прекращается; если указана фраза NOT ON OVERFLOW (БЕЗ ПЕРЕПОЛНЕНИЯ), то она игнорируется, а управление передается на конец оператора UNSTRING (РАЗОБРАТЬ); если же была указана фраза ON OVERFLOW (ПРИ ПЕРЕПОЛНЕНИИ), то управление передается повелительному-оператору-1. В этом случае выполнение продолжается согласно правилам для операторов, указанных в повелительном-операторе-1. Если выполняется оператор ветвления процедур или условный оператор, вызывающий явную передачу управления, управление передается согласно прави- лам для соответствующих операторов; в противном случае пос
ле завершения выполнения повелительного-оператора-1 управление передается на конец оператора UNSTRING (РАЗОБРАТЬ).
Фраза END-UNSTRING (КОНЕЦ-РАЗОБРАТЬ) ограничивает область действия оператора UNSTRING (РАЗОБРАТЬ) (см. ч. 4, п. 6.4.3).
Если во время выполнения оператора UNSTRING (РАЗОБРАТЬ) описанные в пункте (17) условия не возникли, после завершения пересылки данных согласно другим общим правилам фраза OVERFLOW (ПРИ ПЕРЕПОЛНЕНИИ), если она задана, игнорируется, а управление передается на конец оператора UNSTRING (РАЗОБРАТЬ) или, если указана фраза NOT OVERFLOW (БЕЗ ПЕРЕПОЛНЕНИЯ), повелительному- оператору-2. Если управление передано повелительному-опе- ратору-2, выполнение продолжается согласно правилам для операторов, указанных в повелительном-операторе-2. Если выполняется оператор ветвления процедур или условный оператор, подразумевающий явную передачу управления, управление передается согласно правилам для соответствующих операторов; в противном случае после завершения выполнения по- велительного-оператора-2 управление передается на конец оператора UNSTRING (РАЗОБРАТЬ).
Если идентификатор-1, идентификатор-2 и идентифи-і катор-3 занимают ту же область памяти, что и идентификатор-5, идентификатор-6, идентификатор-7 или идентификатор-8, или если идентификатор-4, идентификатор-5 и идентификатор-6 занимают ту же область памяти, что и идентификатор-7 или идентификатор-8, или если идентификатор-7 и идентификатор-8 занимают одну и ту же область памяти, результат выполнения оператора UNSTRING (РАЗОБРАТЬ) не определен, даже если эти идентификаторы описаны одной и той же статьей описания данных (см. п. 6.4.5 настоящей части).
Побачили розбіжність з офіційним текстом?