Операнды
За исключением конструкторов множества и литералов (чисел, символьных констант или строк), операнды представлены обозначениями. Обозначение содержит идентификатор константы, переменной или процедуры. Этот идентификатор может быть уточнен именем модуля (см. Гл. 4 и 11) и может сопровождаться селекторами, если обозначенный объект - элемент структуры.
Обозначение | = | УточнИдент { "." идент | "[" СписокВыражений "]" | "^" | "(" УточнИдент ")" }. |
СписокВыражений | = | Выражение {"," Выражение}. |
Если а - обозначение массива, a[e] означает элемент а, чей индекс - текущее значение выражения e. Тип e должен быть целым типом. Обозначение вида a[e0, e1, ..., en] применимо вместо a[e0] [e1] ... [en]. Если r обозначает запись, то r.f означает поле f записи r или процедуру f, связанную с динамическим типом r (Гл. ). Если p обозначает указатель, p^ означает переменную, на которую ссылается p. Обозначения p^.f и p^[e] могут быть сокращены до p.f и p[e], то есть запись и индекс массива подразумевают разыменование. Если a или r доступны только для чтения, то a[e] и r.f также предназначены только для чтения.
Охрана типа v(T) требует, чтобы динамическим типом v был T (или расширение T), то есть выполнение программы прерывается, если динамический тип v - не T (или расширение T). В пределах такого обозначения v воспринимается как имеющая статический тип T. Охрана применима, если
Если обозначенный объект - константа или переменная, то обозначение ссылается на их текущее значение. Если он - процедура, то обозначение ссылается на эту процедуру, если только обозначение не сопровождается (возможно пустым) списком параметров. В последнем случае подразумевается активация процедуры и подстановка значения результата, полученного при ее исполнении. Фактические параметры должны соответствовать формальным параметрам как и при вызовах собственно процедуры (см. ).
Примеры обозначений (со ссылками на примеры из Гл. 7):
i | (INTEGER) |
a[i] | (REAL) |
w[3].name[i] | (CHAR) |
t.left.right | (Tree) |
t(CenterTree).subnode | (Tree) |