Интересная маленькая программа у вас там.На мой взгляд, есть несколько проблем.
Глагол PERFORM
имеет несколько разных ароматов (базовый, TIMES, UNTIL и VARYING).Аромат PERFORM UNTIIL
, который вы пытаетесь использовать, имеет следующий синтаксис 'railroad track':
__________________________________________________________________________________________________
| |
| >>__PERFORM__ _procedure-name-1__ _______________________________ __| phrase 1 |_ ____________>< |
| | |_ _THROUGH_ __procedure-name-2_| | |
| | |_THRU____| | |
| |_| phrase 1 |__ ________________________ __ END-PERFORM___________| |
| |_imperative-statement-1_| |
| |
| phrase 1: |
| |__ ____________________________ __UNTIL__condition-1__________________________________________| |
| |_ ______ __TEST__ _BEFORE_ _| |
| |_WITH_| |_AFTER__| |
| |
|__________________________________________________________________________________________________|
Обратите внимание, что сразу после глагола PERFORM
вы можете кодировать либо procedure-name-1
, либо phrase-1
, за которым следует произвольное число imperative-statement-1
.Это взаимоисключающие параметры (т. Е. На диаграмме нет пути, позволяющего вам вернуться к началу цикла). После того, как вы пройдете через одну из этих опций, другая больше не будет доступна. Однако ваш код выполняет обе функции! Я бы не сталожидал, что это скомпилируется из-за неоднозначности, присущей коду (я попытался скомпилировать вашу программу, и, к счастью, мой компилятор выдает ошибку).
Другая проблема, которую я вижу, - это использование INPUT
в качестве имени переменной.INPUT
является одним из большого набора зарезервированных слов COBOL, поэтому его нельзя использовать таким образом (опять-таки, я ожидаю, что компилятор выдаст ошибку). Простое исправление - добавить что-то к имени (например, WS-) для устранения неоднозначностиit.
Как указал Джо, типичный способ COBOL сделать то, что я думаю, вы пытаетесь сделать так:
PERFORM PARAGRAPH1
PERFORM UNTIL FUNCTION LOWER-CASE (WS-INPUT) = 'no'
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
END-PERFORM
Я предполагаю, что PARAGRAPH1
отвечает за установку переменной управления циклом WS-INPUT
.
Или (при условии PARAGRAPH2
и PARAGRAPH3
не ссылаются на WS-INPUT
и они выполняются хотя бы один раз)
PERFORM WITH TEST AFTER UNTIL FUNCTION LOWER-CASE (WS-INPUT) = 'no'
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
END-PERFORM
Основное различиепервый пример - это типичная конструкция DO-WHILE (проверка перед вводом тела цикла), а второй - типичная конструкция DO-UNTIL (всегда выполняйте 1 проход через тело цикла и проверяйте перед последующими проходами).
Третий способ, устаревший метод, был бы:
PERFORM PARAGRAPH1
PERFORM PARAGRAPHS UNTIL LOWER-CASE (WS-INPUT) = 'no'
PARAGRAPHS.
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
.
Это эквивалентно первому примеру выше.Я не рекомендую этот стиль кодирования - он восходит к тому, как все было сделано 30 или более лет назад.