Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
Руководство по языку программирования ГлаголАвгуст 2018 г.
|
|
Пока глагол в сердцах людских, Ниспосланный для битв и пира, Не содрогнёт страстей мирских, Певец — твоя ничтожна лира! Леонид Ивáнов, 1999 ПЕВЕЦ, из сб. "Времени капели". |
Что на уме, то и на языке. |
|
|
название |
= | буква {буква | цифра} |
Примеры:
Слово1 ПолПи i знак ДкЗолотоеЯйцо
Числа(2) используются для представления целых и вещественных чисел без знака. Целое число имеет ВИД данных, который является наименьшим целым ВИДом, способным хранить его значение (см. 5.1). Если запись целого числа оканчивается буквой H, то оно представлено в шестнадцатеричном виде, иначе оно представлено в десятичном виде (т.е. в десятичной системе счисления).
Примеры:
ПОСТ яц8 = -128; (* 8-ми разрядное МИН(ЯЧЦЕЛ) *) уц16 = -129; (* 16-ти разрядное УЗКЦЕЛ *) и8 = 127; (* 8-ми разрядное МАКС(ЯЧЦЕЛ) *) и16 = 128; (* 16-ти разрядное УЗКЦЕЛ *) вещПи = 3.1416; (* 32-х разрядное ВЕЩ *) швПи = 3.141592654; (* 64-х разрядное ШИРВЕЩ *) ПолПи = швПи/2; (* 64-х разрядное ШИРВЕЩ *)
Вещественное число всегда содержит десятичную точку. Оно может также содержать десятичный порядок. Буква 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 |
Одиночные знаки(3) обозначаются порядковым номером знака в шестнадцатеричном виде с приписанной в конце буквой X.
одинзнак |
= | цифра {цифра16} "X" |
Примеры:
00X . . . 0FX . . . FFX
Цепочки знаков(4) – это последовательности печатных знаков, взятые в одиночные (') или двойные (") кавычки. Открывающая кавычка должна быть такой же, как и закрывающая, и не должна встречаться внутри цепочки знаков. Последовательность из знаков #nnnn, где nnnn – четырёхзначное шестнадцатеричное число, обозначает знак с кодом nnnn. Для знака # используется последовательность из ##. Количество знаков в цепочке называется её длиной. Цепочка из одного знака может использоваться везде, где допустим одиночный знак, и наоборот.
цепочка |
= | """ {знак} """ | "'" {знак} "' |
знак |
= | печзнак | "#" цифра16 цифра16 | "##" |
Примеры:
'Сама (мышь) залезла в кувшин, а кричит: "Пусти!"' "Зацепился за пень, #0D#0A да и стоит день." "#0D" "_1" "1" "##" "Если А #23 Б, то"
Действия(5), указания(6) и разделители(7), перечисленные ниже – это знаки (арифметических действий [*+-/], отношений [=#><], разделители [:.;,:= | ]), пары знаков (скобки ()/[]/{}) и служебные слова (логическое действие [И / ИЛИ / НЕ], отношение [В (принадлежности к множеству) / ЯВЛЯЕТСЯ (проверка вида переменной)], вид [ЦЕПЬ / РЯД / НАБОР / ДОСТУП / БЕГУНОК / ЗАДАЧА], указание [ОТДЕЛ / ВИД / ПОСТ / ПЕР / УКАЗ / КОН /…], [ВОЗВРАТ / ВЫЗОВ / ВЫХОД] и [ДЛЯ…ВИДА ]). См. таблицу:
+ |
= |
В | ЗАДАЧА | ОТДЕЛ |
- |
# |
ВИД | И | ПЕР[ЕМЕННЫЕ] |
* |
< |
ВИДА | ИЗ | ПО |
/ |
> |
ВОЗВРАТ | ИЛИ | ПОВТОРЯТЬ |
. |
<= |
ВЫБРАТЬ | ИНАЧЕ | ПОКА |
, |
>= |
ВЫЗОВ | ИСПОЛЬЗУЕТ | ПОСТ[ОЯННЫЕ] |
; |
.. |
ВЫП[ОЛНЯТЬ] | К | ПУСТО |
| |
: |
ВЫХОД | КОЛЬЦО | РЯД |
( |
) |
ДЕЛИТЬ | КОН[ЕЦ] | ТО |
[ |
] |
ДЛЯ | НАБОР | УКАЗ[АНИЯ] |
{ |
} |
ДО | НЕ | ЦЕПЬ |
:= |
АЕСЛИ | ДОСТУП | ОСТАТОК | ЯВЛЯЕТСЯ |
^ |
БЕГУНОК | ЕСЛИ | ОТ |
|
ПолноеНазвание |
= | [название "."] название (* ВИДа, ПОСТоянной, ПЕРеменной *) |
Следующие названия являются встроенными в язык (это: простые виды данных, логические постоянные, встроенные задачи), т.е. соответствующие понятия считаются уже объявленными на уровне каждого отдела. Применение этих названий см. в 5.1 и 9.2.
ВЕЩ |
ЗНАК | ОБНУЛИТЬ | УВЕЛИЧИТЬ целое | ШИРВЕЩ |
ВКЛ |
КЛЮЧ | ПОСТАВИТЬ бегунок | УЗК | ШИРЦЕЛ |
ВЗНАК целое |
МАКС числ.вида | ПРОВЕРИТЬ | УЗКЦЕЛ | ЯЧЦЕЛ |
ВЦЕЛ знак |
МИН числ.вида | РАЗМЕР ряда | УМЕНЬШИТЬ целое | |
ВШИРЦЕЛ вещ |
МНОЖ[ЕСТВО] | СМЕСТИТЬ бегунок | ЦЕЛ[ОЕ] | |
ДЛИНА цепь |
МОДУЛЬ абс.вел. | СОЗДАТЬ | ЦЕЛЧАСТЬ | |
ЗАДАНО цепь |
ОТКЛ | СПИСАТЬ сост.вид | ЧЕТ целого |
|
ОбъявлениеПостоянной |
= | название ["-"] "=" ПостоянноеВыражение |
ПостоянноеВыражение |
= | Выражение |
Постоянное выражение – это выражение, которое может быть вычислено Преобразователем Глагола (ПГ) по его тексту без выполнения приложения. Его данные (см. 7.1) – другие постоянные, различные действия и встроенные задачи (см. 9.2), которые могут быть выполнены преобразователем Глагола.
Примеры объявления постоянной:
ПОСТ Слагаемых = 100; Пи- = 3.141592654; ПолПи- = Пи/2; Замечание1 = "Деление на ноль."; ПолноеМножество = {МИН(МНОЖ)..МАКС(МНОЖ)};
|
ОбъявлениеВида |
= | название ["-"] "=" Вид |
Вид |
= | ПолноеНазвание | ВидРяд | ВидНабор | ВидДоступ | ВидЗадача | ВидБегунок |
Примеры:
ВИД Таблица = РЯД Слагаемых ИЗ ВЕЩ; Функция = ЗАДАЧА(x:ЦЕЛ):ЦЕЛ; ДкЯйцо- = ДОСТУП К ОписаниеЯйца; ОписаниеЯйца- = НАБОР твёрдость-:ЦЕЛ; положение+:Место КОН; ДкЗолотоеЯйцо = ДОСТУП К ОписаниеЗолотогоЯйца; ОписаниеЗолотогоЯйца = НАБОР(ОписаниеЯйца) богатство:ВЕЩ КОН; Столбец = БЕГУНОК 3 ПО ЦЕЛ;
Аз да буки, да и конец науки.
Простые виды обозначены встроенными названиями. Соответствующие действия определены в 7.2, а встроенные задачи – в 9.2. Предусмотрены следующие простые виды:
Название | Принимаемые значения |
КЛЮЧ |
логические ВКЛ и ОТКЛ |
ЗНАК |
знаки с порядковыми номерами от 0X до 0FFX |
ЯЧЦЕЛ |
наименьшее представление целого числа |
УЗКЦЕЛ |
целые числа от МИН(УЗКЦЕЛ) до МАКС(УЗКЦЕЛ) |
ЦЕЛ |
целые числа от МИН(ЦЕЛ) до МАКС(ЦЕЛ) |
ШИРЦЕЛ |
целые числа от МИН(ШИРЦЕЛ) до МАКС(ШИРЦЕЛ) |
ВЕЩ |
вещественные числа от МИН(ВЕЩ) до МАКС(ВЕЩ) |
ШИРВЕЩ |
вещественные числа от МИН(ШИРВЕЩ) до МАКС(ШИРВЕЩ) |
МНОЖ |
множество из целых чисел от 0 до МАКС(МНОЖ) |
ЗНАК – знаковый вид.
КЛЮЧ – логический вид.
МНОЖ – вид множество.
ЯЧЦЕЛ, УЗКЦЕЛ, ЦЕЛ и ШИРЦЕЛ – целые виды, ВЕЩ и ШИРВЕЩ – вещественные виды, а вместе они образуют числовые виды.
Считается, что ШИРВЕЩ >= ВЕЩ >= ШИРЦЕЛ >= ЦЕЛ >= УЗКЦЕЛ >= ЯЧЦЕЛ, причём больший вид поглощает меньший вид.
Одна головня и в печи не горит, а две и в поле курятся.
Переменные вида РЯД состоят из совокупности переменных одного вида, называемого опорным видом ряда. Число переменных, составляющих ряд, называют его размером. Целое число от 0 и до РАЗМЕР ряда минус 1 выделяет соответствующую переменную из ряда.
ВидРяд |
= | РЯД [Размер {"," Размер}] ИЗ Вид | ЦЕПЬ ["[" Размер "]"] |
Размер |
= | ПостоянноеВыражение |
Объявление ряда
РЯД размер0,размер1, … ,размерn ИЗ Вп;
понимается как сокращение
РЯД размер0 ИЗ РЯД размер1 ИЗ . . . РЯД размерn ИЗ Вп
Объявление РЯД размер ИЗ ЗНАК можно записывать как ЦЕПЬ[размер].
Вид РЯД, объявленный без указания размера, называется открытым рядом. Такой вид используется только:
а) в приёмнике задачи (см. 9.1);
б) как опорный вид для вида ДОСТУП (см. 5.4);
в) как опорный вид другого открытого ряда.
Объявление ОБХОД.Ячейки равнозначно объявлению РЯД ИЗ ОБХОД.Ячейка (см. 11).
Примеры вида РЯД:
РЯД 10,N ИЗ ЦЕЛ; (* матрица 10xN *) РЯД ИЗ ЗНАК; (* открытый ряд из ЗНАК *) ЦЕПЬ; (* тоже что и РЯД ИЗ ЗНАК *) ОБХОД.Ячейки; (* открытый ряд из ОБХОД.Ячейка *)
Из многих малых выходит одно большое.
Переменные вида НАБОР могут состоять из совокупности переменных различного вида. Переменные, составляющие этот набор, называются свойствами набора. Объявление вида НАБОР определяет название и вид каждого свойства. Область действия названий свойств простирается от точки их объявления до конца объявления вида НАБОР, а также захватывает обозначения свойств переменных вида НАБОР (см. 7.1). Если вид НАБОР объявлен с меткой общедоступности (см. 3), то свойства, которые должны быть доступны в отделах-пользователях, также объявляются с метками общедоступности. Такие свойства называются общедоступными свойствами, а неотмеченные свойства называются скрытыми свойствами (внутри отдела).
ВидНабор |
= | НАБОР ["(" ПолноеНазвание ")"] [ОбъявлениеПеременных] КОН |
Примеры вида НАБОР:
НАБОР день,месяц,год:ЦЕЛ КОН; НАБОР имя-,фамилия-,отчество-:ЦЕПЬ[32]; возраст+:ЦЕЛ КОН;
Вид НАБОР может быть объявлен как расширение другого вида НАБОР. В следующем примере
ВИД О = НАБОР ц:ЦЕЛ КОН; Р = НАБОР(О) в:ВЕЩ КОН;
Р – непосредственное расширение вида О, а О – непосредственный Опорный Вид (ОпорВ) вида Р (см. 14). Переменные расширенного вида Р состоят из свойств, объявленных в ОпорВ (опорном виде), и новых свойств, которые объявлены в самом Р. Все названия, объявленные в расширенном наборе, должны быть отличны от названий, объявленных в его опорном виде (видах).
Отойдём да поглядим, хорошо ли мы сидим.
Переменные вида ДОСТУП принимают значения, которые обеспечивают доступ к переменным некоторого вида Вп.
ВидДоступ |
= | ДОСТУП К Вид |
Вид Вп называется Опорным Видом Доступа (ОпорВД) и может быть только видом РЯД или видом НАБОР. Вид ДОСТУП заимствует отношение расширений своего ОпорВД (Опорного Вида Доступ). Так, если вид Р является расширением вида О, то и вид
ДкР = ДОСТУП К Р
также является расширением видаДкО = ДОСТУП К О.
Если ДкВп – переменная вида ДОСТУП К Вп, то вызов встроенной задачи СОЗДАТЬ(ДкВп) (см. 9.2) размещает новую переменную вида Вп в свободной памяти (если вид Вп – n-мерный открытый ряд, то размещение должно быть выполнено вызовом
СОЗДАТЬ(ДкВп,размер0, … ,размерn-1),
где размер0, … ,размерn-1 – это выражения, которые задают размеры соответствующим измерениям ряда). После вызова встроенной задачи СОЗДАТЬ(ДкВп) переменная ДкВп будет хранить значение, которое обеспечивает доступ к этой новой уже размещённой переменной вида Вп.
Любая переменная вида ДОСТУП может принимать значение ПУСТО, при котором нет доступа к её не размещённой переменной.
Примеры вида ДОСТУП:
ВИД ДкЯйцо- = ДОСТУП К ОписаниеЯйца; ОписаниеЯйца- = НАБОР твёрдость-:ЦЕЛ; положение+:Место КОН; ДкЗолотоеЯйцо = ДОСТУП К ОписаниеЗолотогоЯйца; ОписаниеЗолотогоЯйца = НАБОР(ОписаниеЯйца) богатство:ВЕЩ КОН;
Тише едешь – дальше будешь.
Обычное обращение к элементу ряда р осуществляется по его номеру ц: р[ц]. При этом полный адрес элемента ц вычисляется так:
При последовательном обращении к элементам ряда р можно ускорить процесс вычислений за счёт сокращения числа вычислений полных адресов очередных элементов, если определять адрес следующего элемента через адрес предыдущего. Для этого в языке применяется вид данных БЕГУНОК. Вид элементов ряда, к которым будет осуществляться последовательное обращение, называется Опорным Видом Бегунка (ОпорВБ), а число элементов, на которое будет перемещаться бегунок после каждого к нему обращения, называется шагом бегунка. Шаг бегунка задаётся как целая ПОСТоянная. Если при объявлении вида БЕГУНОК шаг бегунка не указан, то считается, что шаг равен 1.
ВидБегунок |
= | БЕГУНОК [ШагБегунка] ПО Вид (* РЯД *) |
ШагБегунка |
= | ПостоянноеВыражение |
До первого обращения к элементам ряда бегунок Бегу должен быть установлен на нужный элемент ряда встроенной задачей ПОСТАВИТЬ(Бегу,p,цНач). Здесь р – переменная вида РЯД, а цНач – произвольное целое выражение. При этом Опорный Вид Бегунка Бегу должен совпадать с Опорным Видом ряда р. После такого вызова бегунок Бегу будет установлен на адрес элемента р[цНач], вычисленный без учёта границ ряда р.
Для перемещения бегунка Бегу на цШаг элементов ряда (без обращения к этим элементам) используется встроенная задача СМЕСТИТЬ(Бегу,цШаг), где цШаг – целая ПОСТоянная.
Переменные вида БЕГУНОК с одинаковыми ОпорВБ (Опорными Видами Бегунка) можно сравнивать друг с другом и со значением ПУСТО.
При обращении через бегунки к переменным ВИДа многомерный ряд, последний рассматривается как развёрнутый в одномерный.
Переменные вида БЕГУНОК могут быть определены только в оконечных задачах (т.е. таких, из которых не вызываются другие задачи). Каждая переменная вида БЕГУНОК занимает один регистр. Рассмотрим на двух примерах преимущества бегунков (по количеству вычислений полных адресов элементов ряда) по сравнению с обычным обращением к элементам ряда.
Пример 1. Вычисление скалярного произведения двух векторов.
В обычной задаче приходится вычислять полные адреса элементов вектора v1 и вектора v2 для каждой координаты н (итого: 2*РАЗМЕР(v1) раз):
ЗАДАЧА* ВекторНаВектор(v1-,v2-:Вектор):ЦЕЛ; ПЕР с,н:ЦЕЛ; УКАЗ с:=0; ОТ н:=0 ДО РАЗМЕР(v1)-1 ВЫП с:=с + v1[н]*v2[н] КОН; ВОЗВРАТ с КОН ВекторНаВектор;
Та же задача с использованием бегунков вычисляет полные адреса элементов вектора v1 и вектора v2 всего лишь 3 раза при вызове встроенной задачи ПОСТАВИТЬ(,,) перед циклом расчёта:
ЗАДАЧА* ВекторНаВектор(v1-,v2-:Вектор):ЦЕЛ; ПЕР с:ЦЕЛ; Бегу1,Бегу2,барьер:БЕГУНОК ПО ЦЕЛ; УКАЗ с:=0; ПОСТАВИТЬ(Бегу1,v1,0); (* Бегу1:=v1[0] с шагом 1 *) ПОСТАВИТЬ(Бегу2,v2,0); (* Бегу2:=v2[0] с шагом 1 *) ПОСТАВИТЬ(барьер,v1,РАЗМЕР(v1)); (* барьер:=v1[РАЗМЕР(v1)] уже за границей вектора v1[] *) ПОКА Бегу1 < барьер ВЫП с:=с + Бегу1^*Бегу2^ КОН; ВОЗВРАТ с КОН ВекторНаВектор;
Пример 2. Вычисление произведения двух входных матриц: м1 размером 4х3 и м2 размером 3х4 в выходную матрицу м3 размером 4х4.
Обычная задача аж 2*РАЗМЕР(м2,0)=2*3=6 раз вычисляет полные адреса элементов входных матриц для каждого элемента выходной матрицы м3[i,j] да ещё 4*4=16 раз вычисляет полные адреса всех элементов выходной матрицы м3:
ЗАДАЧА* МатрицаНаМатрицу(м1-,м2-,м3+:Матрица); ПЕР i,j:ЦЕЛ; УКАЗ ОТ i:=0 ДО 3 ВЫП (* по строкам матрицы м1 *) ОТ j:=0 ДО 3 ВЫП (* по столбцам матрицы м2 *) м3[i,j]:=м1[i,0]*м2[0,j] + м1[i,1]*м2[1,j] + м1[i,2]*м2[2,j] КОН КОН КОН МатрицаНаМатрицу;
Та же задача с использованием бегунков использует только 2 (вместо 6) вычисления полного адреса элементов входных матриц в 2-х вызовах встроенной задачи ПОСТАВИТЬ(,,) на каждый элемент выходной матрицы м3[i,j] да всего 1 раз (вместо 16) устанавливает бегунок Бегу3 на 0-й элемент выходной матрицы м3[0,0] перед циклом расчёта:
ЗАДАЧА* МатрицаНаМатрицу(м1-,м2-,м3+:Матрица); ПЕР i,j:ЦЕЛ; Бегу1,Бегу3:БЕГУНОК ПО ЦЕЛ; (* шаг бегунка: БЕГУНОК 1 ПО ЦЕЛ; *) Бегу2:БЕГУНОК 4 ПО ЦЕЛ; (* шаг бегунка Бегу2 равен 4 *) УКАЗ ПОСТАВИТЬ(Бегу3,м3,0); (* установить бегунок Бегу3 на м3[0,0] с шагом 1 приращения *) ОТ i:=0 ДО 3 ВЫП (* по строкам матрицы м1 *) ОТ j:=0 ДО 3 ВЫП (* по столбцам матрицы м2 *) ПОСТАВИТЬ(Бегу1,м1[i],0);(* переустановить бегунок Бегу1 на м1[i,0] с шагом 1 приращения *) ПОСТАВИТЬ(Бегу2,м2,j); (* установить бегунок Бегу2 на м2[0,j] с шагом 4 = РАЗМЕР(м2,1), измерения в м2[i,j] идут от 0…1 *) Бегу3^:=Бегу1^*Бегу2^ + Бегу1^*Бегу2^ + Бегу1^*Бегу2^; КОН КОН КОН МатрицаНаМатрицу;
Переменные вида ЗАДАЧА принимают значения, которые обеспечивают доступ к вызову задач. Эти переменные могут принимать и значение ПУСТО. Если задача з присваивается переменной вида Вп, то заголовки (см. 9.1) у з и у Вп должны совпадать (см. 14). При этом задача з не может быть ни встроенной задачей, ни вложенной в другую задачу.
ВидЗадача |
= | ЗАДАЧА [Приёмники [":" ВидОтвета]] |
Пример:
ВИД Функция = ЗАДАЧА(x:ВЕЩ):ВЕЩ;
|
ОбъявлениеПеременных |
= | название ["-" | "+"] {"," название ["-" | "+"]} ":" Вид |
Переменные вида НАБОР и вида ДОСТУП имеют как объявленный вид (или просто их вид), так и размещённый вид (вид их данных во время выполнения приложения). Объявленный вид определяет, какие свойства набора доступны. Для переменных вида ДОСТУП и приёмников ссылок вида НАБОР размещённый вид может быть расширением их объявленного вида. (Это аналог позднего связывания при ООП в ЯП C++/Turbo Pascal.)
Примеры объявлений переменных (см. примеры объявления вида ДкЯйцо в 5.4.):
ВИД ДкЯйцо- = ДОСТУП К ОписаниеЯйца; ДкЗолотоеЯйцо = ДОСТУП К ОписаниеЗолотогоЯйца;
ПЕР ц,i,j,M,N:ЦЕЛ; год,возраст:ЦЕЛ; x,y:ВЕЩ; к1,к2:КЛЮЧ; мн:МНОЖ; f:Функция; р:РЯД 100 ИЗ ВЕЩ; город:РЯД 16 ИЗ НАБОР название:ЦЕПЬ[32]; жителей:ЦЕЛ КОН; яйцо:ДкЯйцо; золотоеяйцо:ДкЗолотоеЯйцо; УКАЗ . . .
|
Обозначение |
= | ПолноеНазвание {"." название | "["Выражения"]" | "^" | "("ПолноеНазвание")"} |
Выражения |
= | Выражение {"," Выражение} |
Если р обозначает переменную вида РЯД, то р[в] обозначает элемент из ряда р, чей номер – текущее значение выражения в. Выражение в должно быть целого вида. Обозначение р[в0,в1, … ,вn] применимо вместо обозначения р[в0][в1] … [вn].
Если н обозначает переменную вида НАБОР, то н.с обозначает свойство с набора н.
Если р или н доступны только для чтения, то р[в] и н.с также доступны только для чтения.
Если пД обозначает переменную вида ДОСТУП, то пД^ обозначает переменную, к которой в пД хранится доступ. Обозначения пД^.с и пД^[в] могут быть сокращены до пД.с и пД[в].
Если Бегу обозначает переменную вида БЕГУНОК, то Бегу^ обозначает элемент ряда, соответствующий текущему значению бегунка Бегу. После обращения к элементу ряда, обозначенного таким способом, текущее значение Бегу смещяется на шаг по элементам ряда. Где шаг был указан при объявлении вида переменной Бегу (см. 5.5).
Охрана вида обозначается как переменная п(Вп) и требует, чтобы размещённым видом переменной п был вид Вп или его расширение. В противном случае работа приложения прекращается. В пределах такого обозначения переменная п воспринимается как имеющая объявленный вид Вп. Охрана вида применима, если
а) п – приёмник ссылок вида НАБОР, или п – переменная вида ДОСТУП, и если
б) Вп – расширение объявленного вида п.
Если обозначенное понятие – ПОСТоянная или ПЕРеменная, то обозначение ссылается на их текущее значение. Если же понятие является задачей (имеет вид ЗАДАЧА) и обозначение сопровождается (возможно, пустым) списком источников, то в этом случае подразумевается вызов задачи и подстановка значения ответа, полученного при её исполнении. Источники должны соответствовать приёмникам, как и при вызовах собственно задач (см. 9.1).
Примеры обозначений (см. примеры из 6):
Обозначение | Вид данных |
ц |
ЦЕЛ |
р[ц] |
ВЕЩ |
город[3].название[ц] |
ЗНАК |
яйцо.твёрдость |
ЦЕЛ |
яйцо(ДкЗолотоеЯйцо).богатство |
ВЕЩ |
Язык придерживается принятых в математике соглашений о порядке выполнения действий в выражениях. Существует четыре разряда действий с различными преимуществами порядка выполнения. У отрицания НЕ самое высокое преимущество, далее следуют действия типа умножения, действия типа сложения и отношения. Действия с одинаковым преимуществом выполняются слева направо. Например, 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 |
10 |
3 |
3 |
1 |
-10 |
3 |
-4 |
2 |
11 |
3 |
3 |
2 |
-11 |
3 |
-4 |
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} |
КЛЮЧ |
город[ц].название<="Москва" |
КЛЮЧ |
яйцо ЯВЛЯЕТСЯ ДкЗолотоеЯйцо |
КЛЮЧ |
|
Указание |
= | [Присваивание | ВызовЗадачи | ЕслиТо | ВыбратьИз | Пока | ПовторятьДо | ОтДо | Кольцо | Для | ВЫХОД | ВОЗВРАТ [Выражение]] |
Последовательность указаний, разделённых точкой с запятой, означает поочерёдное выполнение составляющих её указаний.
Указания |
= | Указание {";" Указание} |
Присваивание заменяет текущее значение переменной новым значением, которое определяется результатом выражения. Выражение должно быть совместимо по присваиванию с переменной (см. 14). Символом присваивания является ":=".
Присваивание |
= | Обозначение ":=" Выражение |
Если выражение в вида Вв присваивается переменной п вида Вп (т.е. п:=в;), то имеет место следующее:
а) если Вп и Вв – вида НАБОР, то в присваивании участвуют только те свойства набора Вв, которые также имеются в наборе Вп; размещённый вид п и объявленный вид п должны быть одинаковыми, после присваивания они не изменяются;
б) если Вп и Вв – вида ДОСТУП, то размещённым видом п становится размещённый вид в;
в) если Вп – это РЯД N ИЗ ЗНАК, а в – цепочка длины M<N, то i-му элементу п[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]
Вызов задачи определяет выполнение последовательности УКАЗаний, объявленных в этой задаче. В нём (вызове) может быть список источников данных (фактических параметров). Каждому источнику всегда соответствует приёмник (формальный параметр), определённый в объявлении задачи (см. 9). Соответствие устанавливается в порядке следования в списках источников и приёмников.
Если источник обозначает часть составной переменной, то эта часть выделяется перед выполнением задачи. Если приёмник является приёмником ссылок, то соответствующий источник может быть только обозначением переменной (вида ДОСТУП К). Примечание: если приёмник ссылок объявлен с меткой общедоступности "-" (см. 9.1), то источник также может быть и цепочкой знаков, т.е. вида ЦЕПЬ.
Если приёмник является приёмником значений, то соответствующий источник может быть выражением. Это выражение вычисляется перед выполнением задачи, а полученное значение присваивается приёмнику (см. также 9.1).
ВызовЗадачи |
= | Обозначение [Источники] |
Примеры:
ПисатьЦел(ц*2+1); (* см. 9.1 *) УВЕЛИЧИТЬ(город[j].жителей) (* см. 9.2 *)
ЕслиТо |
= | ЕСЛИ Выражение ТО Указания {АЕСЛИ Выражение ТО Указания} [ИНАЧЕ Указания] КОН |
Указание ЕСЛИ…ТО задаёт условное выполнение входящих в него последовательностей указаний. Логические выражения, предшествующие последовательности указаний, будем называть условиями. Условия проверяются последовательно одно за другим, пока очередное не окажется равным ВКЛ, после чего выполняется связанная с этим условием последовательность указаний. Если ни одно условие не удовлетворено и имеется служебное слово ИНАЧЕ, то выполняется последовательность указаний, записанная после этого слова.
Пример:
ЕСЛИ (знак>="A") И (знак<="Z") ТО Название() АЕСЛИ (знак>="0") И (знак<="9") ТО Число() АЕСЛИ (знак="'") ИЛИ (знак='"') ТО Цепочка() ИНАЧЕ Ошибка() КОН;
Указание ВЫБРАТЬ…ИЗ определяет выбор и выполнение последовательности указаний по значению выражения. Прежде всего вычисляется значение выбирающего выражения, а затем выполняется та последовательность указаний, чей список меток варианта содержит полученное значение. Выбирающее выражение должно быть такого целого вида, который поглощает виды всех меток вариантов, или же – и выбирающее выражение, и метки вариантов должны иметь вид ЗНАК. Метки варианта состоят из постоянных выражений, и ни одно из их значений не должно употребляться больше одного раза. Если значение выражения не совпадает с меткой ни одного из вариантов, выбирается последовательность указаний после слова ИНАЧЕ, если оно есть, иначе выполнение приложения прерывается.
ВыбратьИз |
= | ВЫБРАТЬ Выражение ИЗ ["|"] Вариант (* первое "|" не обязательно *) {"|" Вариант} (* повтор от 0 раз *) [ИНАЧЕ Указания] КОН |
Вариант |
= | [СписокМеток ":" Указания] |
СписокМеток |
= | Метки {"," Метки} |
Метки |
= | ПостоянноеВыражение [".." ПостоянноеВыражение] |
Пример:
ВЫБРАТЬ год-годРождения ИЗ | 0..7*1-1: возраст:=дитя | 7*1..7*2-1: возраст:=отрок | 7*2..7*3-1: возраст:=юноша | 7*3..7*8-1: возраст:=муж | 60,70,80: возраст:=юбиляр ИНАЧЕ возраст:=старец КОН;
Указание ПОКА задаёт повторное выполнение последовательности указаний, пока условие, заданное логическим выражением, остаётся равным ВКЛ. Условие проверяется перед каждым выполнением последовательности указаний.
Пока |
= | ПОКА Выражение ВЫП Указания КОН |
Указание ПОВТОРЯТЬ…ДО определяет повторное выполнение последовательности указаний, пока условие, заданное логическим выражением, не удовлетворено. Последовательность указаний выполняется, по крайней мере, один раз.
ПовторятьДо |
= | ПОВТОРЯТЬ Указания ДО Выражение |
Указание КОЛЬЦО определяет повторное выполнение последовательности указаний. Оно завершается после выполнения указания ВЫХОД внутри этой последовательности (см. 8.9).
Кольцо |
= | КОЛЬЦО Указания | ВЫХОД (* из цикла КОЛЬЦО *) КОН |
Указания КОЛЬЦО нужны для того, чтобы выразить (и использовать) повторения с несколькими точками выхода, или в случаях, когда условие выхода находится в середине повторяемой последовательности указаний.
Указание ОТ…ДО…ВЫП определяет повторное выполнение последовательности указаний для увеличивающихся (уменьшающихся) значений переменной целого вида, называемой управляющей переменной.
ОтДо |
= | ОТ ПолноеНазвание ":=" Выражение ДО Выражение [ПО ПостоянноеВыражение] ВЫП Указания КОН |
Указание
ОТ ц:=НачальноеВыражение ДО КонечноеВыражение ПО шаг ВЫП Указания КОН;
равнозначно
конец :=КонечноеВыражение; начало:=НачальноеВыражение; ЕСЛИ шаг > 0 ТО ПОКА ц <= конец ВЫП Указания; УВЕЛИЧИТЬ(ц,шаг) КОН АЕСЛИ шаг < 0 ТО ПОКА ц >= конец ВЫП Указания; УВЕЛИЧИТЬ(ц,шаг) КОН КОН;
Здесь пременные конец и ц одинакового вида, а шаг должен быть отличным от нуля постоянным выражением. Если шаг не указан, то он предполагается равным 1.
Пример:
ОТ i:=0 ДО 99 ВЫП x:=x+р[i] КОН;
Указание ВОЗВРАТ определяет точку завершения выполнения задачи. Оно обозначается служебным словом ВОЗВРАТ.
Задачи, возвращающие ответ, завершаются указанием ВОЗВРАТ, задающим значение ответа. Ответ обозначается выражением, которое следует за словом ВОЗВРАТ. Вид выражения должен быть совместим по присваиванию (см. 14) с видом ответа, определённым в заголовке задачи (см. 9).
В собственно задачах (т.е. не возвращающих ответ) указание ВОЗВРАТ подразумевается в конце тела задачи. Любое явное указание ВОЗВРАТ служит дополнительной точкой завершения выполнения задачи.
Указание ВЫХОД определяет точку завершения охватывающего указания КОЛЬЦО. Оно обозначается служебным словом ВЫХОД.
Пример с указаниями ПОКА, ПОВТОРЯТЬ, КОЛЬЦО, ВЫХОД:
живёт(дед); живёт(баба); КОЛЬЦО снесла(курочка,яйцо); ЕСЛИ НЕ (яйцо ЯВЛЯЕТСЯ ДкЗолотоеЯйцо) ТО ВЫХОД КОН; ПОКА НЕ устаёт(дед) ВЫП бьёт(дед,яйцо) КОН; ПОКА НЕ устаёт(баба)ВЫП бьёт(баба,яйцо) КОН; ПОВТОРЯТЬ бегает(мышь) ДО задела(мышь,яйцо) И разбито(яйцо); плачет(дед); плачет(баба); кудахчет(курочка) КОН;
Указание ДЛЯ определяет выполнение последовательности указаний при помощи проверки вида у заданной переменной и применяет охрану вида к каждому вхождению этой переменной внутри выполняемой последовательности указаний.
Для |
= | ДЛЯ ПолноеНазвание ВИДА ["|"] ОхранаУказаний (* первое "|" не обязательно *) {"|" ОхранаУказаний } (* повтор от 0 раз *) [ИНАЧЕ Указания] КОН; |
ОхранаУказаний |
= | [охраняемыйВид ":" Указания] |
Если п – приёмник ссылок вида НАБОР (в описании задачи) или п – переменная вида ДОСТУП, и её объявленный опорный вид – Вп0, то указание
ДЛЯ п ВИДА | Вп1: ПослУказ1 | Вп2: ПослУказ2 ИНАЧЕ ПослУказ3 КОН;
имеет следующий смысл: если размещённый вид переменной п есть Вп1, то выполняется последовательность указаний ПослУказ1, в которой п воспринимается как имеющая объявленный вид Вп1, иначе если размещённый вид переменной п есть Вп2, то выполняется ПослУказ2, в которой п воспринимается как имеющая объявленный вид Вп2, ИНАЧЕ выполняется ПослУказ3. Здесь виды Вп1 и Вп2 должны быть расширениями опорного вида Вп0. Если ни одна проверка вида не удовлетворена, а ИНАЧЕ отсутствует, то выполнение приложения прерывается.
Пример (см. примеры объявления вида ДкЗолотоеЯйцо в 5.4.):
ВИД . . . ДкЗолотоеЯйцо = ДОСТУП К ОписаниеЗолотогоЯйца; ОписаниеЗолотогоЯйца = НАБОР(ОписаниеЯйца) богатство:ВЕЩ КОН; . . . ДЛЯ яйцо ВИДА | ДкЗолотоеЯйцо: (* доступ к виду набор - ОписаниеЗолотогоЯйца *) . . . УМЕНЬШИТЬ(яйцо.богатство); . . . ИНАЧЕ . . . КОН;
NB! В рус.ЯП Глагол имеется отношение проверка вида , например такое: яйцо ЯВЛЯЕТСЯ ДкЗолотоеЯйцо, которое в указании ЕСЛИ…ТО…ИНАЧЕ…КОН полностью заменяет указание ДЛЯ…ВИДА…ИНАЧЕ…КОН.
Пример (см. пример отношения ЯВЛЯЕТСЯ (проверка вида) в 7.2.):
ЕСЛИ яйцо ЯВЛЯЕТСЯ ДкЗолотоеЯйцо (* доступ к виду набор - ОписаниеЗолотогоЯйца *) ТО . . . УМЕНЬШИТЬ(яйцо.богатство); . . . ИНАЧЕ . . . КОН;
|
ОбъявлениеПеременных |
= | название ["-" | "+"] {"," название ["-" | "+"]} ":" Вид |
ЗаготовкаЗадачи |
= | ЗАДАЧА ["*"] "^" название ["-"] [ "(" [ОбъявленияПриёмников] ")" [":" ВидОтвета] ] |
ОбъявлениеЗадачи |
= | ЗаголовокЗадачи ";" ТелоЗадачи название | ЗаголовокЗадачи ";" ВЫЗОВ цепочка ИЗ цепочка |
ЗаголовокЗадачи |
= | ЗАДАЧА ["*"] название ["-"] [ "(" [ОбъявленияПриёмников] ")" [":" ВидОтвета] ] |
ТелоЗадачи |
= | Объявления [УКАЗ Указания | ВОЗВРАТ [Выражение] (* из ЗАДАЧИ *) ] (* [не обязательно] *) КОН |
ОбъявленияПриёмников |
= | ОбъявлениеПеременных {";" ОбъявлениеПеременных} |
Заготовка задачи [т.е. это опережающее определение (см. отличия от Паскаля)] служит для того, чтобы разрешить вызов задачи до её объявления. Написание заготовки задачи отличается от написания заголовка задачи только разделителем "^" после слова ЗАДАЧА.
Пример заготовки задачи:
ЗАДАЧА^ ПисатьЦепь-(цепочкаЗнаков:ЦЕПЬ);
Символ "*" в описании заготовки ЗАДАЧА ["*"] поясняется в п. 13.3.
Приёмники – это переменные (формальные параметры), которым при вызове данной задачи должны соответствовать передаваемые источники (фактические параметры). Имеются два рода приёмников: приёмники значений и приёмники ссылок, отличающиеся при объявлении соответственно отсутствием или наличием метки общедоступности (см. 3). Приёмники значений – это внутренние переменные задачи, которым в качестве начального присваивается значение соответствующего источника. Приёмниками значений также являются и приёмники простых видов, объявленные с меткой общедоступности "-". Приёмники значений не могут быть составного вида. Приёмникам ссылок должны соответствовать источники, которые являются переменными, и означают эти переменные. Приёмнику ссылок с меткой "-" также может соответствовать и цепочка знаков. Область действия приёмника простирается от его объявления до конца задачи, в которой он объявлен. В этой области невозможно изменять значения у тех приёмников, которые объявлены с меткой "-". Задача, возвращающая ответ без приёмников, должна иметь пустой список приёмников. Она должна вызываться обозначением задачи, чей список источников также является пустым (т.е. п:=имя();).
ОбъявленияПриёмников |
= | ОбъявлениеПеременных {";" ОбъявлениеПеременных} |
Пусть Впр – вид приёмника пр (кроме открытого ряда) и Вис – вид соответствующего источника ис. Виды Вис и Впр для приёмников ссылок должны быть одинаковыми видами, или вид Впр должен быть видом НАБОР, а вид Вис – расширением вида Впр. Всегда ис должен быть совместим при вызове задачи с пр (см. 14).
Если вид источника Вис – открытый ряд, то размер пр становится равным размеру ис.
Примеры объявлений задач:
ЗАДАЧА^ ПисатьЦепь-(цепочкаЗнаков:ЦЕПЬ); (* опережающее определение задачи ПисатьЦепь() *) ЗАДАЧА ПисатьЦел-(ц:ЦЕЛ); (* 0<=ц<100000 *) ПЕР ц:ЦЕЛ; цифры:РЯД 6 ИЗ ЗНАК; УКАЗ ц:=0; ПОВТОРЯТЬ цифры[ц]:=ВЗНАК(ц ОСТАТОК 10 + ВЦЕЛ("0")); ц:=ц ДЕЛИТЬ 10; УВЕЛИЧИТЬ(ц) ДО ц = 0; цифры[ц]:=0X; ПисатьЦепь(цифры) КОН ПисЦел; ЗАДАЧА^ ПисатьЗнак-(знак:ЗНАК); (* опережающее определение задачи ПисатьЗнак() *) ЗАДАЧА ПисатьЦепь-(р:ЦЕПЬ); ПЕР ц:ЦЕЛ; УКАЗ ц:=0; ПОКА (ц < РАЗМЕР(р)) И (р[ц] # 0X) ВЫП ПисатьЗнак(р[ц]); УВЕЛИЧИТЬ(ц) КОН КОН ПисатьЦепь; ЗАДАЧА^ ЧитатьЗнак-(знак:ЗНАК); (* опережающее определение задачи ЧитатьЗнак() *) ЗАДАЧА ЧитатьЦел-(ц+:ЦЕЛ); ПЕР знак:ЗНАК; УКАЗ ц:=0; ЧитатьЗнак(знак); ПОКА ("0" <= знак) И (знак <= "9" ) ВЫП ц:=10*ц + (ВЦЕЛ(знак) - ВЦЕЛ("0")); ЧитатьЗнак(знак) КОН КОН ЧитатьЦел; ЗАДАЧА log2(x:ЦЕЛ):ЦЕЛ; (* x > 0 *) ПЕР цЛогарифмПоОснованию2:ЦЕЛ; УКАЗ цЛогарифмПоОснованию2:=0; ПОКА x > 1 ВЫП x:=x ДЕЛИТЬ 2; УВЕЛИЧИТЬ(цЛогарифмПоОснованию2) КОН; ВОЗВРАТ цЛогарифмПоОснованию2 КОН log2;
Следующая таблица содержит список встроенных задач. Некоторые задачи – обобщённые, т.е. они применимы к данным нескольких видов. Обозначения названий: п – переменная, в – выражение, Вд – вид данных. (см. также 1. Условные обозначения, 7.1. Данные).
Задачи, возвращающие ответ:
Вызов задачи | Виды источников | Вид ответа | Значение ответа |
ВЗНАК(ц) |
целый | ЗНАК |
знак с порядковым номером ц |
ВЦЕЛ(знак) |
ЗНАК |
ЦЕЛ |
порядковый номер (уникод) знака знак |
ВШИРЦЕЛ(вещ) | вещественный | ШИРЦЕЛ |
ближайшее к вещ целое двойной точности (64 разряда) |
ДЛИНА(цепь) | цепочка знаков |
ЦЕЛ |
длина цепочки знаков цепь |
ДЛИНА(цепь) | ЦЕПЬ[Размер] | ЦЕЛ |
позиция первого 0X знака в цепочке цепь или РАЗМЕР(цепь), |
ЗАДАНО(Цепь) | цепочка знаков |
КЛЮЧ |
возвращает ВКЛ, если при старте ПГ.exe среди параметров |
МАКС(Вп) |
числовой | Вп |
наибольшее значение вида Вп |
МАКС(МНОЖ) |
МНОЖ |
ЦЕЛ |
наибольший элемент множества = 31 |
МИН(Вп) |
числовой | Вп |
наименьшее значение вида Вп |
МИН(МНОЖ) |
МНОЖ |
ЦЕЛ |
наименьший элемент множества = 0 |
МОДУЛЬ(в) |
числовой | как и у в |
модуль (абсолютная величина) выражения в |
РАЗМЕР(р) | РЯД |
ЦЕЛ |
равносильно РАЗМЕР(р,0) |
РАЗМЕР(р,ц) | р:РЯД;ц:целый | ЦЕЛ |
размер ряда р в измерении ц (первым считается 0-е измерение) |
УЗК(шц) |
ШИРЦЕЛ |
ЦЕЛ |
тождество (сузить или укоротить в два раза: 64 => 32) |
УЗК(ц) |
ЦЕЛ |
УЗКЦЕЛ |
тождество (сузить или укоротить в два раза: 32 => 16) |
УЗК(уц) |
УЗКЦЕЛ |
ЯЧЦЕЛ |
тождество (сузить или укоротить в два раза: 16 => 8) |
УЗК(шв) |
ШИРВЕЩ |
ВЕЩ |
тождество (сузить или усечь в два раза: 64 => 32) |
ЦЕЛЧАСТЬ(вещ) | вещественный | вещественный | целая часть вещ |
ЧЕТ(ц) |
целый | КЛЮЧ |
возвращает ВКЛ, если (ц ОСТАТОК 2 = 0) – проверка равенства |
Собственно задачи:
Вызов задачи | Виды источников | Выполняемое действие |
ОБНУЛИТЬ(п) |
п:составной вид (НАБОР или РЯД) |
заполнение нулями всех переменных, |
ПОСТАВИТЬ(Бегу,р,цНач) |
Бегу:БЕГУНОК ПО Вп; р:РЯД ИЗ Вп; цНач:целый |
начальная выставка бегунка Бегу |
ПРОВЕРИТЬ(к) |
КЛЮЧ |
прерывает выполнение приложения, |
СМЕСТИТЬ(Бегу,цШаг) |
Бегу:БЕГУНОК ПО Вп; цШаг:целая ПОСТоянная |
смещение бегунка Бегу |
СОЗДАТЬ(пД) |
ДОСТУП К НАБОР или ДОСТУП К РЯД |
размещает в памяти переменную пД^ |
СОЗДАТЬ(рД,в0, … ,вN) |
рД:ДОСТУП К открытому ряду; в0, … ,вN:целый |
размещает в памяти открытый ряд рД^ |
СОЗДАТЬ(цепьД,в) |
цепьД:ДОСТУП К ЦЕПЬ; в:ЦЕПЬ; (открытый ряд) или в:ЦЕПЬ[Размер_в]; |
размещает в памяти цепьД^ |
СПИСАТЬ(в,цепь) |
в:ЦЕПЬ; (открытый ряд) или в:ЦЕПЬ[Размер_в]; цепь:ЦЕПЬ; (открытый ряд) или цепь:ЦЕПЬ[Размер_цепь]; |
цепь:=в; Размер_цепь <= Размер_в |
СТОП(ц) |
ц:целый |
прерывает выполнение приложения и |
УВЕЛИЧИТЬ(ц) |
ц:целый |
ц:=ц+1; |
УВЕЛИЧИТЬ(ц,в) |
ц,в:целый |
ц:=ц+в; |
УМЕНЬШИТЬ(ц) |
ц:целый |
ц:=ц-1; |
УМЕНЬШИТЬ(ц,в) |
ц,в:целый |
ц:=ц-в; |
Задача СПИСАТЬ(в,цепь) выполняет присваивание значения выражения в, являющегося цепочкой знаков (или рядом из знаков) и содержащего ограничитель 0X, другой переменной-источнику цепь (копирует значение в в цепь). При необходимости присвоенное значение усекается до размера РАЗМЕР(цепь)-1. Переменная-источник цепь вида ЦЕПЬ всегда будет содержать 0X как ограничитель.
|
Отдел |
= | ОТДЕЛ название ["-" | "+"] ";" [ИСПОЛЬЗУЕТ название [ИЗ цепочка] {"," название [ИЗ цепочка]} ";"] Объявления [УКАЗ Указания] КОН название "." |
В отделе-владельце необходимо ставить метки общедоступности (оконечные -/+) в объявлениях названий тех понятий (см. 3), которые должны быть видимы в отделах-пользователях. Названия отделов-владельцев, понятия которых используются в отделе-пользователе, необходимо перечислить после служебного слова ИСПОЛЬЗУЕТ в начале отдела-пользователя, указывая при необходимости после служебного слова ИЗ путь к текстовому файлу отдела-владельца. Закольцовывание (отделов-владельцев и отдела-пользователя) при перечислении после служебного слова ИСПОЛЬЗУЕТ недопустимо. Путь к служебным отделам ОБХОД (см. 11) и СРЕДА (см. 12) указывать не нужно.
Отделы с названиями, отмеченными оконечным "-" (см. Заграница.отд или Асм.отд), не должны содержать указаний. Эти отделы служат для объявления понятий отделов-двойников, у которых машинное представление получено через другие языки программирования.
Запущенным считается отдел, у которого уже запущены все используемые в нём отделы и выполнена последовательность указаний после слова УКАЗ.
Запуск приложения осуществляется запуском головного отдела, т.е. отдела, у которого название отмечено оконечной меткой общедоступности "+".
|
Вызов задачи | Виды источников | Вид ответа | Выполняемое действие |
ПолучитьАдрес(п) |
любой |
Адрес |
возвращает адрес п |
Значение(Вд,в) |
размеры данных Вд и в должны совпадать (см. 13.2) |
Вд |
в воспринимается как значение вида Вд, т.е. это преобразование переменной в к виду Вд |
Узк(в) |
числовой |
меньший вид | тождество |
Собственно задачи:
Вызов задачи | Виды источников | Выполняемое действие |
ИзПамяти(ав,п) |
ав - Адрес; п - любого основного вида, вид ДОСТУП, вид ЗАДАЧА |
п:=Память[ав] |
ВПамять(ав,п) |
ав - Адрес; п - любого основного вида, вид ДОСТУП, вид ЗАДАЧА |
Память[ав]:=п |
Образ(ав0,ав1,ц) |
ав0,ав1:Адрес; ц:целый |
Память[ав1..ав1+ц-1]:= Память[ав0..ав0+ц-1] |
|
п
|
п^
|
ДкЗолотоеЯйцо^ УРВ
|
Тоже самое, для (размещённой в памяти) переменной п вида ДкЯйцо рисунок ниже показывает устройство (размещение) данных во время работы приложения.
п
|
п^
|
ДкЯйцо^ УРВ
|
Проверка вида: п ЯВЛЯЕТСЯ ДкВп (т.е. имеет ли размещённая переменная п вид ДОСТУП К Вп или же к его расширению) преобразуется в выражение сравнения:
Уровень Расширения Вида (УРВ, по анг. ExtensionLevelType), Описатель Вида Вп переменной п (ОписВ) и ряд доступов ко всем Описателям Опорных Видов (ОписОпорВ) известны во время преобразования (см. выше на рисунках в двух таблицах столбцы с .ОписОпорВ — это скрытые от программиста ряды из доступов к наборам и их раширениям, т.е. столбцы с Дк* … ПУСТО). Например, для вида ДкЯйцо УРВ у ОписОпорВ равен 0 (этот вид не имеет опорных), а для вида ДкЗолотоеЯйцо УРВ (Уровень Расширения Вида) у ОписОпорВ равен 1, т.е.
NB! Из выше приведенных таблиц можно сделать такие выводы. В языках Оберон-семейства (а особенно в Java) представление комплексных чисел в виде набора из двух свойств (мнимое и реальное) для задач вычислительной математики может быть менее эффективным, чем их представелние в виде числового вектора (т.е. рядом из двух чисел, в котором нет дополнительного ОписВ, по анг. tag). Например, доступ к элементам вектора комплексных чисел, представленых набором, может быть медленнее, чем при организации такого же вектора в виде ряда из рядов из двух чисел (т.е. матрицы 2хN) или же из 2-х отдельных векторов для мнимой и реальной составляющих комплексного числа. Однако, эксперименты это предположение не подтверждают, т.е. наборы в Глаголе не замедляют численные алгоритмы! И ещё, при обращении к вектору (ряду) в ЯП Оберон-семейства делается проверка выхода индекса за пределы ряда (0<=k<=N-1), что повышает надёжность и правильность работы приложений, хотя и немного их замедляет (на 3%-5%). Но Глагол (и другие ЯП Оберон-семейства, и даже "Си") не могут оптимизировать использование регистров с плавающей точкой у математического сопроцессора (iFPU387) и поэтому скорость таких алгоритмов (например, БПФ2), написанных на Глаголе, будет заметно отставать от тех, что написаны на Ассемблере (в 2 раза).
|
Вид |
Разрядов |
Вид | Разрядов |
КЛЮЧ |
8 |
ОБХОД.Ячейка | 8 |
ЗНАК |
16 |
ОБХОД.Адрес | 32 |
ЯЧЦЕЛ |
8 |
ОБХОД.Цел8 | 8 |
УЗКЦЕЛ |
16 |
ОБХОД.Цел16 | 16 |
ЦЕЛ |
32 |
ОБХОД.Цел32 | 32 |
ШИРЦЕЛ |
64 |
ОБХОД.Цел64 | 64 |
ВЕЩ |
32 |
ОБХОД.Вещ32 | 32 |
ШИРВЕЩ |
64 |
ОБХОД.Вещ64 | 64 |
МНОЖ |
32 |
ОБХОД.Доступ | 32 |
ПГ можно настроить для создания кода, содержащего данные для внешнего отладчика, на самопроверку работы приложения, на отработку встроенной задачи ПРОВЕРИТЬ (см. 9.2), установку в ПУСТО переменных доступа при каждом вызове задач, в которых определены эти переменные. Также можно настроить ключи для взаимодействия со встроенной задачей ЗАДАНО (см. 9.2).
Самопроверка во время исполнения следит за тем, чтобы не было выхода за границы ряда, переполнения при арифметических действиях, выхода за границы допустимых значений простых видов, доступа по значению ПУСТО, деления на ноль. В уже отлаженных программах самопроверка работы приложений может быть отключена при перекомпиляции (хотя это не рекомендуется):
ПГ -п- %tekput%\%1 %2 %3 %4
По умолчанию, для ускорения доступа к свойствам (полям) набора производится выравнивание их положения по границе слова [4 ячейки=32 бита] или двойного слова [8 ячеек=64 бита]. Такое выравнивание данных не будет производиться, если при определении вида (см. 5.3) перед словом НАБОР добавить слово СЖАТЫЙ.
ВидНабор |
= | [СЖАТЫЙ] НАБОР ["(" ПолноеНазвание (* переменной *) ")"] [ОбъявлениеПеременных] КОН (* [не обязательно] *) |
В данном примере
ВИД Набор = СЖАТЫЙ НАБОР зн1:ЗНАК; (* 1 вместо 2-х ячеек *) уц:УЗКЦЕЛ;(* 2 также 2 ячейки *) зн2:ЗНАК; (* 1 вместо 4-х ячеек, т.к. следующее поле выравнивается по 4-м ячейкам *) ц :ЦЕЛ; (* 4 также 4 ячейки *) КОН; (* всего: 8 вместо 12 ячеек *) ПЕР набор:Набор;
переменная набор будет занимать не 12, а 8 ячеек. Использование сжатых наборов понижает скорость доступа к свойствам (полям) набора, но позволяет достичь совместимости с внешними источниками данных.
Для того чтобы задачи, написанные на Глаголе, правильно принимали источники из иноязычных приложений, необходимо при объявлении задачи (см. 9) или объявлении вида ЗАДАЧА (см. 5.6) после слова ЗАДАЧА поставить знак "*".
ЗаголовокЗадачи |
= | ЗАДАЧА ["*"] название ["-"] [Приёмники [":" ВидОтвета]] |
ВидЗадача |
= | ЗАДАЧА ["*"] [Приёмники [":" ВидОтвета]] |
Пример:
ПЕР Proc:ЗАДАЧА*( … ); ЗАДАЧА* WinProc( … ); . . . Proc:=WinProc;
Задачи, объявленные таким образом, недопустимо вызывать из приложений, написанных на Глаголе (см. в КОС.отд ЗАДАЧА* Часы(uID,uMsg,dwUser,dw1,dw2:ЦЕЛ);). Иноязычное приложение сможет само связаться с такой задачей во время загрузки, если она объявлена в головном отделе, имеющем метку "+" (см. 10), и сопровождается меткой общедоступности "-" (см. 3).
Пример:
ОТДЕЛ ДПБ+; ЗАДАЧА* DllEntryPoint-( … ):ЦЕЛ; . . .
Для вызова внешних иноязычных задач применяются особым образом объявленные задачи. В таких объявлениях за обычным заголовком задачи после слова ВЫЗОВ записываются цепочка знаков с названием требуемой иноязычной задачи, слово ИЗ и цепочка знаков с названием места хранения этой задачи (см. в ГОС.отд пояснение Задачи ОС).
ОбъявлениеЗадачи |
= | ЗаголовокЗадачи ";" ВЫЗОВ цепочка ИЗ цепочка |
Пример:
ЗАДАЧА CreateFile( … ):ЦЕЛ; ВЫЗОВ "CreateFileW" ИЗ "Kernel32.dll";
|
Целые виды |
ЯЧЦЕЛ, УЗКЦЕЛ, ЦЕЛ, ШИРЦЕЛ |
Вещественные виды |
ВЕЩ, ШИРВЕЩ |
Числовые виды |
целые виды, вещественные виды |
Две переменные п1 и п2 вида Вп1 и Вп2 соответственно имеют одинаковый вид, если
а) Вп1 и Вп2 оба обозначены одним и тем же названием, или
б) Вп2 объявлен как Вп2=Вп1, или
в) п1 и п2 появляются в одном и том же списке названий переменных, свойств набора или в объявлении приёмников задач и не являются открытыми рядами.
Виды Вп1 и Вп2 называются равными видами, если
а) виды Вп1 и Вп2 – одинаковые виды, или
б) виды Вп1 и Вп2 – открытые ряды с равными Опорными Видами, или
в) виды Вп1 и Вп2 – виды задач, чьи заголовки совпадают.
Числовые виды поглощают более узкие числовые виды согласно следующему порядку:
ШИРВЕЩ >= ВЕЩ >= ШИРЦЕЛ >= ЦЕЛ >= УЗКЦЕЛ >= ЯЧЦЕЛ.
В объявлении вида Р=НАБОР(О) … КОН, вид Р – непосредственное расширение вида О, а О – непосредственный Опорный Вид вида Р.
Вид Р является расширением вида О (О является Опорным Видом Р), если
а) О и Р – одинаковые виды, или
б) Р – непосредственное расширение вида, являющегося расширением вида О.
Если вид ДкО=ДОСТУП К О и вид ДкР=ДОСТУП К Р, то вид ДкР является расширением вида ДкО (вид ДкО является Опорным Видом для ДкР), если вид Р является расширением вида О, т.е. из Р(О) следует ДкР(ДкО).
Опорный вид ОВп ряда п подобен опорному виду ОВр ряда р, если
а) Опорные Виды ОВп и ОВр – одинаковые виды, или
б) Опорные Виды ОВп и ОВр – оба вида ДОСТУП и ОВп – расширение вида ОВр, т.е. ОВп(ОВр), или
в) Опорный Вид ОВр – открытый ряд, Опорный Вид ОВп – произвольный ряд и Опорный Вид ОВп ряда п подобен Опорному Виду ОВр ряда р.
Выражение в вида Вв совместимо по присваиванию с переменной п вида Вп, если выполнено одно из следующих условий:
а) виды Вв и Вп – одинаковые виды;
б) виды Вв и Вп – числовые виды и Вп поглощает Вв;
в) виды Вв и Вп – оба виды НАБОР, Вв – расширение вида Вп, т.е. Вв(Вп), а переменная п имеет размещённый вид Вп;
г) виды Вв и Вп – оба виды ДОСТУП и Вв – расширение вида Вп, т.е. Вв(Вп);
д) виды Вв и Вп – оба виды БЕГУНОК и Опорные Виды у Вв и Вп одинаковые;
е) вид Вп – вид ДОСТУП, БЕГУНОК, ЗАДАЧА, а выражение в – ПУСТО;
ж) вид Вп – РЯД N ИЗ ЗНАК, выражение в – цепочка из M знаков и M<N;
з) вид Вп – вид ЗАДАЧА, а переменная п – название задачи, у которой заголовок совпадает с заголовком Вп;
и) вид Вп – доступ к открытому ряду, вид Вв – доступ к произвольному ряду, а Опорный Вид ряда по доступу Вв подобен Опорному Виду ряда по доступу Вп.
Выражение источника ис вида Вис совместимо при вызове задачи с приёмником пр вида Впр, если выполнено одно из следующих условий:
а) вид Вис совместим по присваиванию с видом Впр;
б) вид Впр – ЦЕПЬ или открытый РЯД ИЗ ЗНАК, источник ис – цепочка знаков (пр не может быть приёмником ссылок для записи, а только на чтение);
в) вид Впр – открытый ряд, вид Вис – произвольный ряд, а Опорный Вид ряда Вис подобен Опорному Виду ряда Впр.
Для действия данные являются совместимыми выражениями, если их виды соответствуют следующей таблице (в которой указан также и вид ответа выражения). Ряды из знаков, которые сравниваются, должны содержать в качестве ограничителя 0X. Вид Вр должен быть расширением вида Во, т.е. Вр(Во):
Действие | Вид первого данного | Вид второго данного | Вид ответа |
+ – * |
числовой | числовой | наименьший числовой вид, |
/ |
числовой | числовой | наименьший вещественный вид, |
ДЕЛИТЬ ОСТАТОК | целый | целый | наименьший целый вид, |
+ – * / |
МНОЖ |
МНОЖ |
МНОЖ |
И ИЛИ НЕ |
КЛЮЧ |
КЛЮЧ |
КЛЮЧ |
= # < <= >= > |
числовой | числовой | КЛЮЧ |
= # < <= >= > |
ЗНАК |
ЗНАК |
КЛЮЧ |
< <= > >= |
БЕГУНОК ПО Во |
БЕГУНОК ПО Во |
КЛЮЧ |
= # < <= >= > |
ЦЕПЬ, |
ЦЕПЬ, |
КЛЮЧ |
= # |
КЛЮЧ |
КЛЮЧ |
КЛЮЧ |
= # |
МНОЖ |
МНОЖ |
КЛЮЧ |
= # |
ЗАДАЧА, ПУСТО |
ЗАДАЧА, ПУСТО |
КЛЮЧ |
= # |
БЕГУНОК ПО Во, ПУСТО |
БЕГУНОК ПО Во, ПУСТО |
КЛЮЧ |
= # |
ДОСТУП К Во, Вр, ПУСТО |
ДОСТУП К Во, Вр, ПУСТО |
КЛЮЧ |
В |
целый | МНОЖ |
КЛЮЧ |
ЯВЛЯЕТСЯ |
Во |
Вр |
КЛЮЧ |
Два заголовка задач совпадают, если
а) они имеют одинаковое количество приёмников, и
б) они имеют или одинаковый вид ответа задачи, или не имеют никакого, и
в) приёмники в соответствующих позициях имеют равные виды, и
г) приёмники в соответствующих позициях оба – или приёмники значений, или приёмники ссылок.
Коротко да ясно, оттого прекрасно.
|
Отдел |
= | ОТДЕЛ название ["-" | "+"] ";"(* + для главного отдела приложения *) [ИСПОЛЬЗУЕТ название [ИЗ цепочка] { "," название [ИЗ цепочка] } ";" (* {повтор от 0 раз} *) ] Объявления [УКАЗ Указания] (* [не обязательно] *) КОН название (* отдела *) "." |
Объявления |
= |
{ПОСТ {ОбъявлениеПостоянной ";"} (* {повтор от 0 раз} *) |ВИД {ОбъявлениеВида ";"} (* {повтор от 0 раз} *) |ПЕР {ОбъявлениеПеременных ";"} (* {повтор от 0 раз} *) } { ЗаготовкаЗадачи ";" | ОбъявлениеЗадачи ";" } |
ОбъявлениеПостоянной |
= | название ["-"] "=" ПостоянноеВыражение |
ОбъявлениеВида |
= | название ["-"] "=" Вид |
ОбъявлениеПеременных |
= | название ["-" | "+"] {"," название ["-" | "+"]} ":" Вид |
ЗаготовкаЗадачи |
= | ЗАДАЧА ["*"] "^" название ["-"] [ "(" [ОбъявленияПриёмников] ")" [":" ВидОтвета] ] |
ОбъявлениеЗадачи |
= | ЗаголовокЗадачи ";" ТелоЗадачи название | ЗаголовокЗадачи ";" ВЫЗОВ цепочка ИЗ цепочка |
ЗаголовокЗадачи |
= | ЗАДАЧА ["*"] название ["-"] [ "(" [ОбъявленияПриёмников] ")" [":" ВидОтвета] ] |
ТелоЗадачи |
= | Объявления [УКАЗ Указания | ВОЗВРАТ [Выражение] (* из ЗАДАЧИ *) ] (* [не обязательно] *) КОН |
ОбъявленияПриёмников |
= | ОбъявлениеПеременных {";" ОбъявлениеПеременных} |
Вид |
= | ПолноеНазвание (* Вида ПЕРеменной *) | простойВид (* ЗНАК, МНОЖ, КЛЮЧ, ВЕЩ и ЦЕЛ *) | составнойВид (* РЯД, ЦЕПЬ и НАБОР *) | дополнительныйВид (* ДОСТУП, БЕГУНОК и ЗАДАЧА *) |
простойВид |
= | ПолноеНазвание (* простого Вида ПЕРеменной *) | ЗНАК | МНОЖ | КЛЮЧ | ВЕЩ | ШИРВЕЩ | ЦЕЛ | ШИРЦЕЛ | УЗКЦЕЛ | ЯЧЦЕЛ |
составнойВид |
= | ПолноеНазвание (* составного Вида ПЕРеменной *) | РЯД [ПостоянноеВыражение {"," ПостоянноеВыражение}] ИЗ Вид | [СЖАТЫЙ] НАБОР ["(" ПолноеНазвание ")"] (* [не обязательно] *) [ОбъявлениеПеременных] (* [не обязательно] *) КОН (* ВИДа НАБОР *) |
дополнительныйВид |
= | ПолноеНазвание (* дополнительного Вида ПЕРеменной *) | ДОСТУП К составнойВид (* НАБОР или РЯД или ЦЕПЬ *) | ЗАДАЧА ["*"] [ "(" [ОбъявлениеПеременных] ")" [":" ВидОтвета] ] |
ВидОтвета |
= | ПолноеНазвание (* Вида ответа *) | простойВид | ДОСТУП К составнойВид |
Указания |
= | Указание {";" Указание} |
Указание |
= | [ Обозначение ":=" Выражение | Обозначение ["(" [Выражения] ")"] | ЕСЛИ Выражение ТО Указания {АЕСЛИ Выражение ТО Указания} (* {повтор от 0 раз} *) [ИНАЧЕ Указания] (* [не обязательно] *) КОН (* указания ЕСЛИ … ТО *) | ВЫБРАТЬ Выражение ИЗ ["|"] Вариант (* первое "|" не обязательно *) {"|" Вариант} (* {повтор от 0 раз} *) [ИНАЧЕ Указания] (* [не обязательно] *) КОН (* указания ВЫБРАТЬ … ИЗ *) | ПОКА Выражение ВЫП Указания КОН (* цикла ПОКА *) | ПОВТОРЯТЬ Указания ДО Выражение (* конец цикла ПОВТОРЯТЬ *) | ОТ ПолноеНазвание":="Выражение ДО Выражение [ПО ПостоянноеВыражение] ВЫП Указания КОН (* цикла ОТ … ДО *) | КОЛЬЦО Указания | ВЫХОД (* из цикла КОЛЬЦО *) КОН (* цикла КОЛЬЦО *) | ДЛЯ ПолноеНазвание (* переменной *) ВИДА ["|"] ОхранаУказаний (* первое "|" не обязательно *) {"|" ОхранаУказаний} (* {повтор от 0 раз} *) [ИНАЧЕ Указания] (* [не обязательно] *) КОН (* локальной охраны/привратника ВИДа *) ] |
Вариант |
= | [Метки {"," Метки} ":" Указания] |
Метки |
= | ПостоянноеВыражение [".." ПостоянноеВыражение] |
ОхранаУказаний |
= | [охраняемыйВид ":" Указания] |
охраняемыйВид |
= | ПолноеНазвание (* охраняемого ВИДа *) | приёмник ссылок ВИДа НАБОР | ДОСТУП К составнойВид |
ПостоянноеВыражение |
= | Выражение |
Выражения |
= | Выражение {"," Выражение} |
Выражение |
= | ПростоеВыражение [Отношение ПростоеВыражение] |
ПростоеВыражение |
= | ["+" | "-"] Слагаемое {Сложение Слагаемое} |
Слагаемое |
= | Множитель {Умножение Множитель} |
Множитель |
= | Обозначение ["(" [Выражения] ")"] | число | одинзнак | цепочка | ПУСТО | Множество | "(" Выражение ")" | НЕ Множитель |
Множество |
= | "{" [Элемент {"," Элемент}] "}" |
Элемент |
= | Выражение [".." Выражение] |
Отношение |
= | "=" | "#" | "<" | "<=" | ">" | ">=" | В | ЯВЛЯЕТСЯ |
Сложение |
= | "+" | "-" | ИЛИ |
Умножение |
= | "*" | "/" | ДЕЛИТЬ | ОСТАТОК | И |
Обозначение |
= | ПолноеНазвание {"." название | "[" Выражения "]" | "^" | "(" ПолноеНазвание ")"} |
= | [название "."] название (* ВИДа, ПОСТоянной, ПЕРеменной *) |
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com
|