Описание языка Глагол

ЯНВ | ИЮЛ | МАР
| 10 |
2010 | 2012 | 2013

39 captures 20 апр 04 - 13 мар 13 |

Close Help

Описание языка Глагол

Октябрь 2008г.

Что на уме, то и на языке.

# Оглавление

- Введение
- 1. Условные обозначения
- 2. Слова языка
- 3. Объявления и области действия понятий
- 4. Объявление постоянной
- 5. Объявление вида

  5.1. Простые виды

  5.2. Вид РЯД

  5.3. Вид НАБОР

  5.4. Вид ДОСТУП

  5.5. Вид БЕГУНОК

  5.6. Вид ЗАДАЧА

- 6. Объявление переменных
- 7. Выражения

  7.1. Данные

  7.2. Действия

  - Логические действия
  - Арифметические действия
  - Действия над множествами
  - Отношения
- 8. Указания

  8.1. Присваивание

  8.2. Вызов задачи

  8.3. Указание ЕСЛИ ТО

  8.4. Указание ВЫБРАТЬ ИЗ

  8.5. Указание ПОКА

  8.6. Указание ПОВТОРЯТЬ ДО

  8.7. Указание КОЛЬЦО

  8.8. Указание ОТ ДО

  8.9. Указания ВОЗВРАТ из задачи и ВЫХОД из кольца

  8.10. Указание ДЛЯ

- 9. Объявление задачи

  9.1. Приёмники

  9.2. Встроенные задачи

- 10. Отделы
- 11. Отдел ОБХОД
- 12. Среда выполнения

  12.1. Уборка памяти

  12.2. Описатели вида

- 13. Перевод в машинное представление

  13.1. Тексторез

  13.2. Преобразователь Глагола

  13.3. Расширение языка для взаимодействия с иноязычными приложениями

- 14. Соответствие видов

  Одинаковые виды

  Равные виды

  Поглощение числовых видов

  Расширение видов (опорный вид)

  Подобие опорных видов ряда

  Совместимость по присваиванию

  Совместимость при вызове задачи

  Совместимость выражений

  Совпадение заголовков задач

- 15. Правила построения языка

# Введение

Коротко да ясно, оттого прекрасно.

Этот справочник содержит полное описание языка Глагол – языка программирования общего назначения, родственного языкам Паскаль и Оберон. Перечислим некоторые характерные черты этого языка.

Все данные имеют определённый вид. Существуют как простые виды – знаковый (ЗНАК), числовые (ШИРВЕЩ, ВЕЩ, ШИРЦЕЛ, ЦЕЛ, УЗКЦЕЛ, ЯЧЦЕЛ), логический (КЛЮЧ), множество (МНОЖ), так и составные виды – (РЯД и НАБОР). Вид НАБОР можно расширять новыми свойствами. Данные могут быть постоянными и переменными.

Простейшие преобразования данных выполняются так называемыми действиями, которые, в основном, имеют соответствующие машинные команды. Действия можно объединять в выражения. В выражениях всегда должно соблюдаться соответствие видов. Более сложный порядок для преобразования данных задаётся указаниями. Последовательности указаний и данные можно объединять в задачи и отделы.

Обычно приложение строится из нескольких отделов. Каждый отдел существует в двух представлениях: текстовом (с которым работает человек) и машинном (которое получается из соответствующего текстового представления с помощью преобразователя языка).

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

# 1. Условные обозначения

Горе в чужой земле безъязыкому.

В тексте определений главные слова подчёркнуты (например, вид данных). Глава 14 содержит определения понятий, которые используются при описании правил соответствия видов. В тексте эти понятия выделены курсивом (например, одинаковый вид).

Язык описывается с помощью РБНФ. Разновидности выражений отделяются знаком |. Квадратные скобки [] обозначают необязательность записанного в них выражения, а фигурные скобки {} обозначают его повторение (возможно 0 раз). Понятия языка начинаются с заглавной буквы (например, Указание), а слова языка или начинаются со строчной буквы (например, название), или записываются целиком заглавными буквами (например, ЗАДАЧА), или заключаются в кавычки (например, ":=").

# 2. Слова языка

Живое слово дороже мёртвой буквы.

Каждый язык строится из простейших выражений – слов. Слова неделимы и сами по себе обозначают некоторое содержание. В описываемом языке присутствует семь разновидностей слов: названия, числа, одиночные знаки, цепочки знаков, действия, указания и разделители. Для записи слов используются буквы, цифры и другие печатные знаки. Заглавные и строчные буквы считаются различными. Пробелы и концы строк, которые не разделяют смежные слова, не учитываются. Между любыми двумя словами могут располагаться пояснения и указания для текстореза (см. 13.1). Они не влияют на машинное представление приложения. Пояснение – это произвольная последовательность знаков, начинающаяся с (* и оканчивающаяся *). Пояснения могут быть вложенными. Указания для текстореза начинаются с <* и оканчиваются *>.

Названия – это последовательности букв и цифр, которые начинаются с буквы.

название | = | буква {буква | цифра}.

Примеры:

    Слово1
    ПолПи
    i
    знак
    ЯйцоЗолотое

Числа используются для представления целых и вещественных чисел без знака. Целое число имеет вид данных, который является наименьшим целым видом, способным хранить его значение (см. 5.1). Если запись целого числа оканчивается буквой H, то оно представлено в шестнадцатеричном виде, иначе оно представлено в десятичном виде.

Вещественное число всегда содержит десятичную точку. Оно может также содержать десятичный порядок. Буква E (или D) означает "умножить на десять в степени". Если у вещественного числа порядок содержит букву D, то у него ШИРВЕЩ вид, иначе у него ВЕЩ вид.

число | = | целое | вещественное.
целое | = | цифра {цифра} | цифра {цифра16} "H".
вещественное | = | цифра {цифра} "." {цифра} [порядок].
порядок | = | ("E" | "D") ["+" | "-"] цифра {цифра}.
цифра16 | = | цифра | "A" | "B" | "C" | "D" | "E" | "F".
цифра | = | "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".

Примеры:

Запись числа | Вид данных | Значение
123 | ЯЧЦЕЛ | 123
0FFFFFH | ЦЕЛ | 1048575
0.031416E2 | ВЕЩ | 3.1416
1.23456789D-10 | ШИРВЕЩ | 0.000000000123456789

Одиночные знаки обозначаются порядковым номером знака в шестнадцатеричном виде с приписанной в конце буквой X.

одинзнак | = | цифра {цифра16} "X".

Цепочки знаков – это последовательности печатных знаков, заключённые в одиночные (') или двойные (") кавычки. Открывающая кавычка должна быть такой же, как и закрывающая, и не должна встречаться внутри цепочки знаков. Последовательность из знаков #nnnn, где nnnn – четырёхзначное шестнадцатеричное число, обозначает знак с кодом nnnn. Для знака # используется последовательность из ##. Количество знаков в цепочке называется её длиной. Цепочка из одного знака может использоваться везде, где допустим одиночный знак, и наоборот.

цепочка | = | """ {знак} """ | "'" {знак} "'".
знак | = | печзнак | "#" цифра16 цифра16 | "##"

Примеры:

    'Сама (мышь) залезла в кувшин, а кричит: "Пусти!"'
    "Зацепился за пень,#0D#0A да и стоит день."
    "1"
    "Если А #23 Б, то"

Действия, указания и разделители – это знаки, пары знаков и служебные слова, перечисленные ниже. Служебные слова не могут использоваться как названия.

+ | = | В | ЗАДАЧА | ОТДЕЛ
- | # | ВИД | И | ПЕР[ЕМЕННЫЕ]
* | < | ВИДА | ИЗ | ПО
/ | > | ВОЗВРАТ | ИЛИ | ПОВТОРЯТЬ
. | <= | ВЫБРАТЬ | ИНАЧЕ | ПОКА
, | >= | ВЫЗОВ | ИСПОЛЬЗУЕТ | ПОСТ[ОЯННЫЕ]
; | .. | ВЫП[ОЛНЯТЬ] | К | ПУСТО
| | : | ВЫХОД | КОЛЬЦО | РЯД
( | ) | ДЕЛИТЬ | КОН[ЕЦ] | ТО
[ | ] | ДЛЯ | НАБОР | УКАЗ[АНИЯ]
{ | } | ДО | НЕ | ЦЕПЬ
:= | АЕСЛИ | ДОСТУП | ОСТАТОК | ЯВЛЯЕТСЯ
^ | БЕГУНОК | ЕСЛИ | ОТ |

# 3. Объявления и области действия понятий

С именем Иван, без имени болван.

Понятия языка – это выражения языка, которые строятся по особым правилам из слов и из других понятий языка. Все понятия должны быть объявлены до их первого использования. Объявление задаёт название и другие постоянные свойства понятия. В дальнейшем название используется для обозначения этого понятия.

Область действия названия понятия распространяется от точки объявления этого понятия до конца участка (отдела, задачи или набора), на котором находится это объявление. Область действия названия распространяется и на вложенные участки (задачи), кроме тех мест, где она перекрывается областью действия понятия с таким же названием.

Правила для области действия названия:

а) название не может обозначать больше, чем одно понятие внутри данной области действия;

б) разрешено объявлять вид Дп, как ДОСТУП К Вп (см. 5.4) в точке, где вид Вп ещё не объявлен; объявление вида Вп должно следовать на том же уровне участка, на котором происходит и объявление Дп;

в) названия свойств, упоминаемые в объявлении набора (см. 5.3), используются только для обозначения свойств переменных вида НАБОР.

Понятие, объявленное на уровне отдела (см. 10), можно использовать и в других отделах, если при своём объявлении название этого понятия сопровождается меткой общедоступности (знак "-" или "+"). Такое понятие обозначается полным названием, состоящим из названия отдела, точки и названия понятия. Например, если в отделе-пользователе Пл необходимо обратиться к понятию с названием н, объявленному в отделе-владельце Вл, то полное название н в тексте Пл будет записываться как Вл.н. Допустимо обращение к понятиям своего отдела по полному названию. В отделах-пользователях возможно изменение значений только тех переменных, которые были объявлены в отделе-владельце с меткой общедоступности "+".

ПолноеНазвание | = | [название "."] название.

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

ВЕЩ | ЗНАК | ОБНУЛИТЬ | УВЕЛИЧИТЬ | ШИРВЕЩ
ВКЛ | КЛЮЧ | ПОСТАВИТЬ | УЗК | ШИРЦЕЛ
ВЗНАК | МАКС | ПРОВЕРИТЬ | УЗКЦЕЛ | ЯЧЦЕЛ
ВЦЕЛ | МИН | РАЗМЕР | УМЕНЬШИТЬ |
ВШИРЦЕЛ | МНОЖ[ЕСТВО] | СМЕСТИТЬ | ЦЕЛ |
ДЛИНА | МОДУЛЬ | СОЗДАТЬ | ЦЕЛЧАСТЬ |
ЗАДАНО | ОТКЛ | СПИСАТЬ | ЧЕТ |

# 4. Объявление постоянной

Объявление постоянной связывает название со значением.

ОбъявлениеПостоянной | = | название ["-"] "=" ПостоянноеВыражение.
ПостоянноеВыражение | = | Выражение.

Постоянное выражение – это выражение, которое может быть вычислено преобразователем по его тексту без выполнения приложения. Его данные (см. 7.1) – другие постоянные, различные действия и встроенные задачи (см. 9.2), которые могут быть выполнены преобразователем.

Примеры объявления постоянной:

    Слагаемых=100;
    Пи-=3.141592654;
    ПолПи-=Пи/2;
    Замечание1="Деление на ноль.";
    ПолноеМножество={МИН(МНОЖ)..МАКС(МНОЖ)}

# 5. Объявление вида

Вид данных определяет значения, которые могут принимать переменные этого вида, и действия, которые можно применять к этим переменным. При объявлении вида происходит связывание названия с видом данных. При объявлении составного вида (вид РЯД или вид НАБОР) также задаётся и внутреннее строение переменных этого вида. Составной вид не может строиться из самого себя.

ОбъявлениеВида | = | название ["-"] "=" Вид.
Вид | = | ПолноеНазвание | ВидРяд | ВидНабор | ВидДоступ | ВидЗадача | ВидБегунок.

Примеры:

    Таблица=РЯД Слагаемых ИЗ ВЕЩ;
    Функция=ЗАДАЧА(x:ЦЕЛ):ЦЕЛ;
    Яйцо-=ДОСТУП К ОписаниеЯйца;
    ОписаниеЯйца-=НАБОР
      твёрдость-:ЦЕЛ;
      положение+:Место
    ЗолотоеЯйцо=ДОСТУП К ОписаниеЗолотогоЯйца;
    ОписаниеЗолотогоЯйца=НАБОР(ОписаниеЯйца)
      богатство:ВЕЩ
    КОН;
    Столбец=БЕГУНОК 3 ПО ЦЕЛ

## 5.1. Простые виды

Аз да буки, да и конец науки.

Простые виды обозначены встроенными названиями. Соответствующие действия определены в 7.2, а встроенные задачи в 9.2. Предусмотрены следующие простые виды:

Название | Принимаемые значения
КЛЮЧ | логические ВКЛ и ОТКЛ
ЗНАК | знаки с порядковыми номерами от 0X до 0FFX
ЯЧЦЕЛ | наименьшее представление целого числа
УЗКЦЕЛ | целые числа от МИН(УЗКЦЕЛ) до МАКС(УЗКЦЕЛ)
ЦЕЛ | целые числа от МИН(ЦЕЛ) до МАКС(ЦЕЛ)
ШИРЦЕЛ | целые числа от МИН(ШИРЦЕЛ) до МАКС(ШИРЦЕЛ)
ВЕЩ | вещественные числа от МИН(ВЕЩ) до МАКС(ВЕЩ)
ШИРВЕЩ | вещественные числа от МИН(ШИРВЕЩ) до МАКС(ШИРВЕЩ)
МНОЖ | множество из целых чисел от 0 до МАКС(МНОЖ)

ЯЧЦЕЛ, УЗКЦЕЛ, ЦЕЛ и ШИРЦЕЛ – целые виды, ВЕЩ и ШИРВЕЩ – вещественные виды, а вместе они образуют числовые виды.

Считается, что ШИРВЕЩ >= ВЕЩ >= ШИРЦЕЛ >= ЦЕЛ >= УЗКЦЕЛ >= ЯЧЦЕЛ, причём больший вид поглощает меньший вид.

## 5.2. Вид РЯД

Одна головня и в печи не горит, а две и в поле курятся.

Переменные вида РЯД состоят из совокупности переменных одного вида, называемого опорным видом ряда. Число переменных, составляющих ряд, называют его размером. Целое число от 0 до размера ряда минус 1 выделяет соответствующую переменную из ряда.

ВидРяд | = | РЯД [Размер {"," Размер}] ИЗ Вид | ЦЕПЬ ["[" Размер "]"].
Размер | = | ПостоянноеВыражение.

Объявление ряда

    РЯД
    Размер0,Размер1,…,Размерn ИЗ Вп

понимается как сокращение

    РЯД Размер0 ИЗ
      РЯД Размер1 ИЗ
        …
          РЯД Размерn ИЗ Вп

Объявление РЯД Размер ИЗ ЗНАК можно записывать как ЦЕПЬ[Размер].

Вид РЯД, объявленный без указания размера, называется открытым рядом. Такой вид используется только: а) в приёмнике задачи (см. 9.1); б) как опорный вид для вида ДОСТУП (см. 5.4); в) как опорный вид другого открытого ряда.

Объявление ОБХОД.Ячейки равнозначно объявлению РЯД ИЗ ОБХОД.Ячейка (см. 11).

Примеры:

    РЯД 10,N ИЗ ЦЕЛ;
    РЯД ИЗ ЗНАК;
    ЦЕПЬ;
    ОБХОД.Ячейки

## 5.3. Вид НАБОР

Из многих малых выходит одно большое.

Переменные вида НАБОР могут состоять из совокупности переменных различного вида. Переменные, составляющие этот набор, называются свойствами набора. Объявление вида НАБОР определяет название и вид каждого свойства. Область действия названий свойств простирается от точки их объявления до конца объявления вида НАБОР, а также захватывает обозначения свойств переменных вида НАБОР (см. 7.1). Если вид НАБОР объявлен с меткой общедоступности (см. 3), то свойства, которые должны быть доступны в отделах-пользователях, также объявляются с метками общедоступности. Такие свойства называются общедоступными свойствами, а неотмеченные свойства называются скрытыми свойствами.

ВидНабор | = | НАБОР ["(" ПолноеНазвание ")"] [ОбъявленияПеременных] КОН.

    НАБОР
      день,месяц,год:ЦЕЛ
    КОН;
    НАБОР
      имя-,фамилия-,отчество-:ЦЕПЬ[32];
      возраст+:ЦЕЛ
    КОН

Вид НАБОР может быть объявлен как расширение другого вида НАБОР. В примере

    О=НАБОР
      ц:ЦЕЛ
    КОН;
    Р=НАБОР (О)
      в:ВЕЩ
    КОН

Р – непосредственное расширение вида О, а О – непосредственный опорный вид Р (см. 14). Переменные расширенного вида Р состоят из свойств, объявленных в опорном виде, и свойств, которые объявлены в Р. Все названия, объявленные в расширенном наборе, должны быть отличны от названий, объявленных в его опорном виде (видах).

## 5.4. Вид ДОСТУП

Отойдём да поглядим, хорошо ли мы сидим.

Переменные вида ДОСТУП принимают значения, которые обеспечивают доступ к переменным некоторого вида Вп. Вид Вп называется опорным видом доступа и может быть только видом РЯД или видом НАБОР. Вид ДОСТУП заимствует отношение расширений своего опорного вида: если вид Р является расширением вида О и вид ДР=ДОСТУП К Р, а вид ДО=ДОСТУП К О, то вид ДР также является расширением вида ДО.

ВидДоступ | = | ДОСТУП К Вид.

Если д – переменная вида ДОСТУП К Вп, то вызов встроенной задачи СОЗДАТЬ(д) (см. 9.2) размещает новую переменную вида Вп в свободной памяти (если вид Вп – n-мерный открытый ряд, то размещение должно быть выполнено вызовом СОЗДАТЬ(д,Размер0,…,Размерn-1), где Размер0, …, Размерn-1 – это выражения, которые задают размеры соответствующим измерениям ряда). После этого переменная д хранит значение, которое обеспечивает доступ к этой новой размещённой переменной вида Вп.

Любая переменная вида ДОСТУП может также принимать и значение ПУСТО, при котором доступ к другим переменным отсутствует.

## 5.5. Вид БЕГУНОК

Тише едешь – дальше будешь.

Обычное обращение к переменным, составляющим ряд, осуществляется по их номеру. При этом адрес требуемой переменной вычисляется как: "адрес 1-й переменной" + "размер переменной" x "заданный номер". При последовательном обращении к таким переменным можно получить значительный выигрыш производительности, если вычислять адрес последующей переменной через адрес предыдущей. Для этого в языке применяется вид данных БЕГУНОК. Вид переменных, составляющих ряд, к которым будет осуществляться последовательное обращение, называется опорным видом бегунка, а число переменных ряда, на которое будет перемещаться бегунок после каждого такого обращения, называется шагом бегунка. Шаг бегунка задаётся как целая постоянная. Если при объявлении вида шаг бегунка не указан, то считается, что шаг равен 1.

ВидБегунок | = | БЕГУНОК [ШагБегунка] ПО Вид.
ШагБегунка | = | ПостоянноеВыражение.

Перед первым обращением к переменным ряда бегунок б должен быть сопоставлен с этими переменными через вызов встроенной задачи ПОСТАВИТЬ(б,р,в). Здесь р – переменная вида РЯД, а в – произвольное целое выражение. При этом опорный вид бегунка б должен совпадать с опорным видом ряда р. После такого вызова б будет установлен на адрес переменной р[в], вычисленный без учёта границ этого ряда.

Для перемещения бегунка б на п переменных ряда без обращения к этим переменным используется встроенная задача СМЕСТИТЬ(б,п), где п должна быть целой постоянной.

Переменные вида БЕГУНОК с одинаковыми опорными видами можно сравнивать друг с другом и со значением ПУСТО.

При обращении через бегунки к переменным многомерных рядов последние рассматриваются как развёрнутые в одномерные.

## 5.6. Вид ЗАДАЧА

Переменные вида ЗАДАЧА принимают значения, которые обеспечивают доступ к вызову задач. Также эти переменные могут принимать значение ПУСТО. Если задача з присваивается переменной вида Вп, то заголовки (см. 9.1) у з и у Вп должны совпадать (см. 14). При этом задача з не может быть ни встроенной задачей, ни вложенной в другую задачу.

ВидЗадача | = | ЗАДАЧА [Приёмники [":" ВидОтвета]].

Пример:

    Функция=ЗАДАЧА(x:ВЕЩ):ВЕЩ;

# 6. Объявление переменных

Объявление переменных определяет названия и вид их данных.

ОбъявлениеПеременных | = | название ["-" | "+"] {"," название ["-" | "+"]} ":" Вид.

Переменные вида НАБОР и вида ДОСТУП имеют как объявленный вид (вид, с которым они были объявлены – называемый просто их видом), так и размещённый вид (вид их значения во время выполнения). Объявленный вид определяет, какие свойства набора доступны. Для переменных вида ДОСТУП и приёмников ссылок вида НАБОР размещённый вид может быть расширением их объявленного вида.

Примеры объявлений переменных (см. примеры из 5):

    н,i,j:ЦЕЛ;
    год,возраст:ЦЕЛ;
    x,y:ВЕЩ;
    к1,к2:КЛЮЧ;
    м:МНОЖ;
    f:Функция;
    р:РЯД 100 ИЗ ВЕЩ;
    город:РЯД 16 ИЗ НАБОР
      название:ЦЕПЬ[32];
      жителей:ЦЕЛ
    КОН;
    яйцо:Яйцо

# 7. Выражения

Струны готовы, недалеко и до песен.

Выражения задают правила вычисления по значениям постоянных и текущим значениям переменных других значений путём применения действий и вызова задач, возвращающих ответ. Выражения состоят из данных и действий. Круглые скобки могут использоваться для объединения действий и данных.

## 7.1. Данные

За исключением чисел, одиночных знаков, цепочек знаков и построителей множеств, данные представлены обозначениями. Обозначение содержит название постоянной, переменной или задачи, возвращающей ответ. Это название может быть дополнено названием отдела (см. 3 и 10) и может сопровождаться разделителями, если обозначенное понятие является частью составного понятия.

Обозначение | = | ПолноеНазвание {"." название | "["Выражения"]" | "^" | "("ПолноеНазвание")"}.
Выражения | = | Выражение {"," Выражение}.

Если р обозначает переменную вида РЯД, то р[в] обозначает переменную из р, чей номер – текущее значение выражения в. Выражение в должно быть целого вида. Обозначение р[в0,в1,…,вn] применимо вместо обозначения р[в0][в1]…[вn].

Если н обозначает переменную вида НАБОР, то н.с обозначает свойство с набора н.

Если р или н доступны только для чтения, то р[в] и н.с также доступны только для чтения.

Если д обозначает переменную вида ДОСТУП, то д^ обозначает переменную, к которой в д хранится доступ. Обозначения д^.с и д^[в] могут быть сокращены до д.с и д[в].

Если б обозначает переменную вида БЕГУНОК, то б^ обозначает переменную ряда, соответствующую текущему значению б. После обращения к переменной ряда, обозначенного таким способом, текущее значение б смещается на шаг переменных ряда. Где шаг был указан при объявлении вида переменной б (см. 5.5).

Охрана вида обозначается как п(Вп) и требует, чтобы размещённым видом переменной п был вид Вп или расширение вида Вп. В противном случае выполнение приложения прерывается. В пределах такого обозначения переменная п воспринимается как имеющая объявленный вид Вп. Охрана вида применима, если

а) п – приёмник ссылок вида НАБОР, или п – переменная вида ДОСТУП, и если

б) Вп – расширение объявленного вида п.

Если обозначенное понятие – постоянная или переменная, то обозначение ссылается на их текущее значение. Если же понятие является задачей и обозначение сопровождается (возможно, пустым) списком источников, то в этом случае подразумевается вызов задачи и подстановка значения ответа, полученного при её исполнении. Источники должны соответствовать приёмникам, как и при вызовах собственно задач (см. 9.1).

Примеры обозначений (см. примеры 6):

Обозначение | Вид данных
н | ЦЕЛ
р[н] | ВЕЩ
город[3].название[н] | ЗНАК
яйцо.твёрдость | ЦЕЛ
яйцо(ЯйцоЗолотое).богатство | ВЕЩ

## 7.2. Действия

Язык придерживается принятых в математике соглашений о порядке выполнения действий в выражениях. Существует четыре разряда действий с различными преимуществами порядка выполнения. У отрицания НЕ самое высокое преимущество, далее следуют действия типа умножения, действия типа сложения и отношения. Действия с одинаковым преимуществом выполняются слева направо. Например, x-y-z означает (x-y)-z.

Выражение | = | ПростоеВыражение [Отношение ПростоеВыражение].
ПростоеВыражение | = | ["+" | "-"] Слагаемое {Сложение Слагаемое}.
Слагаемое | = | Множитель {Умножение Множитель}.
Множитель | = | Обозначение[Источники] | число | одинзнак | цепочка | ПУСТО | Множество | "("Выражение")" | НЕ Множитель.
Множество | = | "{"[Элемент {"," Элемент}]"}".
Элемент | = | Выражение [".." Выражение].
Источники | = | "("[Выражения]")".
Отношение | = | "=" | "#" | "<" | "<=" | ">" | ">=" | В | ЯВЛЯЕТСЯ.
Сложение | = | "+" | "-" | ИЛИ.
Умножение | = | "*" | "/" | ДЕЛИТЬ | ОСТАТОК | И.

Предусмотренные действия перечислены в следующих таблицах. Некоторые действия применяются к данным различных видов, обозначая при этом разные действия. В этих случаях выполняемое действие определяется видом данных. Данные должны быть совместимыми выражениями для данного действия (см. 14).

### Логические действия

а ИЛИ б | если а, то ВКЛ, иначе б
а И б | если а, то б, иначе ОТКЛ
НЕ а | не а

Эти действия применимы к данным вида КЛЮЧ и дают ответ вида КЛЮЧ.

### Арифметические действия

+ | сложение
- | вычитание
* | произведение
/ | вещественное деление
ДЕЛИТЬ | деление нацело
ОСТАТОК | остаток от деления

Действия "+", "-", "*" и "/" применимы к данным числовых видов. Вид ответа "+", "-" и "*" есть вид того данного, который поглощает вид другого данного. У "/" ответ – наименьший вещественный вид, который поглощает виды обоих данных. Одноместный "-" обозначает перемену знака, а одноместный "+" – тождественное действие. Действия ДЕЛИТЬ и ОСТАТОК применимы только к данным целого вида. Они связаны следующими формулами, определёнными для любого x и положительного делителя y:

x = (x ДЕЛИТЬ y) * y + (x ОСТАТОК y)

0 <= (x ОСТАТОК y) < y

Примеры:

x | y | x ДЕЛИТЬ y | x ОСТАТОК y
5 | 3 | 1 | 2
-5 | 3 | -2 | 1

### Действия над множествами

x+y | объединение |
x*y | пересечение |
x–y | разность | x*(-y)
x/y | симметрическая разность | (x-y)+(y-x)

Действия над множествами применимы к данным вида МНОЖ и дают ответ вида МНОЖ. Одноместный "-" обозначает дополнение x, то есть -x – это множество целых чисел от 0 до МАКС(МНОЖ), которые не являются элементами x. На действия с множествами не распространяется сочетательный закон, т.е. (a+b)-c # a+(b-c). Построитель множества задаёт значение множества списком элементов, заключённым в фигурные скобки. Элементы должны быть целого вида и иметь значения от 0 до МАКС(МНОЖ). Диапазон a..b обозначает все целые числа на отрезке [a,b].

### Отношения

= | равно
# | не равно
< | меньше
<= | меньше или равно
> | больше
>= | больше или равно
В | принадлежность множеству
ЯВЛЯЕТСЯ | проверка вида

Все отношения дают ответ вида КЛЮЧ. Отношения "=", "#", "<", "<=", ">" и ">=" применимы к числовым видам, виду ЗНАК, цепочкам знаков и рядам из знаков, содержащим в конце 0X. Отношения "=" и "#", кроме того, применимы и к видам КЛЮЧ, МНОЖ, ДОСТУП, ЗАДАЧА и к значению ПУСТО.

Отношение в В м выясняет, не входит ли значение выражения в во множество значений выражения м, где в должно быть целого вида, а м – вида МНОЖ.

Отношение п ЯВЛЯЕТСЯ Вп называется проверкой вида и выясняет, является ли размещённый вид переменной п видом Вп или расширением Вп. Проверка вида применима, если

а) п – приёмник ссылок вида НАБОР, или п – переменная вида ДОСТУП, и если

б) Вп – расширение объявленного вида п.

Примеры выражений (см. примеры 6):

Выражение | Вид ответа
2003 | ЦЕЛ
н ДЕЛИТЬ 5 | ЦЕЛ
НЕ к1 ИЛИ к2 | КЛЮЧ
(н+i)*(н-i) | ЦЕЛ
м-{7,i,12} | МНОЖ
н+x | ВЕЩ
р[н+i]*р[н-i] | ВЕЩ
(0<=н)И(н<100) | КЛЮЧ
н В {i..j-1} | КЛЮЧ
город[н].название <= "Москва" | КЛЮЧ
яйцо ЯВЛЯЕТСЯ ЯйцоЗолотое | КЛЮЧ

# 8. Указания

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

Указание | = | [Присваивание | ВызовЗадачи | ЕслиТо | ВыбратьИз | Пока | ПовторятьДо | ОтДо | Кольцо | Для | ВЫХОД | ВОЗВРАТ [Выражение]].

Последовательность указаний, разделённых точкой с запятой, означает поочерёдное выполнение составляющих её указаний.

Указания | = | Указание {";" Указание}.

## 8.1. Присваивание

Присваивание заменяет текущее значение переменной новым значением, определяемым результатом выражения. Выражение должно быть совместимо по присваиванию с переменной (см. 14). Символом присваивания является ":=".

Присваивание | = | Обозначение ":=" Выражение.

Если выражение в вида Вв присваивается переменной п вида Вп (п:=в), то имеет место следующее:

а) если Вп и Вв – вида НАБОР, то в присваивании участвуют только те свойства набора Вв, которые также имеются в наборе Вп; размещённый вид п и объявленный вид п должны быть одинаковыми, после присваивания они не изменяются;

б) если Вп и Вв – вида ДОСТУП, то размещённым видом п становится размещённый вид в;

в) если Вп – РЯД N ИЗ ЗНАК, а в – цепочка длины M<N, то п[i] присваиваются значения в[i] для i=0..M-1, а п[M] получает значение 0X.

Примеры присваивания (см. примеры 6):

    н:=0;
    к1:=н=i;
    x:=н+1;
    j:=log2(н+i); (* см. 9.1 *)
    f:=log2;
    м:={2,3,5,7,11};
    р[н]:=(x+y)*(x-y);
    город[н+1].название:="Тверь";
    город[i]:=город[j]

## 8.2. Вызов задачи

Вызов задачи определяет выполнение последовательности указаний, объявленных в этой задаче. В нём может содержаться список источников данных. Каждому источнику всегда соответствует приёмник, определённый в объявлении задачи (см. 9). Соответствие устанавливается в порядке следования в списках источников и приёмников.

Если источник обозначает часть составной переменной, то эта часть выделяется перед выполнением задачи. Если приёмник является приёмником ссылок, то соответствующий источник может быть только обозначением переменной. (Примечание: если приёмник ссылок объявлен с меткой общедоступности "-" (см. 9.1), то источник также может быть и цепочкой знаков.)

Если приёмник является приёмником значений, то соответствующий источник может быть выражением. Это выражение вычисляется перед выполнением задачи, а полученное значение присваивается приёмнику (см. также 9.1).

ВызовЗадачи | = | Обозначение [Источники].

Примеры:

    ПисЦел(н*2+1);              (* см. 9.1 *)
    УВЕЛИЧИТЬ(город[j].жителей) (* см. 9.2 *)

## 8.3. Указание ЕСЛИ ТО

ЕслиТо

=

ЕСЛИ Выражение ТО

Указания

{АЕСЛИ Выражение ТО

Указания}

[ИНАЧЕ

Указания]

КОН.

Указание ЕСЛИ ТО задаёт условное выполнение входящих в него последовательностей указаний. Логические выражения, предшествующие последовательности указаний, будем называть условиями. Условия проверяются последовательно одно за другим, пока очередное не окажется равным ВКЛ, после чего выполняется связанная с этим условием последовательность указаний. Если ни одно условие не удовлетворено и имеется служебное слово ИНАЧЕ, то выполняется последовательность указаний, записанная после этого слова.

Пример:

    ЕСЛИ (знак>="A") И (знак<="Z")  ТО
      Название()
    АЕСЛИ (знак>="0") И (знак<="9") ТО
      Число()
    АЕСЛИ (знак="'") ИЛИ (знак='"') ТО
      Цепочка()
    ИНАЧЕ
      Ошибка()
    КОН

## 8.4. Указание ВЫБРАТЬ ИЗ

Указание ВЫБРАТЬ ИЗ определяет выбор и выполнение последовательности указаний по значению выражения. Прежде всего вычисляется значение выбирающего выражения, а затем выполняется та последовательность указаний, чей список меток варианта содержит полученное значение. Выбирающее выражение должно быть такого целого вида, который поглощает виды всех меток вариантов, или же и выбирающее выражение, и метки вариантов должны иметь вид ЗНАК. Метки варианта состоят из постоянных выражений, и ни одно из их значений не должно употребляться больше одного раза. Если значение выражения не совпадает с меткой ни одного из вариантов, выбирается последовательность указаний после слова ИНАЧЕ, если оно есть, иначе выполнение приложения прерывается.

ВыбратьИз

=

ВЫБРАТЬ Выражение ИЗ

Вариант

{"|" Вариант}

[ИНАЧЕ

Указания]

КОН.

Вариант | = | [СписокМеток ":" Указания].
СписокМеток | = | Метки {"," Метки}.
Метки | = | ПостоянноеВыражение [".." ПостоянноеВыражение].

Пример:

    ВЫБРАТЬ год-годРождения ИЗ
        0..7*1-1: возраст:=дитя
    | 7*1..7*2-1: возраст:=отрок
    | 7*2..7*3-1: возраст:=юноша
    | 7*3..7*8-1: возраст:=муж
    | 60,70,80:   возраст:=юбиляр
    ИНАЧЕ
      возраст:=старец
    КОН

## 8.5. Указание ПОКА

Указание ПОКА задаёт повторное выполнение последовательности указаний, пока условие, заданное логическим выражением, остаётся равным ВКЛ. Условие проверяется перед каждым выполнением последовательности указаний.

Пока | = | ПОКА Выражение ВЫП Указания КОН.

## 8.6. Указание ПОВТОРЯТЬ ДО

Указание ПОВТОРЯТЬ ДО определяет повторное выполнение последовательности указаний, пока условие, заданное логическим выражением, не удовлетворено. Последовательность указаний выполняется, по крайней мере, один раз.

ПовторятьДо | = | ПОВТОРЯТЬ Указания ДО Выражение.

## 8.7. Указание КОЛЬЦО

Указание КОЛЬЦО определяет повторное выполнение последовательности указаний. Оно завершается после выполнения указания ВЫХОД внутри этой последовательности (см. 8.9).

Кольцо | = | КОЛЬЦО Указания КОН.

Указания КОЛЬЦО нужны для того, чтобы выразить повторения с несколькими точками выхода, или в случаях, когда условие выхода находится в середине повторяемой последовательности указаний.

## 8.8. Указание ОТ ДО

Указание ОТ ДО определяет повторное выполнение последовательности указаний для увеличивающихся (уменьшающихся) значений переменной целого вида, называемой управляющей переменной.

ОтДо | = | ОТ ПолноеНазвание ":=" Выражение ДО Выражение [ПО ПостоянноеВыражение] ВЫП Указания КОН.

Указание

    ОТ ц:=НачальноеВыражение ДО КонечноеВыражение ПО шаг ВЫП
      Указания
    КОН

равнозначно

    конец:= КонечноеВыражение;
    начало:=НачальноеВыражение;
    ЕСЛИ шаг > 0 ТО
      ПОКА ц <= конец ВЫП
        Указания;
        УВЕЛИЧИТЬ(ц,шаг)
      КОН
    АЕСЛИ шаг < 0 ТО
      ПОКА ц >= конец ВЫП
        Указания;
        УВЕЛИЧИТЬ(ц,шаг)
      КОН
    КОН

конец и ц одинакового вида. Шаг должен быть отличным от нуля постоянным выражением. Если шаг не указан, то он предполагается равным 1.

Пример:

    ОТ i:=0 ДО 99 ВЫП
      x:=x+р[i]
    КОН

## 8.9. Указания ВОЗВРАТ из задачи и ВЫХОД из кольца

Указание ВОЗВРАТ определяет точку завершения выполнения задачи. Оно обозначается служебным словом ВОЗВРАТ.

Задачи, возвращающие ответ, завершаются указанием ВОЗВРАТ, задающим значение ответа. Ответ обозначается выражением, которое следует за словом ВОЗВРАТ. Вид выражения должен быть совместим по присваиванию (см. 14) с видом ответа, определённым в заголовке задачи (см. 9).

В собственно задачах указание ВОЗВРАТ подразумевается в конце тела задачи. Любое явное указание ВОЗВРАТ служит дополнительной точкой завершения выполнения задачи.

Указание ВЫХОД определяет точку завершения охватывающего указания КОЛЬЦО. Оно обозначается служебным словом ВЫХОД.

Пример с указаниями ПОКА, ПОВТОРЯТЬ, КОЛЬЦО, ВЫХОД:

    живёт(дед); живёт(баба);
    КОЛЬЦО
      снесла(курочка,яйцо);
      ЕСЛИ НЕ (яйцо ЯВЛЯЕТСЯ ЯйцоЗолотое) ТО
        ВЫХОД
      КОН;
      ПОКА НЕ устаёт(дед) ВЫП
        бьёт(дед,яйцо)
      КОН;
      ПОКА НЕ устаёт(баба)ВЫП
        бьёт(баба,яйцо)
      КОН;
      ПОВТОРЯТЬ
        бегает(мышь)
      ДО задела(мышь,яйцо) И разбито(яйцо);
      плачет(дед); плачет(баба);
      кудахчет(курочка)
    КОН

## 8.10. Указание ДЛЯ

Указание ДЛЯ определяет выполнение последовательности указаний при помощи проверки вида у заданной переменной и применяет охрану вида к каждому вхождению этой переменной внутри выполняемой последовательности указаний.

Для

=

ДЛЯ ПолноеНазвание ВИДА

ОхранаУказаний

{"|" ОхранаУказаний }

[ИНАЧЕ

Указания]

КОН.

ОхранаУказаний | = | [ПолноеНазвание ":" Указания].

Если п – приёмник ссылок вида НАБОР или переменная вида ДОСТУП, и её объявленный вид Вп0, то указание

    ДЛЯ п ВИДА
      Вп1: ПослУк1
    | Вп2: ПослУк2
    ИНАЧЕ
      ПослУк3
    КОН

имеет следующий смысл: если размещённый вид переменной п есть Вп1, то выполняется последовательность указаний ПослУк1, в которой п воспринимается как имеющая объявленный вид Вп1, иначе если размещённый вид п есть Вп2, то выполняется ПослУк2, в которой п воспринимается как имеющая объявленный вид Вп2, иначе выполняется ПослУк3. Вп1 и Вп2 должны быть расширениями вида Вп0. Если ни одна проверка вида не удовлетворена, а ИНАЧЕ отсутствует, то выполнение приложения прерывается.

Пример:

    ДЛЯ яйцо ВИДА
      ЯйцоЗолотое: УМЕНЬШИТЬ(яйцо.богатство)
    КОН

# 9. Объявление задачи

В объявлении задачи определяется её заголовок и тело. Заголовок задачи определяет её название, приёмники и вид ответа для тех задач, которые возвращают ответ. Тело начинается объявлением внутренних понятий, которые используются только в данной задаче, и заканчивается последовательностью указаний. В конце объявления задачи повторяется её название.

Имеются два рода задач: собственно задачи и задачи, возвращающие ответ. Последние вызываются обозначением задачи как части выражения и возвращают ответ, который является данным для выражений. Собственно задачи получают управление после вызова задачи. Задача является задачей, возвращающей ответ, если определён вид её ответа. Тело задачи, возвращающей ответ, должно содержать указание ВОЗВРАТ, которое и определяет ответ. Вид ответа задачи не может быть ни видом НАБОР, ни видом РЯД.

Понятия, объявленные вне задачи, также видимы и в тех местах задачи, в которых они не перекрыты объявлением внутреннего понятия с тем же самым названием.

ОбъявлениеЗадачи | = | ЗаголовокЗадачи ";" ТелоЗадачи название.
ЗаголовокЗадачи | = | ЗАДАЧА название ["-"] [Приёмники [":" ВидОтвета]].
ТелоЗадачи | = | Объявления [УКАЗ Указания] КОН.

Объявления

=

{ ПОСТ

{ОбъявлениеПостоянной ";"}

| ВИД

{ОбъявлениеВида ";"}

| ПЕР

{ОбъявлениеПеременных ";"}}

{ ОбъявлениеЗадачи ";" | ЗаготовкаЗадачи ";"}.

ЗаготовкаЗадачи | = | ЗАДАЧА ["*"] "^" название ["-"] [Приёмники [":" ВидОтвета]].
ВидОтвета | = | ПолноеНазвание

Заготовка задачи служит для того, чтобы разрешить вызовы задачи до её объявления. Написание заготовки задачи отличается от написания заголовка задачи только разделителем "^" после слова ЗАДАЧА.

Пример заготовки задачи:

    ЗАДАЧА ^ПисЦепь-(р:ЦЕПЬ);

## 9.1. Приёмники

Приёмники – это переменные, которые будут соответствовать источникам после вызова данной задачи. Имеются два рода приёмников: приёмники значений и приёмники ссылок, отличающиеся при объявлении соответственно отсутствием или наличием метки общедоступности (см. 3). Приёмники значений – это внутренние переменные задачи, которым в качестве начального присваивается значение соответствующего источника. Приёмниками значений также являются и приёмники простых видов, объявленные с меткой "-". Приёмники значений не могут быть составного вида. Приёмники ссылок соответствуют источникам, которые являются переменными, и означают эти переменные. Приёмники ссылок с меткой "-" также могут соответствовать и цепочкам знаков. Область действия приёмника простирается от его объявления до конца задачи, в которой он объявлен. В этой области невозможно изменять значения у тех приёмников, которые объявлены с меткой "-". Задача без приёмников, которая возвращает ответ, должна иметь пустой список приёмников. Она должна вызываться обозначением задачи, чей список источников должен быть тоже пустым.

Приёмники | = | "(" [ОбъявленияПеременных] ")".
ОбъявленияПеременных | = | ОбъявлениеПеременных {";" ОбъявлениеПеременной }.

Пусть Впр – вид приёмника пр (кроме открытого ряда) и Вис – вид соответствующего источника ис. Для приёмников ссылок Вис и Впр должны быть одинаковыми видами, или Впр должен быть видом НАБОР, а Вис – расширением Впр. Всегда ис должен быть совместим при вызове задачи с пр (см. 14).

Если Вис – открытый ряд, то размер пр становится равным размеру ис.

Примеры объявлений задач:

    ЗАДАЧА ПисатьЦел-(ц:ЦЕЛ); (* 0<=ц<100000 *)
    ПЕР
      н:ЦЕЛ;
      цифры:РЯД 6 ИЗ ЗНАК;
    УКАЗ
      н:=0;
      ПОВТОРЯТЬ
        цифры[н]:=ВЗНАК(ц ОСТАТОК 10+ВЦЕЛ("0"));
        ц:=ц ДЕЛИТЬ 10;
        УВЕЛИЧИТЬ(н)
      ДО ц=0;
      цифры[н]:=0X;
      ПисатьЦепь(цифры)
    КОН ПисЦел;

    ЗАДАЧА ПисатьЦепь-(р:ЦЕПЬ);
    ПЕР
      н:ЦЕЛ;
    УКАЗ
      н:=0;
      ПОКА (н < РАЗМЕР(р)) И (р[н] # 0X) ВЫП
        ПисатьЗнак(р[н]);
        УВЕЛИЧИТЬ(н)
      КОН
    КОН ПисатьЦепь;

    ЗАДАЧА ЧитатьЦел-(ц+:ЦЕЛ);
    ПЕР
      знак:ЗНАК;
    УКАЗ
      ц:=0;
      ЧитатьЗнак(знак);
      ПОКА ("0" <= знак) И (знак <= "9") ВЫП
        ц:=10*ц+(ВЦЕЛ(знак)-ВЦЕЛ("0"));
        ЧитатьЗнак(знак)
      КОН
    КОН ЧитатьЦел;

    ЗАДАЧА log2(x:ЦЕЛ):ЦЕЛ; (* x > 0 *)
    ПЕР
      о:ЦЕЛ;
    УКАЗ
      о:=0;
      ПОКА x > 1 ВЫП
        x:=x ДЕЛИТЬ 2;
        УВЕЛИЧИТЬ(о)
      КОН;
      ВОЗВРАТ о
    КОН log2;

## 9.2. Встроенные задачи

Следующая таблица содержит список встроенных задач. Некоторые задачи – обобщённые, т.е. они применимы к данным нескольких видов. Обозначения названий: п – переменная, в – выражение, Вд – вид данных.

Задачи, возвращающие ответ:

Вызов задачи | Виды источников | Вид ответа | Значение ответа
ВЗНАК(в) | целый | ЗНАК | знак с порядковым номером в
ВЦЕЛ(в) | ЗНАК | ЦЕЛ | порядковый номер в
ВШИРЦЕЛ(в) | вещественный | ШИРЦЕЛ | ближайшее к в целое
ДЛИНА(в) | цепочка знаков | ЦЕЛ | длина цепочки знаков
ДЛИНА(в) | ЦЕПЬ[Размер] | ЦЕЛ | позиция первого 0X знака или РАЗМЕР(в), если такого знака в ряду не существует
ЗАДАНО(в) | цепочка знаков | КЛЮЧ | возвращает ВКЛ, если задан ключ преобразования –кв
МАКС(Вд) | основной | Вд | наибольшее значение переменных вида Вд
МАКС(МНОЖ) | МНОЖ | ЦЕЛ | наибольший элемент множества
МИН(Вд) | основной | Вд | наименьшее значение переменных вида Вд
МИН(МНОЖ) | МНОЖ | ЦЕЛ | 0
МОДУЛЬ(в) | числовой | как и у в | модуль в
РАЗМЕР(п) | РЯД | ЦЕЛ | равносильно РАЗМЕР(п,0)
РАЗМЕР(п,в) | п:РЯД; в:целый | ЦЕЛ | размер п в измерении в (первым считается 0-е измерение)
УЗК(в) | ШИРЦЕЛ | ЦЕЛ | тождество
УЗК(в) | ЦЕЛ | УЗКЦЕЛ | тождество
УЗК(в) | УЗКЦЕЛ | ЯЧЦЕЛ | тождество
УЗК(в) | ШИРВЕЩ | ВЕЩ | тождество (возможно усечение)
ЦЕЛЧАСТЬ(в) | вещественный | вещественный | целая часть в
ЧЕТ(в) | целый | КЛЮЧ | в ОСТАТОК 2 = 0

Собственно задачи:

Вызов задачи | Виды источников | Выполняемое действие
ОБНУЛИТЬ(п) | п:составной вид | заполнение нулями всех переменных, входящих в состав п
ПОСТАВИТЬ(п1,п2,в) | п1:БЕГУНОК ПО Вд; п2:РЯД ИЗ Вд; в: целый | начальная выставка бегунка п1 на переменную с номером в ряда п2
ПРОВЕРИТЬ(в) | КЛЮЧ | прерывает выполнение приложения, если не в
СМЕСТИТЬ(п,в) | п:БЕГУНОК ПО Вд; в: целая постоянная | перемещение бегунка п на в переменных ряда
СОЗДАТЬ(п) | ДОСТУП К НАБОР или ДОСТУП К РЯД | размещает п^
СОЗДАТЬ(п,в0,...,вn) | п:ДОСТУП к открытому ряду; вi:целый | размещает п^ с размерами в0..вn
СОЗДАТЬ(п,в) | п:ДОСТУП К ЦЕПЬ; в:цепочка знаков; в:ЦЕПЬ; в:ЦЕПЬ[Размер]; | размещает п^ с размером равным ДЛИНА(в)+1 и списывает значение в в п^ (см. СПИСАТЬ)
СПИСАТЬ(в,п) | в:цепочка знаков; в:ЦЕПЬ; в:ЦЕПЬ[Размер1]; п:ЦЕПЬ; п:ЦЕПЬ[Размер2]; | п:=в
СТОП(в) | целый | прерывает выполнение приложения и передаёт окружению значение в
УВЕЛИЧИТЬ(п) | целый | п:=п+1
УВЕЛИЧИТЬ(п,в) | п,в:целый | п:=п+в
УМЕНЬШИТЬ(п) | целый | п:=п-1
УМЕНЬШИТЬ(п,в) | п,в:целый | п:=п-в

Задача СПИСАТЬ(в,п) разрешает присваивание цепочки знаков или ряда из знаков в, содержащего ограничитель 0X, другому ряду из знаков п. В случае необходимости присвоенное значение усекается до размера РАЗМЕР(п)-1. Ряд п всегда будет содержать 0X как ограничитель.

# 10. Отделы

Отдел – это совокупность объявлений постоянных, видов, переменных и задач с последовательностью указаний, предназначенных для задания переменным отдела их начальных значений.

Отдел

=

ОТДЕЛ название ["-" | "+"] ";"

[ИСПОЛЬЗУЕТ

название [ИЗ цепочка] {"," название [ИЗ цепочка]} ";"]

Объявления

[УКАЗ

Указания]

КОН название ".".

В отделе-владельце необходимо ставить метки доступности в объявлениях названий тех понятий (см. 3), которые должны быть видимыми в отделах-пользователях. Названия отделов-владельцев, понятия которых используются в данном отделе-пользователе, необходимо перечислить после служебного слова ИСПОЛЬЗУЕТ в начале отдела-пользователя, указывая при необходимости после служебного слова ИЗ путь к текстовому файлу отдела-владельца. Закольцовывание при использовании отделов недопустимо. Путь к служебным отделам ОБХОД (см. 11) и СРЕДА (см. 12) указывать ненужно.

Запущенным отделом считается отдел, у которого уже запущены все используемые отделы и выполнена последовательность указаний после слова УКАЗ. Запуск приложения осуществляется запуском головного отдела, отдела, у которого название отмечено "+".

# 11. Отдел ОБХОД

Отдел ОБХОД содержит средства, позволяющие обойти правила совместимости видов, наложенные определением языка. Рекомендуется ограничить использование этих средств отделами низкого уровня.

Виды Цел8, Цел16, Цел32, Цел64, Вещ32, Вещ64, определённые в этом отделе, являются вспомогательными числовыми видами. В названиях этих видов явно указывается число разрядов, занимаемых переменными этих видов. Вспомогательный числовой вид Адрес применяется в адресных задачах отдела ОБХОД.

В отделе ОБХОД определён также вид Доступ. Переменным вида Доступ могут быть присвоены значения переменных любого вида ДОСТУП. Соответственно, если приёмник ссылок имеет вид Доступ, то источник может иметь произвольный вид ДОСТУП.

Переменным вида Ячейка можно присваивать значения переменных вида ЯЧЦЕЛ. Если приёмник ссылок имеет вид РЯД ИЗ Ячейка (или Ячейки), то соответствующий источник может иметь любой вид.

Задачи, которые содержатся в отделе ОБХОД, перечислены в таблицах. Обозначения: п – переменная, в и ав – выражения, Вд – вид данных.

Задачи, возвращающие ответ:

Вызов задачи | Виды источников | Вид ответа | Выполняемое действие
ПолучитьАдрес(п) | любой | Адрес | возвращает адрес п
Значение(Вд,в) | размеры данных (см. 13.2) Вд и в должны совпадать | Вд | в воспринимается как значение вида Вд
Узк(в) | числовой | меньший вид | тождество

Собственно задачи:

Вызов задачи | Виды источников | Выполняемое действие
ИзПамяти(ав,п) | ав:Адрес; п:любой основной вид, вид ДОСТУП, вид ЗАДАЧА | п:=Память[ав]
ВПамять(ав,в) | ав:Адрес; в:любой основной вид, вид ДОСТУП, вид ЗАДАЧА | Память[ав]:=в
Образ(ав0,ав1,в) | ав0,ав1:Адрес; в:целый | Память[ав1…ав1+в-1]:= Память[ав0…ав0+в-1]

# 12. Среда выполнения

## 12.1. Уборка памяти

Нет молочка, так сливок дай.

В языке существует встроенная задача СОЗДАТЬ, которая распределяет участки данных в свободной памяти. Однако, нет никакого способа явно освободить уже распределённый участок. Взамен этого среда выполнения Глагол-приложений сама производит уборку памяти, после которой задача СОЗДАТЬ сможет распределять неиспользуемые участки памяти под новые данные. Участок считается используемым, если он доступен по цепочке переменных вида ДОСТУП. Эта цепочка может начинаться или от переменных уровня отдела, или от переменных в вызванных на данный момент задачах. Разрыв этой цепочки (например, присваиванием переменной значения ПУСТО) переводит все последующие по цепочке участки в разряд неиспользуемых.

Таким образом, уборка памяти избавляет человека от такой непростой задачи, как нахождение правильного способа освобождения памяти при использовании сложных составных данных.

## 12.2. Описатели вида

При верном псе и сторож спит.

Во время выполнения приложения для проверки и охраны вида необходимы данные о виде размещённых переменных. Также и для уборки памяти необходимо знать о расположении свойств вида ДОСТУП в размещённых переменных вида НАБОР. Все эти сведения сохраняются в так называемых описателях вида. Один описатель необходим во время выполнения приложения для каждого вида НАБОР. Для каждой размещённой переменной вида НАБОР в скрытом свойстве ОВ, предшествующем обычным свойствам этой переменной, сохраняется доступ к описателю вида.

Каждый описатель вида обязательно хранит ряд доступов ко всем описателям опорных видов (ООВ), начиная с родоначальника и заканчивая доступом к самому себе. Этот ряд необходим для охраны и проверки вида.

п

п

п^

<.ОВ> | ЗолотоеЯйцо
.твёрдость | 10
.положение | Стол
.богатство | 1.0E-10

ЗолотоеЯйцо^

.ООВ | Яйцо
ЗолотоеЯйцо
ПУСТО
…

Яйцо^

.ООВ | Яйцо
ПУСТО
ПУСТО
…

Для переменной п вида ЗолотоеЯйцо (см. 5) рисунок показывает устройство данных среды выполнения.

Проверка вида – п ЯВЛЯЕТСЯ Вд преобразуется в выражение сравнения: п^.ОВ^.ООВ[УРВ]=ОВ. Уровень расширения вида (УРВ) и описатель вида Вд (ОВ) известны во время преобразования. Например, уровень расширения вида Яйцо – 0 (этот вид не имеет опорных), а уровень расширения вида ЗолотоеЯйцо равен 1.

# 13. Перевод в машинное представление

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

## 13.1. Тексторез

Тексторез даёт возможность выборочного перевода текста отдела в машинный код. Области перевода задаются указаниями ЕСЛИ ТО (см. 8.3), ограниченными скобками <* и *> (см. 2). В качестве условий для этих указаний могут использоваться только постоянные выражения. Области перевода могут быть вложенными.

Пример:

    ОТДЕЛ отдел;
    ИСПОЛЬЗУЕТ настрой; (* настройка точности вычислений и др. *)
    ПОСТ
      вещ=ВКЛ; (* работа с вещественной или целой арифметикой *)
    ПЕР
      длина,ширина:
      <* ЕСЛИ настрой.точность=2 ТО *>
        <* ЕСЛИ вещ ТО *>
             ШИРВЕЩ;
        <* ИНАЧЕ *>
             ШИРЦЕЛ;
        <* КОН *>
      <* ИНАЧЕ *>
        <* ЕСЛИ вещ ТО *>
             ВЕЩ;
        <* ИНАЧЕ *>
             ЦЕЛ;
        <* КОН *>
      <* КОН *>

## 13.2. Преобразователь Глагола

С помощью преобразователя Глагола (ПГ.exe) можно переводить исходные тексты приложений в машинный код формата COFF. В полученном коде переменные простых видов занимают следующее число разрядов:

Вид | Разрядов | Вид | Разрядов
КЛЮЧ | 8 | ОБХОД.Цел8 | 8
ЗНАК | 16 | ОБХОД.Цел16 | 16
ЯЧЦЕЛ | 8 | ОБХОД.Цел32 | 32
УЗКЦЕЛ | 16 | ОБХОД.Цел64 | 64
ЦЕЛ | 32 | ОБХОД.Вещ32 | 32
ШИРЦЕЛ | 64 | ОБХОД.Вещ64 | 64
ВЕЩ | 32 | ОБХОД.Ячейка | 8
ШИРВЕЩ | 64 | ОБХОД.Адрес | 32
МНОЖ | 32 |  |

ПГ можно настроить для создания кода, содержащего данные для внешнего отладчика, самопроверку работы приложений, отработки встроенной задачи ПРОВЕРИТЬ (см. 9.2), установку в ПУСТО переменных доступа при каждом вызове задач, в которых определены эти переменные. Также можно настроить ключи для взаимодействия с задачей ЗАДАНО (см. 9.2).

Самопроверка следит за тем, чтобы не было выхода за границы ряда, переполнения при арифметических действиях, выхода за границы допустимых значений простых видов, доступа по значению ПУСТО, деления на ноль.

## 13.3. Расширение языка для взаимодействия с иноязычными приложениями

По умолчанию, для ускорения доступа к переменным набора производится выравнивание их положения по границе слова или двойного слова. Такое выравнивание данных не будет производиться, если при определении вида (см. 5.3) перед словом НАБОР добавить слово СЖАТЫЙ.

ВидНабор | = | [СЖАТЫЙ] НАБОР ["(" ПолноеНазвание ")"] [ОбъявленияПеременных] КОН.

В данном примере

    ВИД
      Набор=СЖАТЫЙ НАБОР
        з1:ЗНАК;  (* 1  2 *)
        у :УЗКЦЕЛ;(* 2  2 *)
        з2:ЗНАК;  (* 1  4 *)
        ц :ЦЕЛ;   (* 4  4 *)
      КОН; (* всего: 8 12 *)
    ПЕР
      набор:Набор;

переменная "набор" будет занимать не 12, а 8 ячеек. Использование сжатых наборов понижает скорость доступа к переменным набора, но позволяет достичь совместимости с внешними источниками данных.

Для того чтобы задачи, написанные на Глаголе, правильно принимали источники из иноязычных приложений, необходимо при объявлении задачи (см. 9) или объявлении вида ЗАДАЧА (см. 5.6) после слова ЗАДАЧА поставить знак "*".

ЗаголовокЗадачи | = | ЗАДАЧА ["*"] название ["-"] [Приёмники [":" ВидОтвета]].

ВидЗадача | = | ЗАДАЧА ["*"] [Приёмники [":" ВидОтвета]].

Пример:

    ПЕР
      Proc:ЗАДАЧА*(...);
    ЗАДАЧА* WinProc(...);
    ...
      Proc:=WinProc;

Задачи, объявленные таким образом, недопустимо вызывать из приложений, написанных на Глаголе. Иноязычное приложение сможет самостоятельно связаться с такой задачей во время загрузки, если она объявлена в головном отделе (см. 10) и сопровождается меткой общедоступности (см. 3).

Пример:

    ОТДЕЛ ДПБ+;
    ЗАДАЧА* DllEntryPoint-(...):ЦЕЛ;
    ...

Для вызова внешних иноязычных задач применяются особым образом объявленные задачи. В таких объявлениях за обычным заголовком задачи после слова ВЫЗОВ записываются цепочка знаков с названием требуемой иноязычной задачи, слово ИЗ и цепочка знаков с названием места хранения этой задачи.

ОбъявлениеЗадачи | = | ЗаголовокЗадачи ";" ВЫЗОВ цепочка ИЗ цепочка.

Пример:

    ЗАДАЧА CreateFile(...):ЦЕЛ; ВЫЗОВ "CreateFileW" ИЗ "Kernel32.dll";

Отделы с названиями, отмеченными "-" (см. 10), не должны содержать указаний. Эти отделы служат для объявления понятий отделов-двойников, у которых машинное представление получено через другие языки программирования.

# 14. Соответствие видов

Не дочитав сказки, не бросай указки.

Целые виды | ЯЧЦЕЛ, УЗКЦЕЛ, ЦЕЛ, ШИРЦЕЛ
Вещественные виды | ВЕЩ, ШИРВЕЩ
Числовые виды | целые виды, вещественные виды

### Одинаковые виды

Две переменные п1 и п2 вида В1 и В2 соответственно имеют одинаковый вид, если

а) В1 и В2 оба обозначены одним и тем же названием, или

б) В2 объявлен как В2=В1, или

в) п1 и п2 появляются в одном и том же списке названий переменных, свойств набора или объявлении приёмников и не являются открытыми рядами.

### Равные виды

Виды В1 и В2 называются равными видами, если

а) В1 и В2 – одинаковые виды, или

б) В1 и В2 – виды открытый ряд с равными опорными видами, или

в) В1 и В2 – виды задач, чьи заголовки совпадают.

### Поглощение числовых видов

Числовые виды поглощают более узкие числовые виды согласно следующему порядку:

ШИРВЕЩ >= ВЕЩ >= ШИРЦЕЛ >= ЦЕЛ >= УЗКЦЕЛ >= ЯЧЦЕЛ.

### Расширение видов (опорный вид)

В объявлении вида Р=НАБОР (О) … КОН, вид Р – непосредственное расширение вида О, а О – непосредственный опорный вид вида Р.

Вид Р является расширением вида О (О является опорным видом Р), если

а) О и Р – одинаковые виды, или

б) Р – непосредственное расширение вида, являющегося расширением вида О.

Если ДО=ДОСТУП К О и ДР=ДОСТУП К Р, то вид ДР является расширением вида ДО (вид ДО является опорным видом ДР), если вид Р является расширением вида О.

### Подобие опорных видов ряда

Опорный вид ОВп ряда Вп подобен опорному виду ОВр ряда Вр, если

а) ОВп и ОВр – одинаковые виды, или

б) ОВп и ОВр – виды ДОСТУП и ОВп есть расширение вида ОВр, или

в) ОВр – открытый ряд, ОВп – произвольный ряд, а опорный вид ряда ОВп подобен опорному виду ряда ОВр.

### Совместимость по присваиванию

Выражение в вида Вв совместимо по присваиванию с переменной п вида Вп, если выполнено одно из следующих условий:

а) Вв и Вп – одинаковые виды;

б) Вв и Вп – числовые виды и Вп поглощает Вв;

в) Вв и Вп – виды НАБОР, Вв есть расширение вида Вп, а п имеет размещённый вид Вп;

г) Вв и Вп – виды ДОСТУП и Вв есть расширение вида Вп;

д) Вв и Вп – виды БЕГУНОК и опорные виды у Вв и Вп одинаковые;

е) Вп – вид ДОСТУП, БЕГУНОК, ЗАДАЧА, а в – ПУСТО;

ж) Вп – РЯД N ИЗ ЗНАК, в – цепочка из M знаков и M<N;

з) Вп – вид ЗАДАЧА, а п – название задачи, у которой заголовок совпадает с заголовком Вп;

и) Вп – доступ к открытому ряду, Вв – доступ к произвольному ряду, а опорный вид ряда по доступу Вв подобен опорному виду ряда по доступу Вп.

### Совместимость при вызове задачи

Выражение источника и вида Ви совместимо при вызове задачи с приёмником п вида Вп, если выполнено одно из следующих условий:

а) Ви совместимо по присваиванию с Вп;

б) Вп – ЦЕПЬ, и – цепочка знаков (п не может быть приёмником ссылок для записи);

в) Вп – открытый ряд, Ви – произвольный ряд, а опорный вид ряда Ви подобен опорному виду ряда Вп.

### Совместимость выражений

Для действия данные являются совместимыми выражениями, если их виды соответствуют следующей таблице (в которой указан также и вид ответа выражения). Ряды из знаков, которые сравниваются, должны содержать в качестве ограничителя 0X. Вид Вр должен быть расширением вида Во:

Действие | Вид первого данного | Вид второго данного | Вид ответа
+ – * | числовой | числовой | наименьший числовой вид, поглощающий виды обоих данных
/ | числовой | числовой | наименьший вещественный вид, поглощающий виды обоих данных
ДЕЛИТЬ ОСТАТОК | целый | целый | наименьший целый вид, поглощающий виды обоих данных
+ – * / | МНОЖ | МНОЖ | МНОЖ
ИЛИ И НЕ | КЛЮЧ | КЛЮЧ | КЛЮЧ
= # < <= > >= | числовой | числовой | КЛЮЧ
= # < <= > >= | ЗНАК | ЗНАК | КЛЮЧ
< <= > >= | БЕГУНОК ПО Во | БЕГУНОК ПО Во | КЛЮЧ
= # < <= > >= | ЦЕПЬ, цепочка знаков | ЦЕПЬ, цепочка знаков | КЛЮЧ
= # | КЛЮЧ | КЛЮЧ | КЛЮЧ
= # | МНОЖ | МНОЖ | КЛЮЧ
= # | ЗАДАЧА, ПУСТО | ЗАДАЧА, ПУСТО | КЛЮЧ
= # | БЕГУНОК ПО Во, ПУСТО | БЕГУНОК ПО Во, ПУСТО | КЛЮЧ
= # | ДОСТУП К Во, Вр, ПУСТО | ДОСТУП К Во, Вр, ПУСТО | КЛЮЧ
В | целый | МНОЖ | КЛЮЧ
ЯВЛЯЕТСЯ | Во | Вр | КЛЮЧ

### Совпадение заголовков задач

Два заголовка задач совпадают, если

а) они имеют одинаковое количество приёмников, и

б) они имеют или одинаковый вид ответа задачи, или не имеют никакого, и

в) приёмники в соответствующих позициях имеют равные виды, и

г) приёмники в соответствующих позициях оба – или приёмники значений, или приёмники ссылок.

# 15. Правила построения языка

Отдел | = | ОТДЕЛ название ["-" | "+"] ";" [ИСПОЛЬЗУЕТ название [ИЗ цепочка] {"," название [ИЗ цепочка]} ";"] Объявления [УКАЗ Указания] КОН название ".".
Объявления | = | { ПОСТ {ОбъявлениеПостоянной ";"} | ВИД {ОбъявлениеВида ";"} | ПЕР {ОбъявлениеПеременных ";"}} { ОбъявлениеЗадачи ";" | ЗаготовкаЗадачи ";"}.
ОбъявлениеПостоянной | = | название ["-"] "=" ПостоянноеВыражение.
ОбъявлениеВида | = | название ["-"] "=" Вид.
ОбъявлениеПеременных | = | название ["-" | "+"] {"," название ["-" | "+"]} ":" Вид.
ОбъявлениеЗадачи | = | ЗаголовокЗадачи ";" ТелоЗадачи название | ЗаголовокЗадачи ";" ВЫЗОВ цепочка ИЗ цепочка.
ЗаголовокЗадачи | = | ЗАДАЧА ["*"] название ["-"] ["(" [ОбъявленияПеременных] ")" [":" ПолноеНазвание]].
ТелоЗадачи | = | Объявления [УКАЗ Указания] КОН.
ЗаготовкаЗадачи | = | ЗАДАЧА ["*"] "^" название ["-"] ["(" [ОбъявленияПеременных] ")" [":" ПолноеНазвание]].
ОбъявленияПеременных | = | ОбъявлениеПеременных {";" ОбъявлениеПеременных}.

Вид

=

ПолноеНазвание

| РЯД [ПостоянноеВыражение {"," ПостоянноеВыражение}] ИЗ Вид

| ЦЕПЬ ["[" ПостоянноеВыражение "]"]

| [СЖАТЫЙ] НАБОР ["(" ПолноеНазвание ")"] [ОбъявленияПеременных] КОН

| ДОСТУП К Вид

| БЕГУНОК [ПостоянноеВыражение] ПО Вид

| ЗАДАЧА ["*"] ["(" [ОбъявленияПеременных] ")" [":" ПолноеНазвание]].

Указания | = | Указание {";" Указание}.

Указание

=

[ Обозначение ":=" Выражение

| Обозначение ["(" [Выражения] ")"]

| ЕСЛИ Выражение ТО Указания { АЕСЛИ Выражение ТО Указания} [ ИНАЧЕ Указания] КОН

| ВЫБРАТЬ Выражение ИЗ Вариант {"|" Вариант} [ ИНАЧЕ Указания] КОН

| ПОКА Выражение ВЫП Указания КОН

| ПОВТОРЯТЬ Указания ДО Выражение

| ОТ ПолноеНазвание ":=" Выражение ДО Выражение [ПО ПостоянноеВыражение] ВЫП Указания КОН

| КОЛЬЦО Указания КОН

| ДЛЯ ПолноеНазвание ВИДА ОхранаУказаний {"|" ОхранаУказаний } [ИНАЧЕ Указания] КОН

| ВОЗВРАТ [Выражение]

| ВЫХОД].

Вариант | = | [Метки {"," Метки} ":" Указания].
Метки | = | ПостоянноеВыражение [".." ПостоянноеВыражение].
ОхранаУказаний | = | [ПолноеНазвание ":" Указания].
ПостоянноеВыражение | = | Выражение.
Выражения | = | Выражение {"," Выражение}.
Выражение | = | ПростоеВыражение [Отношение ПростоеВыражение].
ПростоеВыражение | = | ["+" | "-"] Слагаемое {Сложение Слагаемое}.
Слагаемое | = | Множитель {Умножение Множитель}.
Множитель | = | Обозначение ["(" [Выражения] ")"] | число | одинзнак | цепочка | ПУСТО | Множество | "(" Выражение ")" | НЕ Множитель.
Множество | = | "{" [Элемент {"," Элемент}] "}".
Элемент | = | Выражение [".." Выражение].
Отношение | = | "=" | "#" | "<" | "<=" | ">" | ">=" | В | ЯВЛЯЕТСЯ.
Сложение | = | "+" | "-" | ИЛИ.
Умножение | = | "*" | "/" | ДЕЛИТЬ | ОСТАТОК | И.
Обозначение | = | ПолноеНазвание {"." название | "[" Выражения "]" | "^" | "(" ПолноеНазвание ")"}.
ПолноеНазвание | = | [название "."] название.

Сделано в России