|
@@ -27,6 +27,10 @@
|
|
|
- [6.5 Тип функции](#65-тип-функции)
|
|
- [6.5 Тип функции](#65-тип-функции)
|
|
|
- [7. Объявление переменных](#7-объявление-переменных)
|
|
- [7. Объявление переменных](#7-объявление-переменных)
|
|
|
- [8. Выражения](#8-выражения)
|
|
- [8. Выражения](#8-выражения)
|
|
|
|
|
+ - [8.1 Операнды](#81-операнды)
|
|
|
|
|
+ - [8.2 Операторы](#82-операторы)
|
|
|
|
|
+ - [8.2.1 Логические операции](#821-логические-операции)
|
|
|
|
|
+ - [8.2.2 Арифметические операции](#822-арифметические-операции)
|
|
|
- [Ссылки](#ссылки)
|
|
- [Ссылки](#ссылки)
|
|
|
|
|
|
|
|
## 0. Введение
|
|
## 0. Введение
|
|
@@ -448,55 +452,84 @@ var t: Дерево;
|
|
|
|
|
|
|
|
## 8. Выражения
|
|
## 8. Выражения
|
|
|
|
|
|
|
|
-Выражения - это конструкции, содержащие правила вычисления, в которых константы и текущие значения переменных объединяются для получения других значений посредством применения операторов и процедур возвращающих результат. Выражения состоят из операндов и операторов. Круглые скобки могут использоваться для выражения определённых правил вычисления операторов и операндов.
|
|
|
|
|
|
|
+`Выражения` - это конструкции, содержащие правила вычисления, в которых константы и текущие значения переменных объединяются для получения других значений посредством применения операторов и процедур возвращающих результат.
|
|
|
|
|
|
|
|
-8.1 Операнды
|
|
|
|
|
-За исключением наборов и литерных констант, то есть чисел и строк, операнды обозначаются именами. Обозначение операнда состоит из имени, относящегося к константе, переменной или процедуре, которая будет обозначена. Такое имя может быть определено как имя модуля (см. Главы 4 и 11), и за ним могут следовать селекторы, если назначенный объект является элементом структуры.
|
|
|
|
|
-Если A обозначает массив, то A[E] обозначает тот элемент массива A, индекс которого является текущим значением выражения E. Тип E должен иметь тип INTEGER. Обозначение вида A[E1, E2, ..., En] обозначает A[E1][E2]...[En]. Если p обозначает переменную-ссылку, p^ обозначает переменную, на которую ссылается p. Если r обозначает запись, то r.f обозначает поле f из записи r. Если p обозначает ссылку, p.f обозначает поле f записи p^, то есть точка подразумевает разыменование, а p.f означает p^.f.
|
|
|
|
|
-Охрана типа v(Т0) проверяет, что v имеет тип T0, то есть охрана типа прекращает выполнение программы, если v не типа T0. Охрана применима, если
|
|
|
|
|
-1. T0 является расширением объявленного типа T в v, и если
|
|
|
|
|
-2. v - параметр, как переменная типа записи, или v - ссылка.
|
|
|
|
|
|
|
+`Выражения` состоят из операндов и операторов. Также могут включать круглые скобки для выражения определённых правил вычисления операторов и операндов. Выражения разделяются `;`
|
|
|
|
|
|
|
|
- ссылка = Квалификатор {селектор}
|
|
|
|
|
- селектор = "." Имя | "["СписокВыражения"]" | «^» | "(" Квалификатор ")"
|
|
|
|
|
- СписокВыражения = выражение {"," выражение}.
|
|
|
|
|
|
|
+### 8.1 Операнды
|
|
|
|
|
+
|
|
|
|
|
+За исключением чисел и литерных констант, операнды обозначаются именами. Обозначение операнда состоит из имени, которое может оносится к сущностям:
|
|
|
|
|
+
|
|
|
|
|
+- константа;
|
|
|
|
|
+- переменная;
|
|
|
|
|
+- процедура;
|
|
|
|
|
+- тип;
|
|
|
|
|
+
|
|
|
|
|
+Если имя операнда определено как имя модуля, то за ним могут следовать имена подчинённых сущностей. Если операнд является структурой, то через точку указываются поля такой структуры.
|
|
|
|
|
+
|
|
|
|
|
+> селектор = "." Имя | "["СписокВыражения"]" | «^» | "(" Квалификатор ")"
|
|
|
|
|
+> СписокВыражения = выражение {"," выражение}.
|
|
|
|
|
+
|
|
|
|
|
+Если обозначенное имя сущности является переменной, то имя переменной ссылается на текущее значение переменной.
|
|
|
|
|
+
|
|
|
|
|
+Если объект является функцией, то имя функции без списка параметров ссылается на эту функцию. Если за функцией следует список параметров (возможно, пустой), имя подразумевает вызов функции и обозначает значение, полученное в результате её выполнения. Фактические параметры (используемых типов) должны соответствовать формальным параметрам, указанным в объявлении функции (см. далее).
|
|
|
|
|
|
|
|
-Если обозначенный объект является переменной, то имя переменной ссылается на текущее значение переменной. Если объект является процедурой, то имя процедуры без списка параметров ссылается на эту процедуру. Если за ним следует список параметров (возможно, пустой), имя подразумевает активацию процедуры и обозначает значение, полученное в результате её выполнения. Фактические параметры (используемых типов) должны соответствовать формальным параметрам, указанным в объявлении процедуры (см. Главу 10).
|
|
|
|
|
Примеры обозначений (см. Примеры в главе 7):
|
|
Примеры обозначений (см. Примеры в главе 7):
|
|
|
- i (INTEGER)
|
|
|
|
|
- а[I] (REAL)
|
|
|
|
|
- w[3].ch (CHAR)
|
|
|
|
|
- t.ключ (INTEGER)
|
|
|
|
|
- t.левый.правый (Дерево)
|
|
|
|
|
- t(УзелСредний).подузел(Дерево)
|
|
|
|
|
-
|
|
|
|
|
-8.2 Операции
|
|
|
|
|
-Синтаксис выражений различает четыре вида операций с разными приоритетами (порядком выполнения). Операция ~ имеет наивысший приоритет, за которым следуют операции умножения, сложения и отношения. Операции одного и того же приоритета выполняются слева направо. Например, x-y-z означает (x-y)-z.
|
|
|
|
|
- выражение = ПростоеВыражение [отношение ПростоеВыражение].
|
|
|
|
|
- отношение = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.
|
|
|
|
|
- ПростоеВыражение = ["+"|"−"] разделитель {ОператорАддикции разделитель}.
|
|
|
|
|
- ОперациярАддикции= "+" | "−" | OR.
|
|
|
|
|
- разделитель = множитель {ОператорМультипликации множитель}.
|
|
|
|
|
- ОператорМультипликации = "*" | "/" | DIV | MOD | "&" .
|
|
|
|
|
- множитель = число| строка| NIL | TRUE | FALSE | set | ссылка [ФактическийПараметр] | "(" выражение ")" | "~" множитель.
|
|
|
|
|
- set = "{" [элемент {"," элемент}] "}".
|
|
|
|
|
- элемент = выражение [".." выражение].
|
|
|
|
|
- ФактическийПараметр = "(" [СписокВыражения] ")" .
|
|
|
|
|
-
|
|
|
|
|
-Множество {m..n} обозначает {m, m + 1, ..., n-1, n}, а если m>n, то пустое множество. Доступные операции перечислены в следующих таблицах. В некоторых случаях несколько разных операций обозначаются одним и тем же символом операции. В этих случаях фактическая операция определяется типом операндов.
|
|
|
|
|
-8.2.1 Логические операции
|
|
|
|
|
- Символ Результат
|
|
|
|
|
- OR логическая дизъюнкция
|
|
|
|
|
- & логическое соединение
|
|
|
|
|
- ~ логическое отрицание
|
|
|
|
|
|
|
|
|
|
-Эти операции применяются к операндам BOOLEAN и дают результат BOOLEAN.
|
|
|
|
|
- р OR q означает «если р, то TRUE, иначе q»
|
|
|
|
|
- p & q обозначает «если р, то q, иначе FALSE»
|
|
|
|
|
- ~ P означает "не p"
|
|
|
|
|
|
|
+```bash
|
|
|
|
|
+i (INT)
|
|
|
|
|
+а[I] (REAL)
|
|
|
|
|
+w[3].ch (BYTE)
|
|
|
|
|
+t.ключ (INT)
|
|
|
|
|
+t.левый.правый (Дерево)
|
|
|
|
|
+t(УзелСредний).подузел(Дерево)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 8.2 Операторы
|
|
|
|
|
+
|
|
|
|
|
+Синтаксис выражений различает четыре вида операторов с разными приоритетами (порядком выполнения).
|
|
|
|
|
+
|
|
|
|
|
+- `~` (инверсия имеет наивысший приоритет)
|
|
|
|
|
+- `*`, `/` (умножение и деление)
|
|
|
|
|
+- `+`,`-` (сложения и вычитание)
|
|
|
|
|
+
|
|
|
|
|
+Операции одного и того же приоритета выполняются слева направо. Например,
|
|
|
|
|
+
|
|
|
|
|
+> x-y-z
|
|
|
|
|
+
|
|
|
|
|
+означает
|
|
|
|
|
+
|
|
|
|
|
+> (x-y)-z
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+выражение = ОперацияПростая [ОперацияОтношение ОперацияПростая].
|
|
|
|
|
+ОперацияОтношение = "=" | "~" | "<" | "<=" | ">" | ">=" | IN | IS.
|
|
|
|
|
+ОперацияПростая = ["+"|"−"] разделитель {ОператорАддикции разделитель}.
|
|
|
|
|
+ОперациярАддикции= "+" | "−" | OR.
|
|
|
|
|
+разделитель = множитель {ОператорМультипликации множитель}.
|
|
|
|
|
+ОператорМультипликации = "*" | "/" | DIV | MOD | "&" .
|
|
|
|
|
+множитель = число| строка| NIL | TRUE | FALSE | set | ссылка [ФактическийПараметр] | "(" выражение ")" | "~" множитель.
|
|
|
|
|
+ОперацияВыборки = выражение [".." выражение].
|
|
|
|
|
+ФактическийПараметр = "(" [СписокВыражения] ")" .
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Множество [m..n] обозначает [m, m + 1, ..., n-1, n], а если m>n, то пустое множество. Доступные операции перечислены в следующих таблицах. В некоторых случаях несколько разных операций обозначаются одним и тем же символом операции. В этих случаях фактическая операция определяется типом операндов.
|
|
|
|
|
+
|
|
|
|
|
+### 8.2.1 Логические операции
|
|
|
|
|
+
|
|
|
|
|
+| Символ | Результат |
|
|
|
|
|
+| ------ | --------------------- |
|
|
|
|
|
+| OR | логическая дизъюнкция |
|
|
|
|
|
+| AND | логическое соединение |
|
|
|
|
|
+| NOT | логическое отрицание |
|
|
|
|
|
+
|
|
|
|
|
+Эти операции применяются к операндам BOOL и дают результат BOO.
|
|
|
|
|
|
|
|
|
|
+> р OR q // означает «если р, то TRUE, иначе q»
|
|
|
|
|
+> p AND q // обозначает «если р, то q, иначе FALSE»
|
|
|
|
|
+> NOT P // означает "не p"
|
|
|
|
|
|
|
|
-8.2.2 Арифметические операции
|
|
|
|
|
|
|
+### 8.2.2 Арифметические операции
|
|
|
Символ Результат
|
|
Символ Результат
|
|
|
+ сумма
|
|
+ сумма
|
|
|
- разница
|
|
- разница
|
|
@@ -529,7 +562,7 @@ var t: Дерево;
|
|
|
IN членство в наборе
|
|
IN членство в наборе
|
|
|
IS проверка типа
|
|
IS проверка типа
|
|
|
|
|
|
|
|
-Результат операций отношения является базовым типом BOOLEAN. Отношение упорядочения <, <=,>,> = применяется к числовым типам, CHAR и литерным массивам. Отношения = и # применимы также к типам BOOLEAN, SET, ссылкам и процедурным типам.
|
|
|
|
|
|
|
+Результат операций отношения является базовым типом BOOLEAN. ОперацияОтношение упорядочения <, <=,>,> = применяется к числовым типам, CHAR и литерным массивам. Отношения = и # применимы также к типам BOOLEAN, SET, ссылкам и процедурным типам.
|
|
|
x IN s означает "x является элементом s". x должен иметь тип INTEGER и s должен быть типом SET.
|
|
x IN s означает "x является элементом s". x должен иметь тип INTEGER и s должен быть типом SET.
|
|
|
v IS T означает «v имеет тип T» и вызывает проверку типа. Это применимо, если
|
|
v IS T означает «v имеет тип T» и вызывает проверку типа. Это применимо, если
|
|
|
1. T - расширение объявленного типа T0 для v, и если
|
|
1. T - расширение объявленного типа T0 для v, и если
|
|
@@ -1047,9 +1080,9 @@ INTEGER
|
|
|
ТипСсылка = POINTER TO тип.
|
|
ТипСсылка = POINTER TO тип.
|
|
|
ТипПроцедуры = PROCEDURE [ФормальныеПараметры].
|
|
ТипПроцедуры = PROCEDURE [ФормальныеПараметры].
|
|
|
ОпрПеременных = СписокИмён ":" тип.
|
|
ОпрПеременных = СписокИмён ":" тип.
|
|
|
-выражение = ПростоеВыражение [отношение ПростоеВыражение ].
|
|
|
|
|
-отношение = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.
|
|
|
|
|
-ПростоеВыражение = ["+" | "-"] разделитель {ОперАддикции разделитель }.
|
|
|
|
|
|
|
+выражение = ОперацияПростая [ОперацияОтношение ОперацияПростая ].
|
|
|
|
|
+ОперацияОтношение = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS.
|
|
|
|
|
+ОперацияПростая = ["+" | "-"] разделитель {ОперАддикции разделитель }.
|
|
|
ОперАддикции = "+" | "-" | OR.
|
|
ОперАддикции = "+" | "-" | OR.
|
|
|
разделитель = множитель {ОперМультипликации множитель}.
|
|
разделитель = множитель {ОперМультипликации множитель}.
|
|
|
ОперМультипликации = "*" | "/" | DIV | MOD | "&".
|
|
ОперМультипликации = "*" | "/" | DIV | MOD | "&".
|