Текст
                    СССР
Ордена Ленина
ИНСТИТУТ ПРИКЛАДНОЙ МАТЕМАТИКИ
имени М*В. Келдыша»
Академии Наук СССР
В.Ме Михелев, В.Г1в Стефанов
МАКРОКОД- 81
( описание языка )
Москва


ОРДЕНА ЛЕНИНА ИНСТИТУТ ПРИКЛАДНОЙ МАТЕМАТИКИ АКАДЕМИЯ ’НАУК СССР ИМЕНИ М. В. КЕЛДЫША В.М. Михелев, В.П. Стефанов МАКРОКОД-61 (описание языка). Москва,
ПК 682.142.2 Описывается язык макропроцессора МАКРОКОД-81. В этом языке пользователю предоставляются разнообразные средства для работы с текстами и различными структурами данных. Язык предназначен для реализации трансляторов и расширений языков ассемблеров.
3 СОДЕРЖАНИЕ. 1. Введение ........о00 6 1.1. Назначение макропроцессора 9 1.2. Настройка макропроцессора.... . 9 1.3. Синтаксические правила 10 2. Предложения ♦ • 13 2.1. Запись предложения... 13 2.2. Классификация предложений 14 2.3. Предложение-комментарий 14 3. Лексика 16 3.1. Алфавит 16 3.2. Использование пробелов......... 16 3.3. Имена предложений 17 3.4. Переменные 17 3.5. Метки следования.. 18 4. Типы и описания об’ектов 19 4.1. Описание переменных..... 4.1.1. Локальные переменные.. 4.1.2. Глобальные переменные. 4.2. Запись атрибутов......., 4.3. Скалярные типы... 4.3.1. Арифметические 4.3.2. Булевские..... 4.3.3. Символьные. 4.3.3.1. Атрибуты Р, С, К..., 4.4. Ссылочный тип ... 4.5. Массивы 4.5.1. Атрибут N для массива, 4.6. Сконструированные типы. 4.6.1. Строки 4.6.2. Тексты
4 4. б. 2.I. Атрибуты Р, С, К для текстов .. 30 4.6.3. Списки ... 30 4.6.3.1. Атрибут N для списка........ 32 4.6.4. Кортежи о........ 33 4.6.4.1; Атрибут У 34 4.6.5. Связка о.... 34 4.7. Атрибут А...... 35 4.8. Атрибут S.. о..... ..о. 35 4.9. Вырезка. о...... 0........... о... о. Зв 4.10. Индексная часть переменной о..... 37 5. Внражения.о.о.. о *о0.. оо. о... о о ••••••о 39 5.1. Определение выражения ....о . ..00. 39 5.2. Порядок выполнения операций.о.» 40 5.3. Операции отношения о .... 40 5.4. Преобразование об’ектов в выражении. 41 6. Терминальные предложения 43 6.1. Терминальные предложения» определяемые по имени. • ..... ...... 43 6.2. Терминальные предложения, определяемые по первому символу . 45 7. Операторы присваивания ..•••• < 47 7.1. Оператор SETA . 47 7.2. Оператор SETB. . 48 7.3. Оператор SETC.. 49 8. Оператор именования........ 51 9. Операторы управления...••••••. 54 9.1. Оператор AQO ....••••• 54 9.2. Оператор AIF с меткой... . 55 9.3. Оператор AIF структуризованный....... 55 9.4. Оператор AS ELEC.... 56 9.5. Оператор A SUCH.... 57 9.6. Оператор AWHILE, 58 9.7. Оператор ACTS....... 58 9.8. Оператор AN0P... 60 10. Макропроцедуры.................. •••••• 6! 10.1. Определение макропроцедуры.61 10.2. Предложение прототип......81 10.3. Оператор макровызова. 63
5 :0.3.1. Фактические параметры . .... 94 10.3.2. Соответствие между фактическими и формальными параметрами . . 10.3.2.1. Ключевой параметр SLIST . ... 10.3.2.2. Системная переменная 4SI.IST. 10.3.3. Процесс вызова макропроцедуры 10.4. Операторы выхода . 10.5. Оператор завершения.......... о 10.6. Оператор сообщения 10.7. Системная переменная &SNDX 11. Программа, о, 11.1. Главная программа о . 11.2. Локализация идентификаторов 11.3. Пакеты 0.....о II.3.1. Полное имя макропроцедуры. II. 3.2. Локализация имен макропроцедур в пакете... 11.4. Связь через глобальные переменные.. ■ J. Управление трансляцией. . 12.1. Псевдокомментарий 12.2. Псевдокомментарий 12.3. Псевдокомментарий 12.4. Псевдокомментарий 12.5. Атрибут 14........ 13. Листинг. ........ SMODE................ STEBM. о...... SUSE..... SMPL.... 13.1. Строки листинга....... о . 13.2. Листинг ошибок................... 13.3t. Управление первой частью листинга, 13.4. Управление второй частью листинга 82 13.5. Системные переменные &8РЙВД, &SPBDT, ftSPBNM, &SPSOP 83 ЛИТЕРАТУРА. 84
в 1. ВВЕДЕНИЕ. К сожалению в литературе отсутствует устоявшееся определе¬ ние термина макропроцессор, что, впрочем, характерно для многих компонент программного обеспечения. Однако существуют некоторые специфические черты, при наличии которых тот или иной програм¬ мный продукт обычно считают макропроцессором. Во-первых, работа макропроцессора заключается в преобразо¬ вании текста - последовательности символов в некотором алфавите. Для того, чтобы можно было записать программу преобразования, каждому макропроцессору соответствует язык макропроцессора. В болыяинстве случаев это процедурный язык, содержащий то или иное подмножество из общепринятого набора операторов. Самые ранние макропроцессоры Qi] имели лишь операторы вызова макропроцедур - аналога обычных процедур-подпрограмм с передачей по значению параметров-текстов и операцию сцепления (конкатенации) текстов. В более поздних уже присутствуют операторы условных переходов, циклов и даже поиск по образцу pQ. Таким образом, макропроцес¬ сор это прежде всего текстовый процессор со своим языком задания способа обработки этого текста. Во-вторых, специфика языков макропроцессоров состоит в том, что в них отсутствуют операторы ввода перерабатываемого текста в виде данных, заданных вне программы. Подлежащий изменению текст записывается между операторами языка. Возникающая при этом проб¬ лема выделения орераторов (или текстов) в разных языках решается по-разному. В зависимости от способа ее решения макропроцессоры могут быть либо универсального назначения, если допускается произвольный текст, либо специализированные, в которых запись текста подчинена определенным синтаксическим правилам. Перераба¬ тываемый текст может содержать макропеременные - переменные языка макропроцессора. Обработка текста состоит в замене этих переменных их значениями и в пересылке частей текста в выходной файл. Пересылка возникает в тот момент, когда управление переда¬ ется на начало текста. Таким образом в языке макропроцессора явно не присутствует оператор вывода. Тексты между операторами
7 можно рассматривать как некоторые шаблоны, из которых формирует¬ ся выходной текст. В-третьих, получение текста из шаблонов для подавляющего большинства применений макропроцессоров не является самоцелью, а служит лишь средством для расширения другого языка - базового, текст программы на котором получается в результате переработки текстов-шаблонов. Частным случаем шаблонов могут быть просто куски текста будущей программы на базовом языке. С этим, в частности, связана сложность понимания программ на языках мак¬ ропроцессоров, так как приходится следить как за работой прог¬ раммы, порождающей другую программу, так и за правильностью получаемой программы. Однако со временем приходит и соответству¬ ющий навык. Расширение языка основано на определении смысла нового понятия при помощи макропроцедуры. Существенное отличие от обычного процедурного расширения в языках программирования (запись частей программ в виде процедур с параметрами) здесь состоит в том, что понятия конкретизируются во время трансляции, а не во время счета. Основная задача такого расширения - сократить текст исходной программы и сделать его нагляднее. Конечно это требует дополнительного времени на трансляцию. В-четвертых, поскольку важнейшей областью приложения мак¬ ропроцессоров является расширение языка при помощи обращения к макропроцедурам, то во многих языках макропроцессоров особое внимание обращается на синтаксические возможности записи макро¬ вызовов, чтобы позволить записывать новые понятия в достаточно наглядном и ’естественном1 виде. Существуют макропроцессоры, в языках которых заложены самые разнообразные способы описания синтаксиса макровызовов - от сравнения по образцу до языков описания Q2J. Однако чем сложней и универсальней инструмент, тем больше времени тратится на трансляцию, что, естественно, может сделать его практически непригодным. Совокупность введенных по¬ нятий по сути дела образует новый язык, определяемый самим пользователем для решения конкретной задачи. Простота введения понятий и эффективность конечного продукта делают макропроцессо¬ ры хорошим средством автоматизации построения трансляторов. Предлагаемый макропроцессор обладает всеми перечисленными выше характерными признаками. Его язык содержит хорошо развитую структуру управления и обладает умеренно широкими возможностями
8 записи макроВЫЗОВОВ| что позволяет получать вполне приемлемое время трансляции даже для достаточно больших программ. Его структура такова, что допускает раздельную компиляцию пакетов макропроцедур. Это в свою очередь сокращает время, необходимое для трансляции. Язык макропроцессора МАКРОКОД-81 является дальнейшим разви¬ тием языка макропроцессора МАКРОКОД [з], который в свою очередь был в некотором смысле расширенной версией языка макроассемблера ИБМ-36О £4]. В предлагаемом языке по сравнению с языком макроп¬ роцессора МАКРОКОД много сделано для расширения синтаксических возможностей при записи макровызовов, упрощения программирования сложных макропроцедур, защиты переменных и имен макропроцедур. Существенным на наш взгляд является расширение возможностей для работы со списками - заключенными в скобки последовательностями элементов, записанных через разделители, а также введение в язык новых конструкций - кортежа - записанной без разделителей после¬ довательности элементов, одним из которых должен быть список, и связки - последовательности элементов, записанных через точку.. Примером кортежа может служить обращение к функции, а примером связки - составные имена. Введение списков, кортежей и связок позволяет при построении новых языков существенно облегчить синтаксический анализ таких сложных понятий как, например, выра¬ жение. В языке макропроцессора МАКРОКОД-81 также как и в языке макропроцессора МАКРОКОД существует два режима трансляции тек¬ стов (режим SMODE ). При включенном режиме последовательность из специальных символов - знаков образует самостоятельные части текста, при выключенном они сливаются с остальным текстом. Наличие такого режима позволяет, с одной стороны, в построенных при помощи макропроцессора языках не пользоваться в выражениях пробелами или запятыми в качестве разделителей между операндами и операциями, а, с другой стороны, работать с произвольными текстами. Благодарности. Авторы выражают свою признательность А.К. Петренко. В.С. Штаркману и В.С. Ярошевскому за внимательное чтение рукописи и ценные замечания.
9 1.1 Макропроцессор МАКРОКОД-81 предназначен, во-первых, для расширения языков ассемблеров с вполне определенной синтаксичес¬ кой структурой предложений. Структура эта, впрочем, соответству¬ ет записи предложений в подавляющем большинстве ассемблеров. Следствием этого является возможность создавать языки, все поня¬ тия которых определены через предложения языков ассемблеров конкретной машины. Примером этому может служить язык АСТРА [.5]. Принципиальной и очень важной особенностью таких языков является их расширяемость - сами^будучи построены как расширение языка ассемблера, они позволяют вводить новые понятия основываясь не только на уже введенных, но и непосредственно используя предло¬ жения языка ассемблера, то есть по сути дела команды машины. Это, очевидно, позволяет адаптировать язык к задаче наиболее эффективно. Второе назначение макропроцессора МАКРОКОД-81 - реализация языков программирования, все предложения которых являются вызо¬ вами макропроцедур, а сами макропроцедуры содержат тексты пред¬ ложений на произвольном языке, в частности, и на языках ассем¬ блеров, предложения которых записываются в виде, не соответству¬ ющем записи предложений МАКРОКОДА-81. Естественно синтаксис язы¬ ка в этом случае определяется соответствующими возможностями языка макропроцессора, а семантика - возможностями базового языка. 1.2 Предполагается, что макропроцессор МАКРОКОД-81 будет реализовываться на машинах, различающихся по крайней мере разме¬ ром слана, Кроме того, для машины БЭСМ-б должна быть, очевидно, обеспечена преемственность по отношению к языку макропроцессора МАКРОКОД, чтобы иметьвозможность транслировать написанные ранее программы. Соответствующая настройка достигается как при помощи параметров в языке управления задание:.’ для макропроцессора,так и парамзтра.'-и при получении соответствующей версии. Параметрами являются : I. Клина строки бланка 2* Размер идентификаторов макропеременных, меток следования и имен предложсний Н последующих главах делаются ссылки на зависимость от этих
10 параметров. Для записи размера идентификатора используется сим¬ вол - L. Для Б&СМ-б Lx=6. 1,3 При описании конструкций языка авторы стремились к тому, чтобы после чтения описания как можно • меньшее число вопросов решалось путем эксперимента на машине. С этой целью для описания синтаксиса использована нотация Бэкуса-Наура. Однако не все применяемые синтаксические конструкции описываются на этом языке достаточно просто* тем более, что введение режима SMODE делает синтаксис контекстно-зависимым. Сложность записи требует в отдельных случаях достаточных усилий для их понимания. Поэтому рекомендуется при первом чтении сложные синтаксические описания пропускать, основываясь лишь на словесном описании конструкции и на примерах. В последующих главах синтаксис языка записывается при помощи модификации нотации Бэкуса-Наура. I. В угловых скобках кроме слов, описывающих синтаксические понятия, может быть задана ссылка на его определение, которое было дано в предыдущих разделах. Например, метапеременная, запи¬ санная в виде беременная (3.4)> полность эквивалентна записи <переменная> Определения могут повторяться. 2. Вслед за метапеременной через символ _ (подчеркивание) может быть записан комментарий в виде последовательности слов, записанных строчными буквами и соединенных символом подчеркива¬ ние. Например: <вь*тражение>__количество—символов 3. В квадратные скобки заключается последовательность метапе¬ ременных или альтернатив, которые могут отсутствовать, в фигур¬ ные - которые могут повторяться нуль и более раз. Например: <множитель>: : = [ЪОТ]4первичное>^.<первичное>^ 4. Если символ алфавита совпадает по своему начертанию с метасимволом, то он подчеркивается. Например, £ 4 5. Если правой частью правила служит предложение или последо¬ вательность предложений языка, то каждое из них записывается с новой строчки с учетом разбиения этого предложения на поля. Поля
11 могут содержать как метапеременные, так и терминалы. Последние записываются прописными буквами. Например; ^оператор AGO>::= Галетка следования^ AGO <метка следования>_переход Если предложение не может быть записано на одной строчке, то оно продолжается на следующую. L z4 Прежде чем приступать к изучению языка тем кто не знаком с языком макропроцессора МАКРОКОД рекомендуется предвари¬ тельно разобрать приведенный ниже пример. В этом примере приво¬ дится макропроцедура с именем СУММА, в результате работы которой генерируется последовательность предложений автокода БЕМШ [б], образующих программу суммирования об’ектов, имена которых пере¬ числены в обращении к этой процедуре. N Имя об’екта, в который должен быть записан результат, задается во втором параметре обращения к процедуре. Этот параметр записан в ключевой форме с именем ключа РЕЗУЛЬТАТ. В этой процедуре I и II предложения - скобки, которые ограничивают тело макропроцеду¬ ры. В предложении 2, которое называется прототипом, заданы имя макропроцедуры - СУММА и идентификаторы двух формальных парамет¬ ров. Равенство во втором формальном -параметре означает, что ему должен соответствовать в обращении к процедуре фактический пара¬ метр в ключевой форме» Предложение 3 описывает две локальных арифметических переменных, одна из которых - служит в макроп-
12 роцедуре счетчиком, а во вторую записывается количество элемен¬ тов в списке - фактическом значении, соответствующем первому формальному параметру. Перед началом работы арифметические ло¬ кальные переменные получают в качестве значения нуль. Доступ к отдельному элементу в списке осуществляется при помощи индекси¬ рования формального параметра. В предложении 4 записана фун¬ кция-атрибут N, которая в качестве своего значения возвращает количество элементов в списке. Предложения 4 и 7 с именами SETA являются операторами присваивания - переменной в левой части присваивается значение выражения в правой части. Предложение б - заголовок цикла, а 9 - его конец. Предложения 7 и 8 выполняются повторно до тех пор пока истинно условие в заголовке цикла. Предложения 5,8 и 10 - терминальные. Это заготовки текстов будущих предложений на автокоде БЕМШ. Когда управление передает¬ ся терминальному предложению, происходит замена макропеременных в тексте предложения их значениями, и полученный текст передает¬ ся в выходной файл. Например, для макровызова С УММА (А, В, С, РЕЗУЛЬТАТ»Е в выходной файл будет передана последовательность предложений: СЧ А СЛ В СЛ С СЛ 0 ЗП Е
13 2. ПРЕДЛОЖЕНИЯ. Программа на языке макропроцессора МАКРОКОД-81 состоит из последовательности предложений. 2.1 Текст исходной программы записывается на бланках. Каж¬ дое предложение начинается с новой строчки бланка. Максимальная длина строчки - 72 позиции. Предложение может быть записано как на одной строчке, так и на нескольких. При записи с продолжением на следующую строчку либо текущая должна оканчиваться произволь¬ ным, нс отличным от пробела символом в позиции продолжения, либо следующая должна иметь символ * в первой позиции. Позиция продолжения - последняя позиция в строчке. Длина строчки может быть задана в языке управления заданием для макропроцессора. Стандартная ддяна - 72 позиции. Символ продолжения не является частью предложения. Предложение состоит из трех полей, в каждом из которых могут быть записаны вполне определенные его части. Первое поле - поле метки. Оно названо так потому, что в нем, в частности, задается метка следования для операторов перехода. Поле метки отделяется от следующего за ним поля имени предложения пробела¬ ми. Даже если поле метки отсутствует, то по крайней мере один из отделяющих пробелов должен быть сохранен. В поле имени записыва¬ ется последовательность символов, которая служит именем предло¬ жения, Поле это практически Всегда присутствует за исключением случая, описанного в разделе (12.4). За полем имени, отделенное от неге пробелами? следует поле операндов. Это поле заканчивает¬ ся либо пробелом, либо концом строчки. Операнды отделяются друг от друга запятыми. Внутри поля операндов допускается запись комментария в строчке (3.2). За полем операндов тоже может быть записан комментарий. На следующую строчку может быть продолжено толък? поле операндов. Ниже приведены примеры записи предложе¬ ний.
14 .МЕТКАСЛЕД AIP (ДА GT 1)ЛПРОД GBLC &(к. + ДС ЗАПИСЬ С ПРОДОЛЖЕНИЕМ Здесь AIF и GBLC - имена предложений. Во втором примере поле операндов продолжено на две следующие строчки. 2.2 В зависимости от роли, которую предложения выполняют в программе, они делятся на-четыре группы. ('предложение^ :=(описатель>| (оператору (скобка}^ «(терминальное)» (описатель>::=<описатель переменных)»! (прототип>| сзаголовок лакета> ^оператор>: :=(оператор присваивания)» | (оператор именования^ (оператор управления^ (оператор макровызова)» | «(оператор выхода^! (оператор завершения^! (оператор сообщения> '/инальное>:: ^(терминальное по имени предложения^ «(терминальное выделяемое по первому символу^ (скобка^: : = МАСЮ| MEND ( MPACKl MPEND 2.3 В языке существует специальное предложение, позволяющее комментировать текст программы - предложение-комментарий. Оно отличается от остальных наличием в первых двух позициях символов .*эостальные символы в нем могут быть произвольными. В обш^м случае предложение-комментарий не влияет на выполнение
15 программы. Исключение составляют лишь псевдокомментарии, которые позволяют управлять ходом трансляции (12). Предложе¬ ние-комментарий не может быть продолжено. .♦ЭТО ПРИМЕР ПРЕДЛОЖЕНИЯ-КОММЕНТАРИЯ
16 3. ЛЕКСИКА. 3<1 При записи предложений могут использоваться следующие символы: 4с и ив ол>:: «<6 уква> | <ци фра> | <с гге цс и мво л> <;буква>::«А|Б|В|Г|Д|Е|Н\3|И|й|К\Л\М\Н\0\ П|Р|СЩУ|Ф|Х|Д|Ч\Ш|Щ|Ы|Ь|Э|Ю|Я\ D|F|G|I|J|L|N|Q|R|S|U|V1W|Z\$\(3) <цифра>::«0\1|2|ЗЩ5|6\718|9 <спецсимвол>::*<£азделитель>(<Ъграничитель^|<знак>|<точка}> </разделитель>: := "пробел" <Ъграничитель>:: «Ц ) | ’ <знак>::« <(точка>: :=„ 3.2 Пробелы в качестве разделителей используются, во-пер¬ вых, для отделения в предложении полей и, во-вторых, в выражени¬ ях для отделения операндов от операций в случае, если код операции - последовательность букв, а первый операнд кончается или второй начинается с буквы или цифры. Например, GT I £ остальных случаях между операндом и операцией пробелы не обязательны. Всегда один пробел эквивалентен нескольким. Комбинация из запятой, за которой следует по крайней мере един пробел в случае, если эта комбинация не является частью последовательности символов, заключенных в кавычки, означает начало комментария в строчке. Комбинация эта может быть записана лишь в Тех местах, где заоятая рассматривается как разделите гч. ■'оммен'барий в строчке заканчивается ее концом. Призер:
17 ASRCH &ТБЛ, ’ А&В(1, 6)', (I,100,1).ИРОД ИМЯ ТАБЛИЦЫ ЧТО ИЩЕМ НЕ НАШЛИ Пробелы между + в первой позиции (знак продолжения) и первым символом, отличным от пробела, игнорируются (то есть строка уменьшается на соответствующее количество позиций). 3,3 Имена используются для идентификации предложений. Имя - последовательность из букв, цифр , знаков, и ограничителей ь <имя>: :«=<символ в имени)£<символ в имени)J <символ в имени)»: :=<буква>|<лифра>|<знак)|<Ъграничитёль) Ниже приведены зарезервированные имена предложений. MACRO MEND MEXIT MEXITL MSTOP MPACK MPEND MNOTE ANOP AGO AIF ASELEC ASRCH ATRUE AFALSE AWHILE AEND ACTR ANEW SBLA GBLB GBLC LCI..A LCLB LCLC LCLP SETA SETB SETC Имя может быть произвольной длины, но значащими являются лишь первые L символов. Остальные игнорируются. 3.4 Переменные используются для представления имен тех об’ектов, которые изменяют свое значение в процессе работы программы.Существуют три варианта записи переменной. ^переменная)::«<простая>|<с точкой>|<с указанием) <лрпотая>::=Д<буква или цифра)£<буква или цифра)} ббуквз или цифра): :«<буква)|<;цифра) <с точкой)::~<простая)» <с .указанием): :«<вырезка (;i.9)>( <0 ылелеь’ке подпоследовательности (4. 10)> псни'.й бук? е:<н о-цифровая псслсдагатслъность
18 может быть произвольной длины, но значащими являются лишь первые U-I из них. Переменная с точкой лишь изображением отличается от простой переменной и используется обычно в тех случаях, когда требуется отделить переменную от следующей за ней буквы, цифры, точки или открывающей скобки. Переменная с указанием устроена несколько более сложно, чем переменная с индексом в рассматривается в разделе Примеры: языках программирования, 1 (4.10). и подробно Ас ЧЕТ простая А2НОМ. с точкой АЭЛМАС(£1) с указанием 3.5 Метки следования используются для организации изменения порядка выполнения операторов и изображаются следующим образом? <метка следования^:«(буква или цифра>£<буква или Аналогично переменным, буквенно-цифровая последовательность может быть произвольной длины, но значащими являются первые L-I символов. Примеры: «начцикла .гдльт .прол
18 4. ТИПЫ И ОПИСАНИЕ ОБ’ЕКТОВ. Об’екты в тексте программы могут быть заданы либо своим зображением, как, например, константы или рассматриваемые ниже конструированные об’екты, либо представлены переменными., Об’ек- у, заданному изображением, соответствует в каком-то смысле ^изменяемое значение® Переменные же представляют имя изменяемо¬ го значения® В дальнейшем высказывание ’переменная именует об *— ?кт’ считается равносильным высказыванию ’переменная представля¬ ет имя, которое именует соответствующее ему значение’. Такая система понятий (близкая к используемой в алголе-68) хорошо согласуется с реализацией макропроцессора - имени соответствует дескриптор, в котором, в частности, содержится адрес памяти, где хранится значение. Если в выражении используется переменная, то перед выполнением операции происходит ее разыменование - по имени выбирается значение. В операторах присваивания для измене¬ ния значения используется имя. Описание об’екта в предложении-описателе, либо запись изоб¬ ражения сконструированного об’екта вводят об’ект заданного типа. Тип определяет характер использования об’екта (разрешено только чтение или чтение и запись), множество значений, которые он может принимать, и множество допустимых над ним* операций. Ис¬ пользуемые в языке типы об’ектов разбиваются на четыре класса: скалярные, ссылочные, массивы и сконструированные. Скалярные типы соответствуют об’ектам наиболее простой структуры - об’ек- там, не содержащим компонент. Об’екты ссылочного типа использу¬ ются для именования других об’ектов. Об’ект, описанный как массив, - это совокупность компонент одного и того же, но скалярного типа. Более сложными являются об’екты, относящиеся к типам сконструированных об’ектов. Эти об’екты в качестве своих компонент могут содержать об’екты произвольного типа в том числе и сконструированные.
20 4.1 По способу выделения памяти все об’екты, за исключением сконструированных, разбиваются на две группы - локальные и глобальные. ^описатель переменных^::=<(Ьписатель локальных об’ектов>| ^описатель глобальных об’ектов^ 4.1.I Локальные об’екты описываются в макропроцедуре (10) или в главной программе(II.I). Память локальным об’ектам отво¬ дится в памяти, выделенной макропроцедуре на время ее работы. Следовательно нельзя воспользоваться в последующих вызовах мак¬ ропроцедуры значениями локальных переменных, которые они получи¬ ли в результате предыдущих вызовов этой макропроцедуры. Локаль¬ ные переменные доступны (то есть могут быть использованы) лишь в теле той макропроцедуры или в главной программе, в которой они описаны. Локальные об’екты описываются в преложениях-описателях с именами LCLA,LCLB,LCLC и LCLP. ^описатель локальных об*ектов>::® . <вид локального> ^список переменных> <^вид локального>:: <=LCLA|LCLB\LCLC|LCLP «^список переменных>: :=<простая>^Арифметическая константар^ <простая>[(<арифметическая константа(4.3.1)>у|). Примеры: LCLA £А,£М LCLC 4CHAB,£ST(25) LCLP £УКАЗАТЕЛЬ В скобках задается размер массива (4.5). 4.1.2 Глобальные об’екты также описываются в макропроцедуре или в главной программе, но память им выделяется при загрузка программы и сохраняется в течение всей ее работы. Глобальные переменные, описанные в разных частях программы, но имеющие одиг и тот же идентификатор, представляют один и тот же об'ект, кроме
21 случая, когда их область действия ограничена пакетом (II.3). Глобальные об’екты описываются в предложениях описателях с име¬ нами GBIAQBLK и «/описатель ’■”?"хяльных об,ектоь>::= <вид глзбального> <спнсок переменных> «/вит глобально го>: :=G3LA^GBl.B| G.-JLC г:риме. ы: &■ G '' '• - GBLC 4.2 Над об’ектами, представленными переменными, определены встроенные ручкции, определяющие некоторые их свойства-атрибуты. В дальнейшем эти функции будут также называться атрибутами. <атрибут>: :«<идентификатор ?.трибута>’<переменная> «/идентификатор атрибута^: :=’фЦУ\К\А\Р\С| S Примеры: М’^МАС y^LIST ХОСПИС 4.3 Существует три скалярных типа: арифметический,булевский и символьный. 4.3.1 Переменнные арифметического типа - арифметические переменные описываются в предложениях-описателях с именами LCLA для локальных об’ектов и GBLA для глобальных. Соответствующие им об’екты могут принимать целочисленные значения от С до 32767. Существует три варианта арифметических констант. Ниже приводится их определение:
22 ^арифметическая константа>: :«= 4Хесятичная>| <Ьосьмеричная>|<йестнадцагиричная> {десятичная>: :=<цифра>£<дифра>} <восьмеричная>: :=В’£ ^восьмеричная цифрфр ^шестнадцатиричная^ :=Х’^шестнадцатиричная цифра>р ^восьмеричная цифра>::=0(1|2( 3|415\б17 ^шестнадцатиричная цифра>: :=СЦ1|2(3(4\5|6|7^8| 9| А\В(С|D(Е[Р Примеры констант: I 157 В’13» Х’Р15' Над арифметическими об’ектами определены операции: + сложение вычитание * умножение / деление ’ZOO остаток от деления Все операции бинарные и выполняются по модулю 32768. Опера¬ ции *, / и МОП связаны соотношением: А=(А/В)*В+(А MOD В) Если второй операнд в операциях / и MOD равен нулю, то фиксиру- ется ошибка. ;4.3«2 Переменные булевского типа - булевские переменные описываются в предложениях-описателях с именами LCLB для локаль¬ ных об’ектов и QBLB для глобальных. Соответствующие им об’екты могут принимать два значения: ’истина’ и ’ложь’. Роль булевских констант выполняют цифры 0 (’ложь’) и I (’истина’). Над булев¬ скими об’ектами определены бинарные операции: AND логическое умножение, ОН логическое сложение и унарная МОТ логическое отрицание.
23 4 3.3 Переменные символьного типа - символьные переменные описываются в предложениях-описателях с именами LCLC для локаль¬ ных об'ектов « QBLC для глобальных. Соответствующие им об’екты могут принимать значания в виде последовательности из произволь¬ ных символов алфавита длиной не более L.. Над символьной перемен¬ ной определена унарная операция выделения. Операция записывается в скобках вслед за простой переменной. Ниже приведено ее опреде- ление: ^выделение)»: :=5,<выражение>_начало,<выражение>_количество Примеры: ЛПОС(„$К+1,2) Определение выражения будет дано ниже и практически совпадает с общепринятым. Выражения вычисляются и результат в случае необхо¬ димости преобразуется к арифметическому значению.Результатом операции выделения служит часть исходной последовательности, начинающаяся с символа, номер которого получается в результате вычисления начала подпосдедоват-ельности,а длина равна количес¬ тву. Последовательность нумеруется, начиная с единицы. Если начало больше длины последовательности, то результатом будет пустая последовательность. Если значение начала - нуль, то результат начинается с первого символа. Если количество равно нулю, то результат - пустая последо¬ вательность. Если количество больше разности между длиной последователь¬ ности и началом, то последним символом результата будет послед¬ ний символ последовательности. Примеры: переменная значение выделение результат ABCD £С(,,2,2) ВС Й.ПОС +-Е £ПОС(, ,0,1) + &Е EFGHI ^Е(,,3,IO) GHI
24 4.3.3.I У переменной, именующей последовательность симво-, лов, определены атрибуты Р, С, К. Если значение представляет собой изображение арифметической константа, текст, то - то значением атрибута Р служит символ N, если пустой • символ 0, ь остальных случаях - Символ и. Например, переменная значение атрибут значение ат ’рибута ACi 9 РЦ.С1 К £С2 В’7' Р'£С2 [•? &СЗ X’F’ Р'£СЗ N &С4 *пусто" Р'£С4 0 £С5 АВ Р'$С5 и Если значение прдставляет собой изображение арифметической константы в десятичном виде, то значением атрибута С будет символ F, если в восьмеричном - символ В, если в шестнадцатирич¬ ном - символ X. В остальных случаях значением атрибута С; будет символ U. Например, переменная значение атрибут значение атрибут ?а &CD 231 C'fton S' &СВ 3’375' С'&СВ г> ftCF X1FA9* С'£СХ X &CU Т' АВ’ С’^Си - Атрибуты Р и С возвращают значения символьного T1 Количество си.мволов в последовательности может быть опрела лене при помощи атрибута К, Например, переменная значение атрибут значение атрибута &СК1 СЛОВО C'ftCKi. г; &CF2 +- С&СК2 О &СКЗ "пусто" С'АСКЗ о К. воз г? апцает значение арифметического ти
25 в указатели это переменные, имен которых служат имена других об’ектов. Указатели локальные в предложениях-описателях с В основном указатели используются для именования об’- Йменовать можно и об’ект, с которым уже связана перемен¬ ки работе с об*ектом, именованным указателем, происходит в результате чего находится исходное имя, значение по этому изменяется. Примеры 4.4 Переменные ссылочного типа - значениями i - описываются только как именами LCLP, скоструированных об’ектов, связывая тем самым переменную с ектом. ная. П; его разыменование, которое и участвует в операции: либо берется имени, либо при присваивании это значение присваивания имени приведены в разделе (8). 4.5 В языке зафиксирован только один способ организации данных - об’единение их в одномерные массивы. В массивы могут быть об’единены либо скалярные об’екты одного и того же типа, либо указатели. Однако, поскольку значением элемента массива указателей может быть имя массива, то возникает возможность организации многомерных массивов. В отличие от обычного способа задания многомерных массивов в данном языке многомерный массив не описывается, а создается в процессе вычисления и, следова¬ тельно, может быть реорганизован. Массивы указателей могут слу¬ жить основой для создания более сложных организаций данных, об’екты которых принадлежат различным типам. Соответствующие примеры будут даны при описании оператора именования (8). Элементы массива всегда нумеруются от I до верхней границы массива. Именуются элементы при помощи вырезок (4.9), частным случаем которых является индексированная переменная. Массив описывается в тех же предложениях-описателях, что и скалярные, переменные с той лишь разницей, что вслед за идентифи¬ катором переменной в скобках записывается его верхняя граница - размер массива (арифметическая константа). Примеры: SBLC £СНК( 25)NAME(B’7’ ) LCLP ^AP0INTE£(40)
26 4.5.1 Размер массива может быть получен обращением к атри¬ буту N. Например, N’j^CHR равен 25, a N^APOINTER равен 40. 4.6 Существует пять типов сконструированных об’ектов. Стро¬ ка, текст, список, кортеж и связка. Например: • ’СТРОКА’ 'ОБ”ЕКТ N $К’ - строки ТЕКСТ 1ЦС.5 - тексты (А, В) (М £В) - списки FUNCI, 3) (&А,ПРИМ)КРТ - кортежи А.В.С ^С(5).(А,Е) - связки В отличие от об’ектов предыдущих трех классов, сконструиро¬ ванные об’екты описываются в месте их использования при помощи записи их изображений. Изображения конструируются из отдельных элементов, которыми могут быть об’екты разных типов. Конструиро¬ вание происходит с соблюдением правил, соответствующих ; типу изображаемого об’екта. Если избражение не содержит переменных, то оно представляет константу, соответствующую типу сконструиро¬ ванного об’екта, если содержит - то рассматривается как обраще¬ ние к предопределенной программе-генератору с параметрами - элементами, из которых строится изображение. В последнем случае при каждом таком обращении программа-генератор порождает очеред¬ ной его экземпляр. Сконструированные об’екты в виде изображения используются, во-первых, как фактические параметры макровызоьов и, во-вторых, в операторе именования, когда они связываются с переменными-указаталями. Память для об’ектов этого типа берется из локальной памяти макропроцедуры или главной программы. Пос¬ кольку предыдущие экземпляры могут оказаться недоступными, нап¬ ример, в результате повторного обращения к оператору именования, то память замусоривается. В языке нет автоматической чистка мусора и, следовательно, выделенная память может освободиться лишь после выхода из процедуры и возврата ее локальной памяти.
27 4.6.1 Изображение строки конструируется при помощи последо¬ вательной записи произвольных символов алфавита и переменных с соблюдением следующих ограничений - за простой переменной не должен следовать символ буквы, цифры, точки или открывающая скобка. Полученная последовательность заключается в кавычки. Чтобы отличить ограничивающую кавычку ст кавычки как элемента последовательности последняя кодируется в виде двух кавычек С*1), а чтобы отличить символ £ от начала переменкой он также кодируется в виде двух символе?. (зд). ’’ та и .другая пары символов заменяются в результате одним символом. Последователь¬ ность, образующая строку, может быть пустой, то есть строка может состоять только из ограничивающих кавычек. Указанное выше ограничение реализуется при помощи простого правила: если за простой переменной необходимо записать букву, цифру, точку или открывающую скобку, то вместо простой переменной надо использо¬ вать переменную с точкой. Ниже приводится определение строки: <бстрока>: : = ’<символьная последовательность)** |1 ’ символьная последовательностью : = 4простая> |<за простой>[<символьная последовательность 4с точкой>[<символьная последовательность^ \ 4с указанием>[<символьная последовательность)?]| 4символ^Символьная последовательность^] 4за простой>: :=<знак>р | "пробел" >]]| Примеры строк: ’СТРОКА» ’HOMEPgjN» »5+Ш.О» »£Р» ’ЗДИГ »»»»*» Последним двум примерам соответствуют последовательности симво¬ лов &HI и »» Генерирование экземпляра строки состоит в замене переменных в изображении строки их значениями в виде последовательности символов. Поскольку значением переменной может быть об’ект про¬ извольного типа, то перед подстановкой при необходимости проис¬ ходит преобразование его в последовательность символов» Преобра¬ зования описаны в разделе (5.4). Ограничивающие кавычки не входят в результирующую последовательность. Например, если зна¬
28 чением символьной переменной^ С будет ВИНА, то в результате генерирования экземпляра строки ’ПОЛОГО1 будет получена последо^ вательность символов ПОЛОВИНА, Над строками определены бинарная операция конкатенации, для обозначения которой используется символ • (точка), и унарная - выделение подстроки. Результатом операции конкатенации служит последовательность символов, состоящая из последовательности символов первой стрэ, ки, за которыми следуют символы второй. Например, если 4-Р содержит последовательность символов ЛО, то в результате выпол¬ нения операции ’НАЧА*. V получится последовательность символов НАЧАЛО. Если операнды операции конкатенации не последо¬ вательности символов, то участвующие в операции об’екты предва¬ рительно преобразуются в последовательность символов (5). Ниже приведено определение операции выделения подстроки. Рта операция всегда записывается непосредственно вслед за стро¬ кой. Отделение подстроки)*: : = (<выраже ни е>_н ач ал о,<Ъыраже н и е>_ к оли че с тв о) Примеры: ’^ВС’(2,5) ’А^’<^А+1,^В) По смыслу операция совпадает с операцией выделения (4.3.3), где в качестве последовательности берется последовательность, полу¬ ченная в результате генерирования экземпляра строки. 4,6.2 Изображение текстов конструируется при помощи после¬ довательной записи простых текстовых констант, строк и перемен¬ ных. При конструировании используются два варианта простых тек¬ стовых констант - слова, состоящие из букв и цифр, и знаки - последовательности знаков (3,1). При конструировании должно соб¬ людаться следующее ограничение: за простой переменной не может быть записано слово. Ограничение реализуется при помощи простого правила: в случае, если за простой переменной требуется записать
«кетовую константу, начинающуюся с буквы или цифры, то необхо- димо воспользоваться переменной с точкой вместо простой перемен¬ ной» В зависимости от режима, который устанавливается при помощи псевдокомментария SMODE, существует два, варианта представления текстов их изображениями, В режиме OFF текст может состоять из слов знаков, строк и переменных, а в режиме ON либо только ' из знаков, либо из слов, строк и переменных. Ниже приведено опреде¬ ление текста. В этом определении контекстная зависимость от режима задается при помощи подчеркивания тех метапеременных и альтернатив, которые в режиме ON не принимаются во внимание. (Для сокращения записи слово ’оканчивается1 из’ято из записи метапеременных). <*гекст>::=<знаки>|4?1е знаки> <fce знаки>::=<на простую>^<}{е на простую> <;на простую>:: =<*знаки><простая (3.4)>| <не знаки><простая>) ^переменная (3.4)хпростая> <^е на простую)»: :=<на слово>|<(на энаки>|<на с точкой)»] <ка с указанием>|<4{а строку> <Ja слово)»: :»[<1знак1£>| <fta знаки>|<с указание^«на с указанием^ ^с точкой>[<на с точкой*>(<на строку^<слово> <Ъа знаки>:;B<fca слово><знаки>|<йа переменную><знаки)>| <на строку>ф<аки> 41а с точкой)»: :«<знаки><с точкой (3,4)^<(не знаки^с точкой)») <)теременная><с точкой)» <на с указанием)»::*<знаки‘Хс указанием (3.4)>| <не знакх><с указанием)»! <переменная)><с указанием^ <Ъа строку>;:«<знакидеTpoxtf^lZHe знакИ><строка>1 <строка)> <знаки>: :*<знак>[<знак>} <слово>: :«<буква или цифра (3.4)>^буква или цифра)»} <на переменную^::«<на простую>1<на с точкой>^<на с Примеры текстов: ^переменная > W *ЦНАЧ^М(4)Н0М т»а* / =СЦЕ.К
30 Очевидно, что последний пример не может быть записан в режиме ON, так как текст этот содержит знаки и слова одновременно. Генерирование экземпляра текста аналогично генерированию экземпляра строки с той лишь разницей, что кавычки, ограничиваю¬ щие строку, входящую в текст, сохраняются в результате. Символ £ в тексте кодируется также как в строке в виде двух символов^ и также как в строке в результат попадает лишь один. Над текстом, который представлен переменной-указателем (4.4), либо переменной - формальным параметром макропроцедуры (10), определена операция выделения. Ее запись и способ получе¬ ний результата аналогичны операции выделения для символьной переменной (4.3.3). 4.б.2.1 У переменной, именующей текст, определены те же атрибуты Р, С и К, что и у переменной, именующей символьное значение. 4.6.3 Изображение списков конструируется при помощи после¬ довательной записи компонент списка - переменных, текстов, спис¬ ков, кортежей (4.6.4), связок (4.6.5) и разделителей. Полученная последовательность заключаете# в скобки. Разделителем может быть либо цепочка ’пробелов, либо запятая» Между левой скобкой и первым из записанных элементов, между двумя соседними элементами и между последним из записанных элементов и правой скобкой может быть несколько разделителей - цепочка резделителей. Отсутствие элемента между разделителями или между разделителем и скобкой трактуется как пустой текст. Список может быть пустым, то есть не содержащим ни записанных элементов, ни разделителей. Последо¬ вательность компонент, между которыми не записаны разделители, образуют элемент списка. Ниже приведено определение списка. Я этом определении подчеркнуты те метапеременные, которые не учЛ" тываются в режиме ОРР. <список>: :®(Г<цепочка разделителей)^4^лемент> Капочка разделителейХэлемент>} [<цепочка разделителей^) | ()
31 ^элемент> • • ^из энаков>^не из знаков><из энаков>|>|<не из знаков>] | <ие из знаков>/<из знаковое из знаков>][<из энаков>} /из энаков>: :=<знаки (4.6.2)> ^не из знаков>: :=<не знаки>|<переменная>\ <список>|<кортеж>|<связка> ^разделитель в списке^::<пробелы>|<запятая> «/цепочка разделителей^ : = <пробелы>£<запятая>} | ^запятая>£<эапятая>} <пробелы>:: = ^пробел''{*пробел''} <запятая>::=^ Следует напомнить, что пробел за запятой означает начало коммен¬ тария в строчке. Конец комментария - конец строчки. Примеры списков: (ПРй:ЖР СПИСКА) (ЗЛШНТЫ A,4E,(C,D),F(&E)) (А+Р(В)) () (0B.MS) (ПЕРВЫЙ (ВТОРОЙ (ТРЕТИЙ УРОВЕНЬ))) Сгенерированный экземпляр об’екта типа список представляет собой последовательность компонент - переменных, текстов (вклю¬ чая пустые), списков, кортежей и связок, занумерованных, начиная с единицы. Генерирование последовательности по изображению спис¬ ка состоит в генерировании компонент-текстов и вычислении индек¬ сных частей переменных. Например, если £А равен I, a j^C - последовательность символов СТО, то изображен!» списка ЦВ(^А+1^£С.П) будет соответствовать последовательность из двух компонент ДВ(2) и СТОП. Пустой список имеет одну единственную компоненту - пустой текст. 2 зависимости от режима трансляции, установливаемого при помощи псевдокомментария S"ODE (12.1), существует два варианта представления списка в виде последовательности компонент: 5 режиме CFF последовательность компонент совпадает с пос¬ ледовательностью элементов списка, включая пустые, в режиме См количество компонент может превышать число
32 элементов в списке, так как элемент сам может состоять из последовательности компонент, поскольку последовательность спец¬ символов - знаки образуют отдельную компоненту. Если компонента списка в свою очередь является сконструиро¬ ванным об’ектом, то генерируется экземпляр компоненты и т д. Если элементом списка служит список, то ему соответствует своя последовательность компонент, если кортеж, - то последователь¬ ность, соответствующая.кортежу, если связка, - то последователь¬ ность, соответствующая связке. Это приводит к представлению списка последовательностями, которые сами в качестве своих ком¬ понент могут содержать последовательности из компонент. Ниже приведены пример списка и соответствующие ему компоненты содержит текст 0). Режим OFF список: (AE4C,^H,J^B.C, (С, D+E)) компоненты: номера: номера АВ+С I э ОС 3 (С.П+Е) -первый уровень -второй уровень С I 4 D+E 2 Режим ON компоненты: АВ + С ОС (C,D+E) -первый уровень номера I 2 3 4 5 б С D + Е -второй уровень номера 1234 Компонента списка или совокупность его компонент именуется при помощи вырезки (4.9). 4.6.3.1 Количество компонент списка, включая пустые тексту между разделителями и разделителями и скобками можно получить, используя атрибут N. Значение этого атрибута зависит от режим.* трансляции. Например, для списка
33 (_A>=3, +C ,D<-(A)) в режиме OF? N равен 4,а в режиме ON 10. 4.6,4 Изображение кортежа конструируется при помощи после¬ довательной записи без разделителей компонент кортежа - перемен¬ ных, текстов и списков со следующим ограничением: изображение кортежа должно содержать по крайней мере два элемента, один из которых должен быть списком. Ниже приведено определение кортежа. Подчеркнутые альтернативы в режиме ON не учитываются. <Кортеж>::=<Кортеж на простую>|<Кортеж не на простую> ^кортеж на простую>::=<на список><простая>| </на список><на простую (4.6.2)> <кортеж не простую>::=<на список><не на простую (4.6.2)> | 4на списокХзнаки (<6. £)>| <на список^<список>{ <Лперед списком^^списокЧ <на список>: : = £<кортеж не на простую^} вперед списком^]<список> <перед списксм>: :»<знаки>|<не на простую>|<с точкой>(<с указанием^ Примеры: <А,(В4С.) (£E)F (А)(В Е) F(B) (£A,^E(W +-(А,В) Последний пример может буть только в режиме OFF, так как в режиме ON знаки не могут присутствовать в изображении кортежа. Кортеж с точки зрения генерирования соответствующей ему последовательности компонент полностью эквивалентен списку, ко¬ торый получается, если компоненты кортежа - переменные, тексты и описки отделить друг от друга запятыми, а полученную последова¬ тельность заключить в скобки. Например,кортеж А(В,С)$П.(Е,Р)С£Н эквивалентен в указанном смысле списку
34 Таким образом все, что сказано в предыдущем разделе о списках относится -и к кортежам, в частности, компонента кортежа - переменная, текст, список может быть получена при помощи вырезки (4,9). Атрибут У позволяет отличить кортеж от любого другого об’екта. Для кортежа его значение равно I, а в остальных случаях 0. 4.6.5 Изображение связки конструируется при помощи последо¬ вательной записи компонент связки - переменных,текстов, списков и кортежей, отделяемых .друг от друга точками. Ниже приведено определение связки. Подчеркнутая альтернатива в режиме ON не учитывается. <связка>: :=£<^вено>^С {^звено^. .£<*1оследнее звено>] ^звено>::=<знаки (4.ь.2)>|<с точкой (3. *)>|<с указанием (3.4)>( <£не на простую (4.6.2)>|^список>|^кортеж не на простую (4.6.4))> ^последнее звено>::=<звено>|<простая (3.4)>|<на простую (4.6.2)>| <кортеж на простую <4.6.4.)> Примеры: А.В С..Н (А,В).Р(С).СН<Е ..... .А Очевидно, что последний пример может быть только в режиме OFF, так как'"в режиме ON знаки не могут присутствовать в изображении связки. Связка с точки зрения генерирования соответствующей ей последовательности компонент полность эквивалентна списку, кото¬ рый получается если точки, об’единяющие элементы связки, заме¬ нить запятыми и полученную последовательность заключить в скоб¬ ки. Например, связка
35 *C..A.(C,S) эквивалентна в указанном смысле списку Таким образом все, что сказано о списках, относится и к связкам. В частности, например, если в изображении связки эле¬ мент опущен, то в сгенерированной последовательности компонент ему соответствует пустой текст. Например, связке ... соот¬ ветствует последовательность из четырех компонент - пустых тек¬ стов. 4.7 Атрибут А позволяет отличить об’екты, которые состоят из последовательности компонент - массивы, списки, кортежи и связки от остальных. Атрибут возвращает значение булевского типа. Для массивов, списков, кортежей и связок его значение - ’ложь1 и ’истина’ в остальных случаях. Например, если перемен¬ ная- указатель^? именует кортеж А(В), то значением А’^Р будет ’ложь’. 4.8 Атрибут S позволяет определить тип значения, именуемого переменной-аргументом. Атрибут S возвращает значение в виде символа. Ниже приведены символы и соответствующие им типы значе¬ ний. А - арифметический В - булевский С - символьный Т - текст S - список К - кортеж R - связка. Например, если формальный параметр (10)ДИАР именует фактический параметр - переменную символьного типа, то значением S%IIAP будет символ.С.
36 4.9 Вырезка именует отдельную компоненту или совокупность последовательных компонент массива, списка, кортежа или связ¬ ки. При записи вырезки используется отрезок, определяющий диапа¬ зон компонент. ^вырезка>:: =<(прсст ая>(<отрезок>£, <отрезок>|) «/отрезок!) :,:=<Ъыражение)_левая_граница[:<выражение)>_правая_границ>а Значение выражения для правой границы отрезка должно быть больше или равно значению выражения для левой границы. Если отрезок состоит только из одной левой границы (индекс),то вырезка имену¬ ет отдельную компоненту, в противном случае - последовательность компонент - массив, список, кортеж или связку в зависимости от того, что именует простая переменная. Подпоследовательность на¬ чинается с компоненты с номером, равным значению левой границы, и заканчивается компонентой с номером, равным значению правой границы. Для массива значение правой границы не должно превышать размера массива. Если значение левой границы больше числа компо¬ нент списка, кортежа или связки то, если есть правая граница - именуется список, кортеж или связка из одной компоненты - пустого текста, если же правой границы нет, то именуется пустой текст. Если значение правой границы превышает число компонент списка, кортежа или связки, то последней компонентой подпоследо¬ вательности будет последняя компонента исходной последовэтель- ности. Подпоследовательность, именуема?! вырезкой, перенумеровы- вается, начиная с единицы. Примеры вырезок: £ИСХМАС(£! .тП) отдельные элементы УКАЗАН А Ч:^КОН) совокупность компе не нт х:сли для именования совокупности компонент используется вырезка, то можно записать второй отрезок, который вырезает часть от нее (опять перенумеровывая) и т д< Примеры именования при помощи, нескольких отрезков: - УКАЗ( JA4: КОН, 2:5)
37 Если же при помощи отрезка-индекса именуется текст»скалярная переменная или указатель, то последующая запись отрезков, состоящих только из левых границ (индексов), равных единице, по существу ничего не меняет, так как переменная продолжает именовать ту же компоненту. Например, если А(£К) именует текст АВС, то АфК, I) А(4^С, I, I) и т, д. именуют тот же текст АВС. Следует иметь в виду, что последовательность фактических параметров макровызова (10.3.I) образует список, который имену¬ ется переменной ^SLIST и к компонентам которого можно обращатся как при помощи этой переменной, так и при помощи позиционных формальных параметров (10.3.2.?). Во втором случае первый ин¬ декс, задающий номер фактического параметра, отсутствует. Легко видеть, что доступ к элементу созданного в процессе вычисления многомерного массива может быть реализован при помощи вырезки, которая содержит индексы в количестве, равном размер¬ ности массива. Например, £M(^I,$J+I,3). Аналогичным образом может быть организован доступ к компо¬ нентам списка, содержащего несколько уровней подсписков. Напри¬ мер, для списка (А, (В,С, (D,E)),P) который именуется при помощи переменкой #Г, вырезка &Т(2/з,1) - именует текст D, - именует список (0,Е) - именует пустой текст £7(1:2) _ именует список (А,(В,С,(D,Е)) £7(4:5) _ именует пустой список (). 4Л0 Общий случай записи переменной с указанием включает запись отгеэков v «операций выделения последовательности оимв?- <- указанием^ деление подпоследовательности гсдпослед о в а гельхчос ги>: т»
38 /простая)>( ^отрезо^^.^отрезо^^^выделение^к^ыделение^) Первая альтернатива соответствует вырезке, которая лишь именует об’ект, и, следовательно, может быть использована как в правой, так и в левой части оператора присваивания. Вторая альтернатива описывает унарную операцию выделения над об’ектом, поименованным с использованием отрезков. Операция возвращает результат в виде последовательности символов. Перед выделением при необходимости происходит преобразование поименованного об1- екта в последовательность символов. Преобразования описаны в разделе (5.4). Полученная в результате последовательность нуме¬ руемся, начиная с единицы. Из результата выделения может быть вновь выделена подпоследовательность и т д. Примеры: £LIST(I:^A, 3,, I,£l) £CiTHCOK(^N,, 5,10,, 2,^К)
39 5. ВЫРАЖЕНИЕ 5Л Выражение описывает формулу для получения значения. Ниже приведено определение выражения. <3выражение>:: =<>он1 юнкция>[ОЯ <кон1 юнкция>1 <^кон1 юнкция>: :«<отношение>£АМО <отношение>^ <отношение>::=<простое выражение^[<операция отношения> ^простое выражение)»] ^простое выражение>::=<слагаемое>(^аддитивная операция> <множитель>: :=[МОТ]<^первичное^£в<первичное>^ <(первичное>:: «^арифметическая константа>| <Ьеременная>| <атрибут> | <строка>[<выделёние подстроки^ | «выражение^ Примеры выражений^ Первичные: I В'З8 X’F56 арифметические константы £СТ. £В(1,2) $C2(£A+I:3) $E^CD,,4,X’FA') переменные N'£A K'^LIST(I,8rH) A'ftB 'СТРОКА' '^М.ПРОД' ’IOIOIOOI'C^I.l) ($1 + 1) атрибуты строки выражение в скобках Множитель: NOT^L £СН($1).’АВ« £ALP..^BET ' ABgC* (£1,3).Р'$В Слагаемое: ДЛ«2 £CNT/5*£L ^CD*'101101'^1,1) Простое выражение: ДСЫТ+I $1»2+3-$М Отношение:
40 £1 6Т 1 *AB’ EQ '^E1 (£J, 2) £K*3 LT B’377» Кон’юнкции: AND^CL GT ^CHAR’f3,2) AND Выражения: £L AND ^CL OP ^PL 5.2 Порядок выполнения операций в выражении определяется скобками и приоритетом операций. В первую очередь выполняются выражения в индексных частях переменных - вычисляются границы отрезков, начало и количество в операциях выделения, затем выполняются унарные операции, вычисляются атрибуты и, наконец, выполняются бинарные операции. Операции в языке разбиваются на семь групп. Эти группы приведены ниже в порядке уменьшения их приоритета: унарная операция логического отрицания NOT операция конкатенации мультипликативные операции * / MOD аддитивные операции + - операции отношения LT LE EQ NE GE GT мультипликативная логическая операция AND аддитивная логическая операция OR Типы операндов и результат выполнения всех операций кроме операции отношения приведены в разделах, относящихся к соответ¬ ствующим типам об’ектов. 5.3 Знаки операций отношения являются совмещенными в том смысле, что они выполняют функции знаков операций для двух групп отношений - арифметических и текстовых. Арифметическое отношение есть отношение двух выражений, результатом вычисления которых являются арифметические величины. Отношение текстов выполняется если оба сравниваемых выражения имеют результаты в виде последо¬ вательности -тмволов. Если один из операндов операции отношения - строка символов, символьной переменная или выражение, в кото¬ ром последней, из выполняемых операций есть конкатенация или выделение : ^строки, то выполняется текстовое сравнение, в про¬
41 тивном случае - арифметическое. При необходимости операнды пре-* образуются к типу,который требуется выбранным вариантом сравне¬ ния» Ниже приведена расшифровка знаков операций отношения, LT меньше чем LE меньше или равно EQ равно NE не равно 6Е больше или равно 6Т больше чем Результатом операции отношения является булевская величина. Операции арифметического отношения определены обычным образом над неотрицательными числами меньшими 32768. Текстовые последо¬ вательности сравниваются лексикографически (слева направо). Из двух символов большим считается тот, чей код, рассматриваемый как положительное целое число, больше. Из двух последовательнос¬ тей больше та, у которой первый из неравных символов больше. Если у последовательностей с длинами Ы и М, N > М первые М символов равны, то последовательность длиной N больше. Логические об’екты в операциях отношения рассматриваются как арифметические со значениями I Ристина*) и 0 (’ложь*), 5Л В процессе выполнения операций в случае, если типы опер.гндов не соответствуют требуемым для данной операций, проис¬ ходит их автоматическое преобразование, В последовательность символов могут быть преобразованы лю¬ бые об’екты как скалярные, так и массивы и сконструированные. Арифметические об’екты преобразуются В'последовательности симво¬ лов, изображающие десятичные числа с ненулевыми первыми символа¬ ми, кроме числа нуль, которое преобразуется в символ 0, Булев¬ ские об’екты преобразуются в символы О н I. При преобразовании списка сначала, если необходимо, преобразуются его компоненты, а затем из них образуется символьная последовательность, ограни¬ ченная с двух сторон символами ( к ). Между компонентами вставляется символ (запятая). Запятая вставляется и в случае пустых компонент. Количество компонент равно атрибуту N для списка* Преобразование кортежей аналогично преобразованию спис¬ ков с той лишь резанце?;» что запятые и скобки ие вставляются.
42 При преобразовании связок между преобразованными компонентами вставляются точки* При преобразовании массивов также предвари¬ тельно преобразуются его компоненты, а затем из них путем последовательной записи образуется результат» Последовательности символов преобразуются в числа только в том случае, если они представляют собой изображение арифметичес- юЯ константы» Булевские об’екты преобразуются в числа О РжьП и I Ристина’). Легко видеть, что списки и кортежи не &огут быть преобразованы в числа, а массивы - лишь з случае, когда может быть преобразована последовательность символов, в которую преобразуется массив. Результатом преобразования служит остаток от деления на 32768. Число, отличное от нуля, при необходимости преобразуется в константу ’истина’, а равное нулю - в ’ложь1. В случае преобра¬ зования текста в булевскую константу, сначала происходит преоб¬ разование в арифметическую константу, а затем арифметическая преобразуется в булевскую.
43 б. ТЕРМИНАЛЬНЫЕ ПРЕДЛОЖЕНИЯ Терминальным является предложение исходной программы, 1вы- молнение’ которого состоит в получении из текста его записи последовательности символов и передачи этой последовательности в выходной файл. В языке реализовано два способа выделения терминальных предложений из последовательности предложений программы - по имени предложения и по первому символу. 6.1 В терминальных предложениях, которые выделяются по имешцв поле имени предложения должно быть записано имя, извес¬ тное транслятору как имя терминального предложения. Это может быть достигнуто записью этого имени в псевдокомментарии STEW (II.2). в поле операндов записывается набор - последовательность символов я переменных. ^терминальное по имени предложения^:« [^метка или элемент^ <Гимя (2.3)Х терминальное <набор> <Метка или элемент>: :«<метка следования)* [<элемент <кабор>: :«<простая>[<за просто^Г>^<наборУ|]1 <с точкой>г<набор>31 <"с указаниец^набор)]! ^симвоЛ>Г<наб op>J ‘ <(за простой>: :®<3HaK>[)|^z'пробел* В выходной файл передаются все символы, включая пробелы, от конца метки следования, если она записана, или от начала строчки до конца строчки кроме последних пробелов. В процессе передачи набора происходит замена переменных их значениями в виде после¬ довательности символов. Например, если переменная равна 10, то в случае терминального предложения М УМН «Ц^А.В’357’ УМНОЖЕНИЕ С МАСШТАБОМ
44 в выходной файл будет передан текст УМН жМЮВ!357’ УМНОЖЕНИЕ С МАСШТАБОМ Если в результате подстановки значений макропеременных дли¬ на последовательности символов превышает длину строчки, то в позицию продолжения заносится символ * и формируется вторая запись и т д. Терминальные предложения, выделяемые по имени, допускают запись продолжения как при помощи символа в позиции продолжения, так и + в первой позиции. Каждая строчка продолжения передается в выходной файл независимо от остальных. Если в результате подстановки значений переменных превышается длина строчки, то записывается символ продолжения и строчка продолжения сама про¬ должается на следующую строчку и т д. Независимость в передаче строчек продолжения в выходной файл нарушается лишь в случае, когда идентификатор переменной разрезается на две части концом строчки. При этом новая запись в выходном файле начинается не с начала строчки продолжения, а после достижения максимального числа символов в предыдущей запи¬ си. В случае, если строчка продолжения начинается с * в первой позиции, то пробелы между + и первым значащим символом в выходной файл не передаются. Пример ТЕРМ ТЕКСТ ТЕРМИНАЛЬНОГО £L МОЖЕТ + БЫТЬ ЗАПИСАН + НА НЕСКОЛЬКИХ СТРОЧКАХ Пусть значением будет последовательность символов - ПРЕДЛОЖЕНИЕ. Тогда в выходной файл будут переданы три записи. ТЕРМ ТЕКСТ ТЕРМИНАЛЬНОГО ПРЕДЛОЖЕНИЯ МОЖЕТ +БЫТЬ ЗАПИСАН +НА НЕСКОЛЬКИХ СТРОЧКАХ Если последовательность символов, составляющая имя предло¬ жения, может быть получена лишь после подстановки значений
45 переменных либо то, что это имя терминальное, станет известным лишь после просмотра последующих предложений программы (12.2), \ то 1редложение рассматривается как вызов макропроцедуры с име¬ нем, которое формируется в процессе работы программы. Однако, если после подстановки значений макропеременных окажется, что имя предложения - терминальное, то в результате в выходной файл будет передана запись: ОРО NAME OPi,OF2,...,Ki«OPKI,K2«OPK2,... Где NAME - имя предложения, ОРО - операнд в поле метки, 0PI - позиционный операнд с номером I, KJ - ключ с номером J, OPKJ - ключевой операнд с номером J. Если длина последовательности превышает длину строчки, то под¬ ставляется символ продолжения и формируется следующая запись и т д. Легко видеть, что в этом случае, во-первых, исчезают исходные комментарии и, во-вторых, строчки продолжения исходного текста и сформированного не совпадают. Пример: ТЕР£Т ПЕРВЫЙ, ОПЕРАНД + ВТОРОЙ, ОПЕРАНД Если Т - текст М, а ТЕРМ - имя терминального предложения, то в выходной файл попадет запись: ТЕРМ ПЕРВЫЙ, ВТОРОЙ 6.2 Существует три зарианта терминальных предложений» выде¬ ляемых по первому символу: <те;Финальное выделяемое по первому символу>::= '<грли.вольная послелогагельность символо.в> ! • ;'<Габо- (6 Р> .
46 * ^произвольная последовательность символов^ Наличие управляющих символов % или < означает, что в выход¬ ной файл передается только результат генерации набора или произ¬ вольная символьная последовательность без первых управляющих символов * % <• При отсутствии управляющих символов в выходной файл передается также символ *. В произвольной последовательнос¬ ти символов никаких подстановок не производится. Примеры: * СТРУКТУРА (X-А, НО^В, £С ) СТРУКТУРА (&А,НО£В,£С) *< СТРУКТУРА ($<А,НО£В,£С) Если £ А - текст ПРИМЕР, ^В - текст МЕР, а равна I, го в выходной файл попадут соответственно последовательности: * СТРУКТУРА (^А,НО£В,&С) СТРУКТУРА ( ПРИМЕР, НОМЕР, I) СРУКТУРА (^А, НО^В,^ )
47 7.ОПЕРАТОРЫ ПРИСВАИВАНИЯ. Операторы присваивания заменяют текущее значение об*екта арифметического, булевского или символьного типов новым» опреде¬ ляемым выражением в поле операндов оператора. <оператор присваивания?::«(оператор SETA?I (оператор SETB>| (оператор SE1C> 7.1. Оператор SETA используется для присваивания значений об’ектам арифметического типа. Значение выражения (или выраже¬ ний} в поле операндов при необходимости преобразуются к арифме¬ тическому типу. Если это невозможно» тс фиксируется ошибка. (Оператор SETA?: :«= (простой SETA?| (агрегативный SETA* «простой SETA?::® (переменная? SETA (выражение? В этом операторе переменная должна именовать скалярный арифмети¬ ческий обеект. (агрегативный SETA>::« (переменная? SETA (выражение?, (выражение>{, (выражение?^- В этом операторе переменная должна именовать арифметический массив. При выполнении оператора агрегативный SETA вначале вычисля¬ ются значения выражений из поля операндов. Затем эти значения последовательно присваиваются элементам массива» начиная с пер¬ вого. Если количество выражений меньше размерности массива, тс
48 оставшиеся элементы получают значение ноль, если больше - фикси¬ руется ошибка. Примеры: LCLA &А,&МА(4) &А SETA 5 i МА SETA &А+2,3*£А &МА SETA &МА(1)+Ш( 1),т(2)Ш1А(1),^А(3)+Л1ЛА(1) В результате выполнения этой последовательности операторов зна¬ чение переменной &А станет равным 5, а значениями элементов массива ^МЛ - 14,22,7,0. 7.2. Оператор SETB используется для присваивания значений об*актам булевского типа. Значение выражения (или выражений) в поле операндов при необходимости преобразуются к булевскому типу. Если это невозможно, то фиксируется ошибка. ^оператор SETB>::=<простой SETB> | <агрегативный SETB> <простой SETB>::= <переменная> SETB <выражение> В этом операторе переменная долю;а именовать скалярный булевский об’ект. <агрегативный SETB>::= <переменная> SETB <выражение>, <выражение>*[, <выражение>} В этом операторе переменная должна именовать булевский массив. При выполнении оператора агрегативный SETB вначале вычисля¬ ют ся значения выражений из поля операндов. Затем эти значения последовательно присваиваются элементам массива, начиная с пер¬ вого. Если количество выражения меньше размерности массива, то оставшиеся элементы получают значение ’ложь’, если больше - фиксируется ошибка.
4С Примеры: LCLB LCLA 43,4Ш(3) Й-А SETA 32 4-3 ’SETS (fcA QT 7) 4ВМ SETB 43, (4-A EQ 32) 4ВМ SETS (4-Б AND 4A LT 5), (434(2) AND 4»4(I) В результате выполнения этой последовательности операторов зна¬ чением переменной &В станет ’истина’, а значениями элементов массива - ’ложь’, ’истина’, ’ложь’. 7.3. Оператор SETC используется для присваивания значений об’ектам символьного типа. Значение выражения (или выражений) в поле операндов при необходимости преобразуются к символьному типу. Такое преобразование всегда возможно. <оператср SETC>:: = отрос той 8ЕТС>| <агрегативный SF.TO <простой SETC>:: = <переменная> SETC <выражение> В операторе простой SETC переменная должна именовать либо ска¬ лярный символьный об’ект, либо символьный массив. Если переменная именует скалярный об’ект, то присваиваются первые L символов значения выражения. Если же переменная именует символьный массив, то значение выражения присваивается элементам массива так,- как если бы последовательность элементов массива образовывала одну символь¬ ную переменную, размер которой равен максимальному числу . симво¬ лов в массиве (произведению L на размер массива). При этом символы выражения, которым не хватило места, отбрасываются. <агрегативный' SETC>:: = <переменна#> SETC <выражение>, <внражение>{, <выражение>*^
50 В этом операторе переменная должна именовать символьный массив. При выполнении оператора агрегативный SETC вначале вычисля¬ ются значения выражений из поля операндов. Затем первые L символов каждого значения последовательно присваиваются элементам массива, начиная с первого. Если количество выражений меньше размерности массива, то оставшиеся элементы получают значение ’пусто’, если больше - фиксируется, ошибка. Примеры: GrBLC &С SETC gfCM SETC frCM(5:7) SETC &C,fcCM(8) ’1234557890’ 'ЦИФРЫ-4С.7890’ ’ ЧЕТНЫЕ’ ,&СМ(, ,1, 5), ’ 24680’ Б результате выполнения этой последовательности операторов зна¬ чением переменной &С станет цепочка 123456 (предполагается, что 1=*6), а значениями элементов массива &СМ цепочки: ЦИФРЫ- 123456 7890 ’пусто’ ЧЕТНЫЕ ЦИФРЫ- 24680 ’пусто’
51 8. ОПЕРАТОР ИМЕНОВАНИЯ. Оператор именования используется для связывания переменной ссылочного типа с именуемым об’ектом. Именуемыми об’ектами могут быть связки, списки, кортежи, тексты, а также скалярные об’екты арифметического, булевского или символьного типое и их массивы. «оператор именования^:««простой ANEW> | «агрегативный ANEW> <простсй ANEW>::« <переменная>„указатель ANEW <об’ект> <об’ект>::=<связка>|«список>|<кортеж>|«текст>|<переменная> В операторе простой ANEW переменная-указатель должна быть пере¬ менной ссылочного типа. Если об’ект является об’ектом сконструированного типа (связкой, списком, кортежом или текстом) и представлен своим изображением, то после выполнения оператора ANEW указатель будет именовать сгенерированный экземпляр этого об’екта (4.6)О Если об’ект представлен скалярной переменной, то‘указатель будет именовать те же ее значения, что и данная переменная. Если об’ект - массив скалярных об’ектов, то именуется этот массив. Если же об’ект сам представлен ссылочной переменной, то сначала происходит разыменование, В результате, после выполнения оператора ANEW, указатель будет именовать сб’ект, который раньше именовался этой ссылочной переменной. Если об’ект опущен, id указатель будет именовать пустой текст. «агрегативный ANEW>: <переменная>_массив ANEW <последовагельность>„об’ектов «последовательностью<элемент(4.6.3)>{, JL,} «элемент:»} В операторе агрегативный ANEW переменная должна именовать массив
52 указателей. Об’екты именования представляют собой компоненты последова¬ тельности, определяемые по следующим правилам. - Если последовательность начинается (кончается) запятой, тс первая (последняя) ее компонента - пустой текст. - Две запятые, стоящие рядом, определяют компоненту- - пустой текст. - Каждый элемент определяет либо несколько компонент, либо одну, совпадающую с элементом. Более одной компоненты в составе элемента возможно только в режиме SMODE ОН ('4<ъЗ 12.1). Например, последовательность ,А,,В(С) состоит из четырех ком¬ понент - пустого текста, текста А, пустого текста и кортежа В(С). Выполнение оператора агрегативный ANEW начинается с генери¬ рования экземпляров сконструированных об’ектов и разыменования ссылочных переменных в последовательности об’ектов именования. Затем компоненты последовательности (об’екты именования) по по¬ рядку именуются элементами массива указателей. Если количество компонент меньше размерности массива, то оставшиеся элементы будут именовать пустой текст, если больше - фиксируется ошибка. Примеры: LCLP &г,&Р2,№4(2)ДРМА(2)ЛРй1А1(4),^РР(5) LCL.C &СМ(2) LCLA &АМ(2),&АМ2(Ь) если выполнены операторы &Р ANEW &СМ &Р2 ANEW &Р то следующие три оператора имеют одинаковый смысл; первому элементу массива СМ будет присвоена пеночка символов АВС. &СМ(:) SETC ’АРС* ПЕРС I Р СЕРА
53 Выполнение оператора fcPM ANEW &СМ.ЙАМ конструирует таблицу &РМ, первая строка которой состоит из двух переменных символьного типа, а вторая - из двух переменных арифметического типа. Операторы $та( I) setc ’вход’,1 выход1 &РМ(2) SETA 12,34 устанавливают значения ее элементов. Выполнение операторов &.PMAI(I:2) ANEW &АМ2(1:2),Ш2(3:4) №Ш(3:4) ANEW ММ2(5:5),£АМ2(7;8) &РМА ANEW ftPMAI(I:2)tfcPMAI(3:4) конструирует трехмерный массив арифметических скаляров АРМА. После выполнения оператора &РР ANEW , (А В С),ТЖЖ1\*АМ.(К1 К2) переменная &РР(1) будет именовать пустой текст, &РР(2) &РР(3) &РР(4) £РР(5) список (А В С), текст ТТВХОД (ДОМ(1)=ВХОД), кортеж &АМ*(К1, К2), пустой текст.
54 9. ОПЕРАТОРЫ УПРАВЛЕНИЯ. Операторы управления используются для изменения порядка выполнения операторов программы и дов, ветвлений и циклов. соператор управления>: :«»<оператор <оператор соператор соператор соператор оператор оператор оператор служат для организации перехо- AQO>| AIF с меткой»| A IF структуризованный» | ASELEC>| ASBCH>| AWHILE»| ACTS» | ANOP> 9.1. Оператор AGO используется для безусловного изменения порядка выполнения операторов. <оператор А£0>::= [<метка следования^ AGO Сметка следования>_переход Выполнение оператора AQO приводит к передаче управления операто¬ ру, в поле метки которого записана метка следования - переход. Пример. AGO .УЙТИ
55 9*2. Оператор AIF с меткой используется для изменения порядка выполнения операторов в зависимости от выполнения усло¬ вия. ^оператор AIF с меткой} [<метка следования}} A IF ( <выражение}_условие)<метка следования>_переход Выполнение оператора AIF с меткой начинается с вычисления условия. Результат при необходимости преобразуется к булевскому типу. Если результат - ’истина1, то происходит передача управле¬ ния оператору, помеченному меткой следования - переход. В про¬ тивном случае выполняется следующий оператор. Пример. AIF (’^ПАРАМЕТР’ EQ. ”). ПУСТО 9.3. Оператор AIF структуризованный на оснований истинности условия выбирает одну из двух последовательностей операторов. Этот оператор предполагает следующий порядок предложений. <оператор AIF структуризованный}::= [<метка следования}} AIF (<выражение>_условие) [[ A TRUE J последовательность операторов и терминальных}_если-истина] [ AFALSE «^последовательность операторов и терминальных}-если.ложь] [<метка следования}] AEND IF операторов и терминальных}::« «^последовательность ^оператор} {последовательность операторов и терминальных}} | <терминальное} {^последовательность операторов и терминальных}} Выполнение оператора AIF структуризованный заключается в
56 следующем. Вычисляется условие и его результат, если необходимо, преобразуется к булевскому типу. Затем выполняется соответствую¬ щая результату последовательность операторов. Если таковая опу¬ щена, то никаких действий не производится. Переход по метке следования, которой помечено последнее предложение оператора AEND, означает передачу управления следующему оператору. Пример. AIP (ЯА QT 7) SETA ДА-7 AFALSE i A SETA 7-JA AEND IF В результате выполнения этого оператора значением переменной станет равным I&A-7L 9 Л. Оператор ASEL.EC; используется для выбора следующего выполняемого оператора н-з. основании значения определяющего выра¬ жения. «операт op ASELEC>t:~ [<метка следования^ \SELEC <выражение>_ основа, <выбор>{, <выбор>} <выбор>: ? =(<выражение>_критерий)<метка следоЕанкя>и.переход Оператор выполняется следующим .образом. Вычисляется основа. Затем поочередно вычисляются критерии до тех пор, пока не будет совпадения результата со значением основы. После чего осущес¬ твляется переход по соответствующей метке следования. Тип опера¬ ции сравнения (арифметическое или текстовое) определяется по тем же правилам, что и в выражении. Если список выборов исчерпан, то выполняется следующий оператор Пример. ASELEC S '^ПАРАМЕТР, АТРИБУТ S О S? ^СПИСОК, ЕСЛИ ПАРАМЕТР СПИСОК (1КЛ ). КОМИ ЕСЛИ ПАРАМЕТР КОРТЕЖ
57 9.5. Оператор ASBCH предназначен для поиска текстов в массивах символьных переменных. «оператор ASBCH>::«= <переменная>.номер ASBCH <переменнаях.массив,<выражение>_текст, (<выражение>_начало, <выражение>-конец[,«выражениёхшаг] )<метка следования>_неудача Переменная номер, в которую записывается номер найденного эле¬ мента, должна именовать скалярный арифметический об’ект, а пере¬ менная массив - символьный массив, в котором ищется текст. Выполнение оператора начинается с вычисления выражений. Первые L символов значения выражения текст - это текст, который ищется в массиве. Значение выражения начало - это номер первого элемента, с которого начинается поиск. Если начало равно нулю или превышает размер массива, то фиксируется ошибка. Значение выражения шаг - это величина, которая добавляется (по модулю 32768) к номеру текущего элемента для получения следующего рассматриваемого элемента массива. Если шаг опущен, то подразумевается единица. Выражение конец определяет окончание поиска. Отрезок поиска - это диапазон значений номеров элементов массива, в пределах которого происходит поиск. Если выражение, определяющее оконча¬ ние поиска, символьного типа, то устанавливается признак ограни¬ чения поиска, а отрезок будет совпадать со всем массивом, если же не символьного типа, то его значение определяет одну из двух границ отрезка. Если это значение равно нулю или превышает размер массива, то граница будет равна соответственно единице или размеру массива. Другая граница отрезка поиска в этом случае равна значению выражения, определяющего начало поиска. Поиск начинается с того, что номер текущего элемента уста¬ навливается равным начальному значению. Цикл поиска заключается в следующем. Если значение текущего элемента совпадает с искомым текстом, то переменной номер присваивается номер текущего эле¬ мента и управление передается следующему оператору. Если совпа¬
88 дения нет, то при установленном признаке ограничения поиска, значение текущего элемента сравнивается с первыми L символами значения выражения, определяющего конец поиска, и, в случае совпадения, поиск заканчивается. Если же признак не установлен, то к номеру текущего элемента добавляется шаг. Если полученный в результате номер принадлежит отрезку поиска, то цикл повторяет¬ ся. В противном случае поиск заканчивается. Окончание поиска вызывает присваивание нуля переменной-номер и переход по метке следования-неудача. Примеры. ASIJCH &СМ,’**♦**’,(I,1•),НЕТРАЗДЕЛИТЕЛЯ Поиск осуществляется последовательным перебором элементов масси¬ ва ЮМ, начиная с первого, и происходит до тех пор, пока не встретится пустой текст. fcAM(4I) ASBCH &СМ,&ПАРАМЕТР, (N»£CM, 1,0-1).ОТСУТСТВУЕТ Поиск осуществляется последовательным перебором элементов масси¬ ва &СМ, начиная с последнего. Отрезок поиска совпадает со всем массивом. 9.6, Оператор AWHILE предназначен для организации циклов. Ему соответствует следующая последовательность предложений. «.оператор AWHILE>::« [<метка следования>} AWHILE (<выражение>в.условие.выполнения) последовательность операторов и терминальных>_цикла [<^етка следования)} AEND WHILE Выполнение оператора AWHILE заключается в выполнении после¬ довательности операторов цикла нуль или более раз. Условие выполнения цикла вычисляется и проверяется перед каждым выполне¬ нием операторов цикла, а результат, если необходимо, приводится к булевскому типу. Если это условие истинно, то последователь¬ ность операторов выполняется и вновь вычисляется условие, если
59 ложно, то выполнение оператора AWHILE заканчивается. Переход на метку следования, которой помечено последнее предложение AEND, означает обход оставшихся предложений цикла. Пример. LCLA &А,&МА(5) &Л SETA О AWHILE (&А LT N’&MA) &А SETA &A+I &ЫА(ЯА) SETA &А AEND WHILE Элементам массива &MA присвоятся значения 1,2,3,4,5. 9.7. Оператор ACTS используется для установки счетчика максимального числа изменений последовательного порядка выполне¬ ния операторов в макропроцедуре или в главной программе. При входе в макропроцедуру или главную программу этот счетчик полу¬ чает стандартное значение - 4096. Каждый раз, когда нарушается последовательное выполнение операторов, счетчик, соответствующий выполняемой макропроцедуре, проверяется на нуль и, если его значение не равно нулю, то оно уменьшается на единицу. При нулевом значении счетчика фиксируется ошибка. Если это происхо¬ дит в главной программе, то она завершается, если в макропроце¬ дуре, то осуществляется выход в главную программу. <оператор ACTR>:: = £<метка следования^ ACTR 4выражение>_новое_значение_счетчика Выполнение оператора АС ТВ заключается в присваивании счет¬ чику значения выражения. При необходимости значение сначала приводится к арифметическому типу. Примеры. АС ТВ 32000
во AC TH IOOO ч-М 9.8. Оператор ANOP не производит никаких действий. Как правило он используется для> записи метки следования в том случае, когда поле метки предложения, в котором она должна быть записана, занятое <оператор ANOP>::« [<метка следования’?] ANOP Пример. .МЕТКА ANOP М SETA М+1
61 10. МАКРОПРОЗИУРЫ. Макропроцедура ( или макроопределение) представ¬ ляет собой часть программы, выполнение которой осуществляется при помощи вызова макропроцедуры. 10.1. Определение макропроцедуры, происходит при ее описа¬ нии. Описание макропроцедуры начинается предложением MACRO и заканчивается предложением ’ZEND {описание макропроцедуры):: = 'UCB0[ TRACS] <прототип> [{последовательность описате лей)-гл обал ьных_и_ л окал ьны?;] [{последовательность операторов и терминальных>_тело_макросаЗ ({метка следования)} MEND {последовательность описателей):: = {описатель переменных)» ■£<описатель переменных)} Параметр TRACE означает трассировку вызовов данной макуопроцеду. ры в режиме печати ON,QEN (13.Т). 10.2е Предложение прототип описывает имя макропроцелуры» позиционные и ключевые формальные параметры, а также стандартные значения последних. {прототип)::= [{формальный параметр)] {имя макропроцедуры) ({формальные параметры)] {формальные параметры): :=<позиционные> [,{ключевые)] | {ключевые)
62 «позиционные»::=<перечисление»|«имя списка» «перечисление»: :=«формальный параметр»-[,«формальный параметр»^ <имя списка»::=«простая»_переменная(«арифметическая константа») «ключевые*»:: =«ключевой»£, «ключевой»} <ключевой>: :=<формальный параметр»= £<текст»-стандартное_значение] ^формальный параметр»: :««простая»..переменная Имя макропроцедуры служит для обозначения макропроцедуры и используется в операторе макровызова (10.3). Хотя имя может состоять более чем из L символов, значащими являются только первые L. Существует два способа определения списка позиционных фор¬ мальных параметров: перечислением и указанием имени списка. При перечислении каждый позиционный формальный параметр имеет свой собственный идентификаторе При втором способе единственная пере¬ менная именует весь список позиционных формальных параметров, а для указания отдельного параметра применяется вырезка (4.9). В скобках за переменной указывается максимально возможное число компонент списка позиционных фактических параметров при макровы¬ зове. При перечислении это число равно числу позиционных фор¬ мальных параметров. Стандартным значением позиционных формаль¬ ных параметров является пустой текст. Цепочка символов, получающаяся из идентификатора ключевого формального параметра отбрасыванием первого символа &(амперсенд), называется ключом. Ключ используется для задания соответствия между фактическими и формальными ключевыми парамет¬ рами. Первые L-I символов ключа - значащие. Текст - стандартное значение ключа - не должен содержать переменных. Если стандар¬ тное значение ключа опущено, то им является пустой текст. Примеры прототип-предложений: 1ШГКА ПЕРЕХОД ЙГСЛОВИЕ,Й<Ш« С Ш ШД(ЗО), ЖЗУЛЬТАТзОСТШ
63 10,3. Оператор макровызова требует выполнения макропроцеду- ры<» Он устанавливает соответствие между фактическими параметра¬ ми, заданными в макровызове, и формальными параметрами в вызыва¬ емой макропроцедуре. Фактическими параметрами могут быть связки, списки, кортежи, тексты, переменные. Имя вызываемой макропроцедуры, или способ его вычисления, указывается в поле имени предложения. Отметим, что каждая мак¬ ропроцедура идентифицируется полным (составным) именем, которое определяется именем пакета и именем макропроцедуры в нем (12.3.1). Правила определения полного имени макропроцедуры по указанному в операторе макровызова неполному рассматриваются ниже. <оператор макровызова?::» [коб’ект в поле метки?] вызываемая макропроцедура? [/параметры^ <об’ект в поле метки?::=<метка следования?|<элемент(4.6.3)? <параметры>: :=<позиционные фактические? £,<список ключевых?] | Список ключевых? <позиционные фактические?:: ^последовательность? Список ключевых?::=<ключевой фактический? -{,<ключевой фактический?} <ключевой фактический?: ;=<текст?__ключ«= £<последовательность?.значение] «(последовательность?: : = {,} <элемент?{, {,}<элемент?}{,} ^вызываемая макропроцедура?::=<полное?^имя|<неполное>-имя <полное?:: = [<набор(6.1)?_имя.пакета].<набор?_имя_макропроцедуры «(неполное?: :=<набор?-имяв.макропроцедуры При записи изображений наборов, определяющих имя вызываемой макропроцедуры, необходимо соблюдать следующие ограничения: - нельзя использовать символы .(запятая), ’пробел1 и .(точка), - набор, значение которого есть имя пакета, нельзя заканчивать простой переменной (необходима переменная с точкой). Если имя вызываемой м^кропроцедуры содержит переменные, то вызов называется динамическим, в противном случае статическим. Допускается рекурсивный вызов макропроцедур, т.е. макропро¬ цедура может вызвать саму себя непосредственно или косвенно.
84 IO. 3.1. Фактическме параметры. Если число компонент элемента в поле метки больше одной, то фактическим параметром в поле метки является список, компоненты которого совпадают с компонентами элемента. Если же элемент состоит из одной компоненты, то фактическим параметром является эта компонента. Если элемент опущен, то фактический параметр - пустой текст. Позиционными фактическими параметрами являются компоненты последовательности, которые определяются по тем же правилам, что и об’екты именования в операторе агрегативный ANEW (8). Если число компонент последовательности-значения ключа больше одной, то фактическим параметром для данного ключа будет список, компоненты которого совпадают с компонентами последова¬ тельности. Если же последовательность состоит лишь из одной компоненты, то фактическим параметром для данного ключа будет эта компонента. Если последовательность-значение ключа опущена, то фактическим параметром для указанного ключа является пустой текст. Пример (в режиме SMODE ON). А+В ВЫЗОВ ,А.В,£Хч4(У),КЛ«В,С Фактическим параметром в поле метки в данном макровызове являет¬ ся список, который состоит из компонент текстов А,+ и В. Позиционными фактическими параметрами являются: пустой текст, связка А.В, переменная &Х, текст +, кортеж Ф(У). Фактическим параметром, соответствующим ключу ICJI, является спи¬ сок (3,С). 10.3.2. Соответствие между фактическими и формальными пара¬ метрами определяется либо порядком фактических параметров (пара¬ метр в поле метки и позиционные параметры), либо при помощи именования требуемого параметра (ключевые параметры). Если речь идет о позиционных параметрах, то фактический параметр соответ¬ ствует формальному в той же самой позиции списка параметров. Для ключевых параметров соответствующий формальный параметр либо явно указывается ключом, либо текстом, значение которого есть
65 ключ. Ключевые параметРы записываются в любом порядке. 10.3.2.1. Ключевой параметр SLIST играет особую роль. Если его значением является список или массив, то каждая компонента списка или массива будет соответствовать позиционному формально¬ му параметру с тем же номером. Если же его значением является связка, кортеж, текст или скалярный об,екч‘, то такой об’ект будет соответстЕать первому позиционному формальному параметру. При использовании ключа SLIST позиционные фактические параметры должны быть опущены. Пример. ХОД SLIST=(A, Б, С) Данный макровызов эквивалентен макровызсву ХОД А, В, С 10.3.2.2. Системная переменная &SLIST именует список пози¬ ционных фактических параметров. Идентификатор этой переменной можно использовать в прототип-предложении при описании позицион¬ ных формальных параметров (10.2). Атрибут N'&SLIST равен числу компонент списка позиционных фактических параметров. Например, если выполняется макровызов макропроцедуры ХОД из последнего примера, то переменная &SLIST в макропроцедуре имену¬ ет список (А, В,С). 10.3.3. Процесс вызова макропроцедуры заключается в следую¬ щем. Вычисляется имя макропроцедуры, если это динамический вы¬ зов, и устанавливается соответствие между именем и описанием макропроцедуры. Затем генерируются экземпляры фактических пара¬ метров (в случае, если последние являются сконструированными об1актами и представлены своими изображениями), разыменовываются ссылочные переменные, выступающие в качестве фактических пара¬
68 ветров, вычисляются тексты - значения ключей. После чего уста¬ навливается соответствие между фактическими и формальными пара¬ метрами. В результате формальные параметры будут именовать об’¬ екты, представленные соответствующими фактическими параметрами. Если фактический параметр - переменная, именующая скалярный об’ект или массив скаляров, то соответствующий формальный пара¬ метр будет именовать этот же об’ект. Это позволяет в макропроце¬ дуре не только использовать, но и изменять значение такого об’екта, передаваемого ей как фактический параметр. Те формаль¬ ные параметры, для которых фактический параметр не указан, будут именовать свое стандартное значениес Далее выделяется память под локальные скалярные об’екты и устанавливаются их начальные зна¬ чения. Для арифметических - ноль, для булевских - ’ложь’, для символьных - пустой текст. Локальные переменные ссылочного типа будут именовать пустой текст. Затем выполняется последователь¬ ность операторов и терминальных предложений, составляющая тело макропроцедуры. При завершении работы, память, используемая мак¬ ропроцедурой и оператором макровыэова освобождается. Управление передается оператору, следующему за макровызовом (исключением может быть выполнение оператора MEXITL (10.4) и MSTOP (10.5)). 10.4. Операторы выхода из макропроцедуры заканчивают ее выполнение. {оператор выхода}::«{оператор МЕХ1Т>| {оператор MEXITL7 {оператор МЕХ1Т>::» [{метка следования}] MEXIT Этот оператор реализует выход из макропроцедуры. {оператор MEXITL>::« [{метка следования}] MEXITL Оператор MEXITL реализует выход из макропроцедуры в главную программу, "и прекращает выполнение всех макропроцедур, вызов которых был инициирован оператором макровыэова в главной прог¬
87 рамме. Операторы MEXIT и MEXITL не разрешается использовать в главной программе. Отметим, что предложение MEND не только завершает описание макропроцедуры, но.и, аналогично предложению MEXIT, осуществляет выход их макропроцедуры. 10.5. Оператор завершения используется в том случае, когда дальнейшее выполнение программы бессмысленно. <оператор завершениях : = [сметка следования?] MSTOP Оператор завершения прекращает выполнение программы и посылает в файл ошибок сообщение: ЗАВЕРШЕНИЕ ПО MSTOP. Оператор завершения не разрешается использовать в главной программе. 10.6. Оператор сообщения используется либо для печати сооб¬ щения в листинге главной программы, либо для посылки в файл ошибок сообщения об ошибке. <оператор сообщениях : = [<метка следования?} MNOTE <код>,4набор>-сообщение <код>::«*|<арифметическаг константа? При выполнении оператора MNOTE вычисляется текст сообщения. Если код - * или ноль, то текст сообщения печатается в листинге главной программы. В противном случае сообщение посылается в файл ошибок и предложение макровызова главной программы, которое инициировало выполнение оператора MNOTE, отмечается как ошибоч¬ ное. Код ошибки, который сопровождает сообщение об ошибке, совпадает с указанным кодом. Сн должен быть меньше 1000. Это
68 связано с тем, что сообщения об ошибках в программе на языке МАКРОКОД-81 сопровождаются кодом большим или равным 1000. Примеры. MNOTE *,ТАБЛИЦА СОДЕРЖИТ $1 ЭЛЕМЕНТОВ Комментарий о количестве элементов таблицы будет напечатан в листинге главной программы при соответствующем режиме печати. MNOTE 7, ОБ ’ЕКТ ^ПАРАМЕТР НЕ ОПРЕДЕЛЕН Если значением переменной ^ПАРАМЕТР является текст СУММА, то в файл ошибок попадет сообщение ОБ’ЕКТ СУММА НЕ ОПРЕДЕЛЕН которое будет сопровождаться кодом 241. 10.7. Системная переменная iSNDX используется для генериро¬ вания несовпадающих имен при повторном вызове одной и той же макропроцедуры. Макропроцессор имеет счетчик вызовов, который увеличивается на единицу всякий раз, когда вызывается макропро¬ цедура, использующая переменную &SNDX. Начальное значение этого счетчика равно нулю. Значением переменной &SNDX является текст из трех символов, совпадающий с шестнадцатиричным представлением счетчика вызовов в момент входа в макропроцедуру. Например, если счетчик равен 31, то значением переменной iSNDX является текст OIF.
II, ПРОГРАММА, Программа состоит из главной программы, которой могут пред¬ шествовать описания макропроцедур, об’единенных в пакеты. 4программа>::= (^последовательность описаний пакетов») <главная программа> Hol. Главная программа состоит из последовательности опе¬ раторов и терминальных предложений, перед которой могут стоять описатели глобальных и локальных переменных. <главная программа4»::= ^последовательность описателейх.глобальных_и_локольных} последовательность операторов и терминальных> Выполнение программы начинается с первого предложения главной программы, следующего за описателями. II.20 Идентификаторы локальных переменных и меток следова¬ ния локализованы в макропроцедурах и главной программе, в кото¬ рых они определены. Определить метку следования - значит поме¬ тить ею некоторый оператор или терминальное предложение. Иденти¬ фикаторы формальных параметров локализованы в макропроцедурах, в которых они описаны.
70 II. 3. Пакеты - это совокупности макропроцедур. Имена макро¬ процедур локализованы в пакете. Существуют поименованные пакеты и главный пакет. Описание поименованных пакетов начинается предло¬ жением МРАСК и заканчивается предложением MPEND. Несколько опи¬ саний одноименных пакетов, которые могут находиться в последова¬ тельности пакетов перед главной программой, об’единяются и сос¬ тавляют один пакет. Главный пакет состоит из тех макропроцедур, которые не попасли в поименованные пакеты. {последовательность описаний пакетов>::= {описание макропроцедуры> [{последовательность описаний пакетов>] | {описание поименованного пакета> [{последовательность огисаний пакетов>] {описание поимнованного пакета>::= МРАСК [ TRACE] {заголовок пакета> [{последовательность глобальных>_переменных_пакета] -({описание макропроцедуры>} MPEND {заголовок пакета>::= <имя>_пакета {последовательность глобальных>::= {описатель глобальных обвектов> -[{описатель глобальных об’ектов>] Если присутствует параметр TRACE в описании поименованного паке¬ та, то это означает, что вызов каждой макропроцедуры, описание которой находится в данном описании пакета, будет трассироваться в режиме печати ON.GEN (13.4).
71 II»3.1. Полное имя макропроцедуры состоит из двух имен: имени пакета и имени макропроцедуры в нем. При записи полного имени, составляющие его имена, записываются через точку. ^полное имя>::«[<имя>_пакета].<имя>-макропроцедуры Если имя пакета опущено, то речь идет о полном имени из главного пакета. Примеры. ПАЧКА. ТЕСТ - макропроцедура ТЕСТ из пакета ПАЧКА .ИСХОД - макропроцедура ИСХОД из главного пакета. II.3.2. Локализация имен макропроцедур в пакете. Если в операторе макровызова задано неполное имя вызываемой макропроцедуры, то оно может быть лишь именем макропроцедуры из пакета, в котором стоит такой оператор. Макропроцедуры главного пакета доступны в указанном смысле для использования в главной программе. Для того, чтобы сделать доступными в главном пакете и главной программе (или в поименованном пакете; макропроцедуры других пакетов, в случае обращения с неполным именем, необходимо специальное указание (12.3). Если в операторе макровызова задано полное -имя макропроце¬ дуры, то оно может быть лишь именем макропроцедуры из указанного пакета. Но если в этом пакете имеется указание о доступности макропроцедур других пакетов, то макропроцедура берется из дру¬ гих пакетов, при условии, конечно,' что она в данном пакете не определена. II.4. Глобальные переменные служат для связи макропроцедур. Если глобальная переменная используется макропроцедурой (или главной программой), то она должна быть в ней описана. Связь через глобальные переменные определяется следующими правилами: - одинаковые имена глобальных переменных, которые описаны в главной программе, в какой-либо макропроцедуре главного пакета или в каком-либо поименованном пакете (описание глобальных пере¬
72 менных вслед за именем пакета), представляют один и тот же об’ект; - одинаковые имена глобальных переменных, которые описаны в разных макропроцедурах одного и того же поименованного пакета или в самом этом пакете, представляют один и тот же об’ект. Во всех остальных случаях глобальные переменные с одинако¬ выми именами представляют различные об’екты. II.4.1. Размер массива глобальных переменных указывается при описании массива. Но если при описаниях глобальной перемен¬ ной - массива, представляющей один и тот же об’ект, указываются различные числа элементов массива, то действительное число эле¬ ментов определится из последнего описания этой переменной в тексте программы.
73 12. УПРАВЛЕНИЕ ТРАНСЛЯЦИЕЙ. Предложения для управления трансляцией записываются также, как и предложения-комментарии, но выделяются тем, что сразу же за символами признаками комментария в* следует одно из заре¬ зервированных слов SMODE, STEBM, SUSE, SE4PL. Такие комментарии называятся псевдокомментариями. Они позволяют упростить запись программы за счет подразумеваемых компонент. Как и у коммента¬ рия, у псевдокомментария не может быть продолжения. 12.I. Псевдокомментарий SMODE используется для включения и выключения режима, который указывает на.способ генерирования экземпляров об’ектов сконструированного типа в операторах ANEW и макровызова. <псевдокомментарий SMODE>::= .*SMODE {включить или выключить> {включить или выключить>::=ON|OFF On включает режим, OFF выключает. Стандартное значение ON, т.е. режим включен. При включенном режиме макропроцессор выделяет цепочки из специальных знаков к?-к отдельные компоненты в изобра¬ жении элемента. Эквивалентом действия режима является запись запятых в изображение элемента между цепочками из специальных знаков (если цепочка не является частью строки (4.6.1)) и буквами, цифрами, точками, строками, переменными, а также между цепочкой и откры¬ вающей скобкой, если она стоит справа от цепочки, и между закрывающей скобкой и цепочкой, если она стоит слева от цепочки. Область действия псевдокомментария SMODE заканчивается либо другим псевдокомментарием SMODE, либо предложениями МФП или MPEND, которые восстанавливают стандартное значение режима. Примеры.
74 LCLP *P,4PM(3) . «S'-JODF. OFF »P ANEW (А+В)Л &P именует кортеж (A+B)/C &?(I) список (A+B) fcP(2) текст /С &P(I, I) текст A+Be .*SMODE ON &PM ANEW (A+B)/C fcPM(I) именует список (A+B) &РМ(2) текст / iPM(3) текст C 8tPM(I, I) текст A &PM(I, 2) текст + £PM(1,3) текст В. 12.2. Псевдокомментарий STEBM используется для имен терминальных предложений того пакета, в котором определения он записан. <псевдокомментарий STEBM>::« .* STEBM <имя>_терминальное{,<имя>-терминальное} Псевдокомментарий STEBM для пакета Р, в котором он записан, и для каждого терминального имени Т, которое указано в псевдоком- ментарии, определяет область (Р,Т) - часть текста программы, которая начинается данным псевдокомментарием и заканчивается либо описанием макропроцедуры с тем же именем Т, либо концом программы. Область (Р, Т) характеризуется тем, что ~ любое предложение из этой области, в поле имени которого записано полное имя Р.Т (или .Т , если Р - главный пакет) считается терминальным, - любое предложение из пересечения этой области с пакетом Р (если Р - главный, то с главным пакетом и главной программой), в поле имени которого записано имя Т, считается терминальным.
75 В пределах пакета (или в главном пакете и главной програм¬ ме) возможно чередовать свойство некоторого имени быть либо терминальным, либо именем макропроцедуры. Последнее его свойство является окончательным и показывает, как это имя определено в пакете. Таким образом для любого имени можно сказать, что оно либо не определено в пакете, либо является терминальным, либо именем макропроцедуры. Следовательно, если описание некоторой макропроцедуры стоит до определения терминального имени, совпа¬ дающего с именем макропроцедуры, то эта макропроцедура никогда не выполнится. Сто единственный способ переопределения макропро- цедур. Если предложение, в поле имени которого записанс либо Т (предложение в пакете Р), либо Р.Т, стоит вне области (Р,Т), то оно рассматривается как макровызов. Выполнение такого предложе¬ ния, если имя Т оконочательно определено в пакете Р, как терминальное, осуществляется по правилам, описанным в 6.I.. Если это имя не определено в пакете Р, то его определение может браться из других пакетов (см. ниже псевдокомментарий SuSE), если же оно не опеределено к там, то фиксируется ошибка. Пример записи псевдокомментария STEPI4. МРАСК АСТРА .*8ТЕШ КОЦД,СЧ, ЗП MPEND Имена КОЦЦ, СЧ, ЗП об’являются терминальными в пакете АСТРА. 12.3. Псевдокомментарий SuSE служит для указания пакетов, из которых можно заимствовать определение имени (либо как имени макропроцедуры, либо как терминального имени) в том случае, если оно не определено в пакете (или главном пакете и главной программе), в котором записан псевдокомментарий SuSE. Этот псев- доко'/ментарий может быть записан в любом месте пакета (или главного пакета и главной программы).
78 <псевдокомментарий SUSE>::= .*SUSE <имя пакета>£,<имя пакета>} <имя пакета>::«<имя>|. Порядок имен пакетов в списке показывает из какого следующего пакета будет браться определение имени, если в предыдущем пакете это имя не определено. Если несколько имен в списке совпадают, то берется только первое. Главный пакет указывается символом .(точка).- Несколько псевдокомментариев SuSE эквивалентны одно¬ му, список имен которого получается об’единением списков, причем порядок объединения совпадает с порядком следования псевдоком- ментариев. Пример. МРАСК ТИП .♦SUSE АСТРА, УПД • • ♦ • • о MACRO ПРИМЕР ВЫЗОВ А, В MEND MPEND Это означает, что если имя ВЫЗОВ не определено в пакете ТИП, то его определение будет браться сначала из пакета АСТРА, затем (если имя не определено в пакете АСТРА) из пакета УПД. 12.4. Псевдокомментарий SIMPL используется для указания начала режима подстановки имени предложения. <псевдокомментарий SIMPLEX:= .♦SIMPLE £<имя' подстановки>[, <арифметикеская кснстанта>"^3 <имя подстановки>::=<имя>|<полное имя>
77 Любое предложение языка, за исключением комментариев и терминальных, начинающихся символом ♦ , можно представить в виде: [<левая часть>Д<разделитель><текст, начинающийся не пробелом> где левая часть - это либо метка следования, либо элемент, а разделитель - это цепочка пробелов. В режиме подстановки подсчитывается число пробелов раздели¬ теля. Если это число больше или равно значению константы, указанной в псевдокомментарии SIMPL, то считается, что именем предложения является имя подстановки, а текст, начинающийся с символа, отличного от пробела, определяет поле операндов. Если же число пробелов меньше значения константы, то предложение рассматривается в обычном смысле. Если константа опущена, то подразумевается 0. Отсутствие имени подстановки означает отмену режима подстановки. Область действия псевдокомментария SIMPL заканчивается либо другим псевдокомментарием SIMPL, либо предложениями MEND или PEND, при условии, конечно, что режим подстановки позволяет их обнаружить. Примеры. .♦STEBM Т .«SIMPL Т,0 А (В С) это терминальное предложение, в выходной файл посылается текст: А (В С). •«SIMPL EXPR.2 М ЕХРВ (Х-А+В) М (Х-А+В) Если EXPR - имя макропроцедуры, то два последних предложения имеют одинаковый смысл.
78 12.5. Атрибут М используется для определения доступности макропроцедуры. Если переменная, у которой берется атрибут, именует скаляр¬ ный об’ект, значением которого является имя макропроцедуры, то определяется доступность кГакропроцедуры из главного пакета. Если же переменная именует об’ект, состоящий более чем из одной компоненты, то определяется доступность макропроцедуры, имя которой есть значение второй компоненты, из пакета, имя которого есть значение первой компоненты. Если первая компонента - пустой текст, то определяется доступность макропроцедуры из главного пакета. Атрибут принимает два значения: ’истина’(доступна’) и ’ложь’ (недоступна”). Примеры. LCLB &в LCLC &C,iMC(3) SETC ’ПЛЮС’ А15' (NOT М'&С).НЕТМАКРО Если макропроцедура ПЛЮС недоступна в главном пакете, то выпол¬ няется переход по метке следования .HEIMAKPO. &МС SETO ’УПД’,’НАЙТИ’ iB SETS М’АМС Значением булевской переменной &В будет ’истина’, если макропро¬ цедура НАЙТИ доступна из пакета УЦД, и ’ложь1 в противном случае.
76 13. ЛИСТИНГ. В процессе работы макропроцессор печатает листинг. Он сос¬ тоит из трех частей. В первой части печатаются тексты предложений, предшествую¬ щих главной программе. Во второй части печатаются предложения главной программы, сообщения, тексты предложений выходного файла и трассировки вызовов макропроцедур. В третьей части (листинге ошибок) печатаются сообщения об ошибках. 13.I. Строки первой и второй частей листинга состоят из шести полей. ТЕКСТ ПРЕДЛОЖЕНИЯ - в этом поле печатаются тексты предложений программы, сообщения, тексты предложений выходного файла, трассировки вызовов макропроцедур. ИСХ - в этом поле печатается порядковый номер строчки предложе¬ ния программы, которому соответствует печатаемый текст. Для первой и для второй частей листинга печатаемый номер совпадает с номером строчки в исходной программе. В остальных случаях он равен номеру первой строчки предло¬ жения, которое вызывает печать текста. ВЫХ - это поле заполняется только во второй части листинга. В нем печатается либо номер записи в выходном файле для генерируемых текстов, либо номер следующей генерируемой записи для предложений главной программы и трассировок. УРВЛ - это поле заполняется только во второй части листинга. В нем печатается число, равное уровню вложенности той мак¬ ропроцедуры, из которой инициируется печать строки. Уро¬ вень вложенности главной программы ревен нулю, уровень вложенности макропроцедуры, которая вызывается из главной программы, равен I и т.д.. ТИП - это поле заполняется только во второй части листинга. В
80 нем печатается одна из трех букв Т, Q, N, указывающая тип печатаемого текста. Их значение: Т - трассировка & - генерируемый текст N - сообщение. ОШИБКИ - в этом поле отмечаются ошибочные предложения с точки зрения макропроцессора и предложения главной программы, приведшие к выполнению оператора MNOTE с ненулевым кодом. Печатается текст: ОШ«код ошибки>. 13.2. Листинг ошибок состоит из трех полей. ГДЕ - в этом поле печатается номер первой строчки исходного предложения, в котором обнаружена оибка. КОД - в этом поле печатается код ошибки. КОММЕНТАРИЙ - в этом поле печатается сообщение, поясняющее в чем состоит ошибка. Если ошибок не обнаружено, то листинг ошибок состоит из одной строки: ОШИБОК НЕТ. В противном случае он начинается строкой: ЧИСЛО ОШИБОК « «число ошибок?. 13.3. Управление первой частью листинга осуществляется предложением SPRINT. «предложение SPRINT?::= SPRINT [«режим печати?}[,«подробность?} [.«редактирование первой части?} «режим печати?::-ON|OFF «подробность?::«NOGEN|GEN{TRACE «редактирование первой части?::« ( [«позиция?-имени} [,«позиция?_операндов} ) «позиция?::««арифметическая константа? Значения параметра режим печати: ON - печатать,
81 OFF - не печатать. Это стандартное значение параметра. При таком его значении печатаются только ошибочные предложения программы. Значения параметра подробность не влияют на печать первой части листинга, о них будет сказано ниже. Значения параметров редактирования: позиция имени - при печати редактировать так, чтобы имя предло¬ жения по возможности печаталось с указанной позиции. Стан¬ дартное значение равно L+1. Если указан ноль, то редак¬ тирование, связанное с положением имени, не производится; позиция операндов - при печати редактировать так, чтобы поле операндов по возможности печаталось с указанной позиции. Продолжения предложения на следующей строчке печатаются с этой же позиции. Стандартное значение равно 2L+I. Если указан ноль, то данное редактирование блокируется. Для выделения предложений, составляющих тело цикла (или ветвь оператора AIF структуриэованный), позиция имени и позиция опе¬ рандов этих предложений при печати сдвигаются вправо относитель¬ но соответствующих позиций предложения AWHILE (AIF), а предложе¬ ние AENJ>, которым заканчивается оператор, печатается с такими же параметрами, что и первое предложение оператора. Такое редакти¬ рование производится только в первой части листинга, при усло¬ вии, что параметры редактирования не равны нулю. Предложение SPRINT определяет начало области программы, в которой предложения печатаются в соответствии с параметрами печати. Каждое последующее предложение SPRINT определяет начал* другой области, параметры печати которой либо явно определяются в предложении SPRINT, либо передаются из предыдущей области (опущенные параметры). Начало программы определяет область с параметрами: OFF,NOGEN,(L+I,2L+I). Пример. SPRINT ON, TRACE, (10, 20)
82 13.4. Управление второй частью листинга осуществляется опе¬ ратором APRINT. «оператор APSINT>::= [«метка следования^ APBINT [/режим печати^ [, «подробность^ [.«редактирование второй 4acTM>]‘[,OWN} «редактирование второй части>::= ( [«выражение>__поэиция-имени] [, <выражение>_ позиция.операндов] ) Значения параметра подробность: NOQEN - при включенной печати печатать только предложения глав¬ ной программы и сообщения. Это стандартное значение режима. QEN - при включенной печати печатать предложения главной прог¬ раммы, сообщения, генерируемый текст и трассировать вызовы макропроцедур, имеющие указание трассировки (параметр ТРАСЕ) в описании. TRACE - при включенной печати печатать предложения главной программы, сообщения, генерируемый текст и трассировать Есе макровызовы. Перед выполнением главной программы значения параметров печати устанавливаются такими, какими они остались от первой части листинга. Выполнение оператора APRINT с опущенным параметром OWN заключается в установке тех параметров печати, которые в нем указаны. Остальные параметры не изменяют¬ ся» Оператор APRINT с параметором OWN влияет на печать только того предложения главной программы, которое инициировало выполнение данного оператора. Параметры печати при этом не изменяются. Вторая часть листинга формируется следующим образом. - Вначале печатаются (здесь и ниже подразумевается, что только в режиме печати ON) описатели глобальных и локальных переменных главной программы. - При каждом выполнении предложения оно печатается в соответ¬ ствии с теми параметрами печати, которые были установлены к моменту начала его выполнения. Однако предложения-макровызовы инициирующие выполнение одного или нескольких операторов APRINT с параметром OWN, печатаются в соответствии с теми
83 параметрами, которые эти операторы устанавливают. - За макровызсчом в соответствии со значение.’* параметра подроб¬ ность печатаются сообщения, генерируемые тексты, трассировки, определяемые данным макровызовом. - Предложения-комментарии главной программы печатаются столько раз, сколько выполняются предшествующие ии выполняемые гред- ложенияс Замечание. Генерируемые предложения (записи выходного файла) при печати во второй части листинга не редактируются. Примеры. APRINT OFF, NOQEN, (ftSPRNM+2,&SPROP+2) APRINT ON, (II, 19),OWN 13.5. Системные переменные &SLN1ZB, iSPRKt,i.$PR>T, 2JrSPBNV, fcSPROP. Значением арифметической переменной iSLNMB ярчтяется поряд¬ ковый номер первой строчки предложения главной программы, выпол¬ нение которого осуществляется в данный момент. Значениями символьных переменных iSPRR£ и 4SPRDT являются соответственно значения режима печати (ON, OFF) и значение параметра подробность (NOQEN, QEN, TRACE). Значениями арифметических переменных frSPRNM к &SPROP явля¬ ются соответственно параметры редактирования при печати: позиция имени и позиция операндов.
84 ЛИТЕРАТУРА. 1. П. Бряум Обзор ^препроцессоров, Статистика, 1975, Москва. 2. П. Браун макропроцессоры и мобильность программного обеспече¬ ния, Мир, 1977, Москва, 3. В«!л. .Лихелев, пик,С. Штаркман, МАКРОКОД, Институт прикладной математики АН СССР, препринт 24, 1972, Москва. 4. Б.С. Хусаинов Макросредства в языке Ассемблера ЕС ЭВМ,' Статистика, 1978, Москва. 5. В.М. Михелев, В.Ю. Вершубский, АСТРА язык для записи алгорит¬ мов системного программирования и трансляции, Институт прикладной математики АН СССР, препринт 16, 1974, Москва. 6. В.С. Штаркман, АВТОКОД БЕМШ, Институт прикладной математики АН СССР, препринт, 1969, Москва. В.М. Михелев, В.II. Стефанов * МАКРОКОД-81 ( описание языка ). Редактор Е5.С. Ярошео.кий. Корректор А.К. Петренко. 055 (02)2 © Подписало к печати 05.01.83 г. К> 'Г-03407. Заказ № 24. Формат бумаги 60X90 1/16. Тираж 380 экз. Объем 4,0 уч.—изд,л. Цена 28 коп. Отпечатано на ротапринтах в Институте прикладной математики АН СССР Москва, Миусская пл, 4-»
Пена 2 8 коп,