Реклама:

В каждом случае оператор ВЕРНУТЬСЯ обеспечивает возврат с выходной записью в вызывавшую программу. При этом оператор ВЕРНУТЬСЯ сопровождается областью общей записи, которая содержит подходящую запись. Последний оператор ВЕРНУТЬСЯ должен содержать запись Конец-файла.

Кодирование инвертирования на языке ПЛ/1

Переменная состояния должна находиться в ячейке памяти, которая сохраняет установленное в ней значение, пока инвертированная программа временно устранена на период между ее вызовами. На языке ПЛ/1 такая память называется статической и обозначается как STATIC STORAGE. Конструкция «массив» в языке ПЛ/1 служит для установки требуемого количества (п) меток. Поэтому оператор инициализации переменной состояния N выглядит так:

DCL L(N) LABEL; DCL N STATIC INITIAL (1):

Тем самым формируется массив, или таблица меток от Ц1) до L(N), причем значение в скобках устанавливается по значению статической переменной N. Исходным значением N будет 1.

В начальную входную точку программы вставляется следующий оператор:

GOTO L(N); L(l):

Этот оператор предписывает программе передавать управление (GOTO) на метки Ц1), L(2), ЦЗ) и т.д. в зависимости от значения N переменной состояния. Непосредственно за ним следует метка Ц1), потому что начальное значение N равно 1 и при первом обращении к программе мы хотим начинать сначала.

Фактическое число N меток ветвления зависит от количества операторов ввода и вывода в программе.

Эти операторы должны размещаться в начале программы независимо от того, инвертирована ли она относительно входного или выходного файла.

Инвертирование относительно входного файла

Когда программа инвертируется относительно входного файла, нужно рассмотреть операторы Читать, Открыть и Закрыть для этого файла.

При первом обращении к инвертированной программе поступит первая входная запись, так что первый оператор Читать можно исключить. Поэтому действия по изменению таковы:

Удалить операторы Открыть, Закрыть и первый оператор Читать для входного файла. Заменить 2-й, 3-й, ... и n-й операторы на:

N = 2; RETURN; L(2):

N = 3; RETURN; L(3):

N = n; RETURN; L(n):

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

Инвертирование относительно выходного файла

Когда программа инвертируется относительно выходного файла, следует рассмотреть операторы Открыть, Закрыть и Писать для этого файла. При первом обращении к инвертированной программе поступает требование первой записи. Кроме того, нужно посмотреть, что реально происходит, когда закрывается выходной файл. В этот момент записывается признак Конец-файла для данного файла. Поэтому оператор Закрыть нужно рассматривать как последний оператор Писать.


⇐ Предыдущая страница| |Следующая страница ⇒