
- •1.3.3. Классы
- •1.3.4. Возможность применения в специальных областях
- •2.1. Синтаксис
- •2.2. Семантика ,; V-
- •2.2.1. Подклассы
- •2.2.2. Сочленение . -
- •2.2.3. Виртуальные величины
- •4.3.2.2. Генераторы объектов ,
- •4.3.2.3. Локальный объект
- •4.3.2.4. Оперативная квалификация «
- •7. Дистанционное обращение
- •7.1.2. Семантика
- •10.8.2. Семантика
- •11.3.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.1.2. Семантика-
7.1.2. Семантика
Пусть X есть простое объектное выражение, квалифицированное классом С, и пусть А — некоторый идентификатор атрибута. Тогда дистанционный идентификатор X. А (если он законен) идентифицирует соответствующий атрибут, причем в качестве первого элемента идентифицирующей информации выступает значение выражения X, а в качестве второго — класс С.
Дистанционный идентификатор законен, если выполнены следующие требования:
значение выражения X отлично от попе;
объект не имеет атрибутов-классов на префиксальных уровнях, не превосходящих уровня С.
Первое требование должно обнаруживаться во время выполнения программы и вызывать соответствующее сообщение об ошибке.
Второе требование выдвинуто для того, чтобы упростить язык и его реализации.
Дистанционный идентификатор вида
(простое текстовое выражение) . (идентификатор атрибута)
идентифицирует некоторый атрибут текстовой ссылки, получающейся путем вычисления простого текстового выражения, при условии, что идентификатор атрибута является одним из идентификаторов процедур, перечисленных в разд. 10. К
Пример 1:
Пусть G5 и G10— переменные, декларированные и получившие значения в соответствии с примером 1 разд. 6.1.2.2. Тогда значение выражения
G5. интеграл (...)
ял и
G10- интеграл (...)
есть приближение к определенному интегралу, полученное применением формулы Гаусса с 5 или 10 абсциссами соответственно.
Пример 2:
П
усть
Р1 и Р2 — переменные, объявленные и
получившие значения в, соответствии
с примером 2 разд. 6.1.2.2. Ы значением
выражения
Р\ .плюс (Р2)
■
является йовая точка (объект класса точка), представляющая векторную сумму точек Р\ и Р2. Значением выражения
Р\ qua поляр, плюс (Р2)
является новый объект класса поляр, представляющий ту же самую векторную сумму.
7.2. ПРИСОЕДИНЕНИЯ
7.2.1. Синтаксис
■
/присоединяющий блок 1) :: = (оператор) (присоединяющий блок 2): : = (оператор) (присоединение):: =
when (идентификатор класса) do (присоединяющий
блок 1)
(альтернатива) :: = (пусто) | otherwise (оператор) (совокупность присоединений) :: — (присоединение) |
(совокупность присоединений) (присоединение) (присоединяющий оператор) :: =
inspect (объектное выражение) (совокупность
присоединений) (альтернатива)|
inspect (объектное выражение) do
(присоединяющий блок 2) (альтернатива)
Присоединяющий блок сам может быть присоединяющим оператором, каковым в этом случае является наибольший присоединяющий оператор, обнаруживаемый на месте при соединяющего блока. . . . .
7.2.2. Семантика
Механизм присоединения обеспечивает неявное определение вышеупомянутых первых и вторых элементов для некоторых обращений к атрибутам внутри' присоединяющих блоков.
Присоединяющий оператор выполняется следующим образом:
Вычисляется объектное выражение присоединяющего оператора. Пусть X есть полученное значение.
Если в присоединяющем операторе имеются присоеди нения, то они рассматриваются по очереди одно за другим. Если Л" — объект, принадлежащий к классу, содержащемуся в указанном вслед за символом when, то выполняется (при соединяющий блок 1) этого присоединения, а последующие присоединения (и альтернатива) пропускаются. В противном случае очередное присоединение пропускается.
Если в присоединяющем операторе имеется (присоеди няющий блок 2), то он выполняется только при условии, что X не есть попе; если это условие не выполняется, то (присо единяющий блок 2) пропускается.
Оператор в альтернативе выполняется, если X есть попе или если X есть объект, не принадлежащий ни одному из классов, указанных вслед за символами when, и ни одному из подклассов таких классов. В противном случае оператор в альтернативе пропускается.
Оператор, являющийся (присоединяющим блоком 1) или (присоединяющим блоком 2), действует подобно блоку независимо от того, имеет ли он форму блока или нет. Кроме того, он действует так, как если бы он был вложен в некоторый другой фиктивный блок, называемый «присоединенным блоком». Во время выполнения присоединяющего блока объект X называется присоединенным. Присоединяющий блок имеет «квалификацию блока», каковой является предшествующий идентификатор класса для (присоединяющего блока 1) и квалификация предшествующего объектного выражения для (присоединяющего блока 2).
Пусть квалификация блока данного присоединяющего блока есть С, и пусть А — идентификатор атрибута, определенный на префиксальном уровне класса С. Тогда любое не-экранированное вхождение идентификатора А в присоединенный блок получает локальный смысл: оно является идентификацией атрибута, первым элементом которой является присоединенный объект, а вторым — квалификация присоединяющего блока, т. е. С.
Следовательно, присоединяющий блок действует так, как если бы атрибуты присоединенного объекта вплоть до уровня С включительно были его локальными величина-ми. (Конфликты наименований между атрибутами, определенными на различных префиксальных уровнях, разрешаются выбором атрибута на наивысшем префиксальном уровне.)
..Пример: ' ' .
Пусть Гаусс есть класс, декларированный в примере разд. 2.2. Тогда внутри оператора (присоединяющий блок 2) присоединяющего оператора
inspect new Гаусс (5) do begin end
доступна процедура интеграл для численного интегрирования по формуле Гаусса с 5 абсциссами.
ш\
8. ПРОЦЕДУРЫ *И ПЕРЕДАЧА ПАРАМЕТРОВ
8.1. СИНТАКСИС
(заголовок процедуры) :": = (идентификатор™ процедуры)
(совокупность формальных параметров); (вид передачи) (совокупность спецификаций) (вид передачи)::=(совокупность значений)
(совокупность имен)| (совокупность имен)
(совокупность значений)
(совокупность значений) : :=value (список идентификаторов);!
(пусто) (совокупность имен) :: = name (список идентификаторов) ; |
" (пусто) (спецификатор) :: = (тип) | array | (тип) array | label | J
switch | procedure | (тип) procedure О фактических параметрах см. разд. 7.1.1.
8.2. СЕМАНТИКА w
В описании процедур языка СИМУЛА-67 имеются сле дующие отличия от АЛ ГОЛ а-60: . .. "
Спецификации требуются для всех формальных пара метров. - .
Вместо спецификатора' string, принятого в АЛГОЛе,. употребляется спецификатор text.
В качестве необязательной части заголовка процедуры введена конструкция (совокупность имен),- указывающая па раметры, вызываемые по наименованию. Отсутствие упо минания параметра в конструкции (вид. передачи) не озна чает еще, что параметр должен передаваться по наимено ванию.
.
9. ПОРЯДОК ВЫПОЛНЕНИЯ
9.1. БЛОКИ И ДИНАМИЧЕСКИЕ ОБЛАСТИ
■
Составными частями процесса исполнения, программы являются динамические экземпляры блоков. Все блоки распадаются на три категории в зависимости от возможных взаимоотношений и возможных состояний их динамических эк-земпляров.
1. Блоки с приставкой. . 2. Подблоки, тела процедур и присоединяющие блоки.
3. Тела классов.
Экземпляр блока в каждый данный момент находится в одном из трех состояний исполнения: «прикреплен», «самостоятелен» («откреплен») или.«завершен». Возможные и начальные состояния экземпляров блоков указаны в следующей таблице: ■
■ Категория блоков |
Возможные состояния |
Начальное состояние |
\ 3 |
С - П п,с,з к. |
. е п п |
П—прикреплен,
С—самостоятелен, 3—завершен.
Программа на языке АЛГОЛ-60 содержит лишь блоки кате горий 2 (за исключением самого внешнего блока программы, который естественно считать блоком категории 1, см. разд. 11). Исполнению любой такой программы соответствует обычная структура Динамически вложенных друг в друга экземпля ров блоков.
, :-"
Экземпляр блока категории 2 находится всегда в прикрепленном состоянии; считается, что он «прикреплен к» наименьшему динамически охватывающему , его экземпляру блока. Например, экземпляр тела процедуры прикреплен к экземпляру, блока, содержащему соответствующее обращение к процедуре.
Управление программой (УП) указывает в каждый дан-ный момент на ту точку программы внутри некоторого экземпляра блока, которая исполняется в этот момент. Для краткости будем говорить, что УП установлено на эту точку программы и находится в некотором экземпляре блока. Если Л есть экземпляр блока, в котором находится УП, то Л и все
экземпляры блоков, динамически охватывающие Л, называются работающими.
Вход в блок вызывает порождение некоторого нового эк земпляра блока, после чего УП входит в этот экземпляр блока. Если УП-покидает экземпляр блока категории 1 или 2 через замыкающий его символ end или в результате выпол- нения оператора перехода, то этот экземпляр блока уничто жается.- "
Некоторый объект (т. е. экземпляр блока категории 3) вначале прикреплен к экземпляру блока, содержащему соответствующий генератор объекта. Он может- стать самостоятельным (перейти в открепленное состояние) при выполне-' нии оператора detach (см. разд. 9.2.1). Если УП покидает объект через замыкающий его тело символ end или в результате выполнения оператора перехода, объект становится завершенным.
Об экземпляре блока говорят, что он «локален по отношению к» экземпляру блока, содержащему текст, описывающий первый экземпляр. Например, объект, принадлежащий к некоторому данному классу, локален по отношению к экземпляру блока, содержащему декларацию этого класса.
Считается, что экземпляр блока (назовем его Л), охватывает некоторый другой экземпляр блока (назовем его В), если:
экземпляр блока В прикреплен и динамически охваты вается экземпляром блока Л, или
экземпляр блока В самостоятелен или завершен и ло кален по отношению либо к Л, либо к некоторому экземпляру блока, динамически охватываемому экземпляром блока Л, или
имеется самостоятельный объект С, локальный по от ношению либо к Л, либр к некоторому экземпляру блока,
динамически охватываемому экземпляром блока А, такой, что С охватывает В.
ч
Всякий раз, когда некоторый экземпляр блока уничтожается, все экземпляры блоков, охватываемые им, также уничтожаются. Структура языка такова, что после уничтожения объекта к этому объекту нельзя обратиться каким бы то ни было объектным выражением. Следовательно, динамическая область существования объекта ограничена динамической областью существования декларации его класса. Однако при реализации языка фактический период, жизни объектов может быть еще-несколько сокращен посредством таких приемов Листки памяти, как «сборка мусора».
Заметим, что массивы и текстовые значения, вообще .говоря, нельзя уничтожать вместе с экземпляром блока, где они декларированы.
.9.2. КВАЗИПАРАЛЛЕЛЬНОЕ ИСПОЛНЕНИЕ
Состояние выполнения программы лучше всего можно описать структурой дерева, узлы которого являются экземплярами блоков с префиксами. Поддерево, «корнем» которого является экземпляр блока с префиксом, называется «квазипараллельной системой». Экземпляр блока с префиксом, включая экземпляры блоков, динамически вложенных в него, называется «главной программой» данной квазипараллельной системы.
С каждой квазипараллельной системой связан «уровень системы», т. е. количество экземпляров блоков с префиксами, объемлющих ее главную программу. Программа в целом является квазипараллельной системой с уровнем системы, равным нулю.
Квазипараллельная система состоит из «компонент» системы, каковыми являются главная программа и самостоятельные объекты (содержащие, разумеется, экземпляры бло= ков, динамически вложенные в такие объекты), для которых минимальным объемлющим экземпляром блока с префиксом является главная программа системы. Компоненты квазипараллельной системы по определению считаются «самостоятельными на» уровне данной квазипараллельной системы.
С любой компонентой системы связано «локальное управление» (ЛУ), а с каждой квазипараллельной системой в целом— «внешнее управление» (ВУ)Ч Внешнее^ управление на уровне системы, равном нулю, совпадает с УП. ВУ некоторой квазипараллельной системы на уровне k (£^1) совпадает
с ЛУ той компоненты на (k— 1)-м уровне системы, которая объемлет данную систему.
"Для любой данной квазипараллельной системы в каждый данный момент одна и только одна из ее компонент является «активной». ЛУ этой компоненты совпадает с ВУ квазипараллельной системы.
Экземпляр блока с префиксом вначале активен, т. е. вначале ВУ его собственной квазипараллельной системы находится в нем самом. ВУ некоторой системы может переходить из компоненты в компоненту в результате действия некоторых операторов, которые будут описаны в последующих разделах. ЛУ некоторой компоненты, не содержащей ВУ, остается в той точке программы, в которой ВУ покинуло объект в последний раз.
В любой данный момент существует такая последовательность компонент систем XOt Х\у ..., ХПу что
Xh активна на уровне системы k (k = 0, 1, ..., п);
Xh вложена в Xk^i (k = 1,2, ..., п)\
в Хп не вложено никакой квазипараллельной системы.
Эта последовательность называется «работающей цепочкой». Все компоненты системы в работающей цепочке содержат УП и поэтому называются.работающими. ЛУ некоторой компоненты остается неподвижным до тех пор, пока эта компонента не станет членом работающей цепочки1).
9.2.1. Оператор detach (открепить) .
Пусть X — наименьший работающий экземпляр блока. Если X является прикрепленным объектом, оператор открепить производит следующие действия:
объект становится самостоятельным (открепленным) на уровне системы наименьшего объемлющего экземпляра блока с префиксом, а его ЛУ останавливается в конце опе ратора detach;
УП возвращается в экземпляр блока, к которому X был прикреплен, и возобновляет работу с оператора, стоя щего вслед за генератором объектов, который вызвал поро ждение объекта X. Результатом вычисления выражения (ге нератор объектов) является ссылка на X.
Если X является самостоятельным объектом, являющимся компонентой некоторой квазипараллельной системы S, то оператор detach производит следующие действия:
1) ВУ системы 5 покидает X. В результате X удаляется из работающей цепочки, а его ЛУ останавливается в конце.
оператора detach; - .
2) ВУ системы 5 входит в главную программу системы S на текущую позицию "ее Л У. В результате главная про грамма системы 5 и, возможно, компоненты систем на уров нях, более высоких, чем уровень S, станут работающими.
Если X есть экземпляр блока с префиксом, то оператор detach вдкаких действий не производит.
Если X есть экземпляр блока, но не объект и не экземпляр блока с префиксом, то использование оператора detach представляет собой ошибку.
+
9.2.2. Оператор resume (возобновить)
Оператор resume формально является процедурой с ojx-ним параметром гипа ссылок на объект, квалифицированным некоторым фиктивным классом, объемлющим все классы.
Пусть фактический параметр'оператора resume ссылается на некоторый самостоятельный объект У, являющийся компонентой некоторой квазипараллельной системы 5. Согласно правилам языка на Y можно сослаться только изнутри экземпляра блока (назовем его X), являющегося компонентой той же системы 5 или вложенного в некоторую компоненту
этой системы. Экземпляр блока X является в данный момент работающим. Оператор resume производит следующие действия:
г
ВУ системы 5 покидает X. В результате сам X и все работающие компоненты на более высоких уровнях системы удаляются из работающей цепочки. ЛУ каждой компоненты останавливается в конце оператора resume";
ВУ системы 5 входит в У на текущую позицию его ЛУ. В результате Y и, возможно, последовательность компо нент на более высоких уровнях системы становятся рабо тающими. : - *
Если фактический параметр оператора resume не ссы лается на самостоятельный объект, то при выполнении опе ратора выдается сообщение об ошибке
9.2.3. Выход через «end» объекта
Результат того, что УП выходит через замыкающий сим--вол end объекта, совпадает с действием оператора detach с тем отличием, что объект становится завершенным (а не самостоятельным) и, таким образом, теряет свое ЛУ.
■
9.2.4. Операторы перехода
Результатом выполнения оператора перехода, передающего управление из данного объекта в некоторую точку вне него, является то, что УП покидает объект, который становится завершенным.
" На любой оператор перехода накладывается следующее ограничение: он может передавать управление только в точку программы внутри какого-нибудь работающего экземпляра блока. Из этого ограничения следует, что оператор перехода, передающий управление из самостоятельного объекта, означает также выход из минимального объемлющего блока с префиксом.
10. ТИП «ТЕКСТ» . ' '
См. разд. 3.2.3, 4.4, 5.2 и 5.4.
10.1. АТРИБУТЫ ТЕКСТА
Приводимые ниже процедуры являются атрибутами любой ссылки на текст. К ним можно обращаться посредством дистанционных идентификаторов вида
(простое текстовое выражение) . (идентификатор процедуры).
integer procedure length |
(cm. 10.2) |
text procedure main |
(cm. 10.2) |
integer procedure pos |
(cm. 10.3) |
procedure setpos |
(cm. 10.3) |
Boolean procedure more |
r (cm. 10-3) |
character procedure getchar |
, (cm. 10.3) |
procedure putchar " |
(cm. 10.3) |
text procedure sub |
(cm. 10.7) |
text procedure strip |
(cm. 10.7) |
integer procedure getint |
,, (cm. 10.9) |
real procedure getreal |
(см. 10.9) |
integer procedure getfrac |
(cm. 10.9) |
procedure putint |
(cm. 10.10) |
procedure putfix (см. 10.10)
procedure putreal ' (см. *10.10)
procedure puttext ' - . (см. 10.10)
procedure putfrac (см. 10.10)
В следующих разделах буква X, если не оговорено противное, означает ссылку на текст.
г
ю.2. процедуры-атрибуты length и main .
integer procedure length ;
Процедура X . length доставляет в качестве своего значения количество литер текстового значения, .на которое ссылается X (ср. разд. 3.2.3). Выражение notext. length имеет значение, равное нулю.
text procedure main ;
Процедура X.main доставляет в качестве своего значения ссылку на текстовый объект, являющийся текстом, на который ссылается X, или содержащий такой текст (ср. разд. 3.2.3).
Выражение notext. main эквивалентно выражению notext.
Для любой ссылки на текст выполняются следующие отношения:
X. main . length ^ X. length
X. main . main = = X. main
10.3. ДОСТУП К ЛИТЕРАМ
*
Литеры текста доступны по одной. Любая ссылка на текст имеет «указатель позиции», указывающий на литеру этого текста, доступную в данный момент (если таковая имеется).
Указатель позиции ссылки X — это целое число в интервале [1, X . length + 1].
Указатель позиции для notext равен единице. Ссылка на текст, получаемая в результате вызова любой системной текстовой процедуры, имеет указатель позиции, равный единице.
Указатель позиции данной ссылки на текст можно изменить процедурами setpos, getchar и putchar. Кроме того, любая из процедур, определенных в разд. 10.9 и 10.10, может изменить указатель позиции ссылки на текст, атрибутом которого является такая процедура.
Указатели позиций не принимаются во внимание и не изменяются при вычислении отношений ссылок на текст, othq-
шении текстовых значении и при присваиваниях текстовых значений. г ■
Следующие процедуры употребляются для получения доступа к литерам. Они приспособлены к организации последовательного доступа.
integer procedure pos;
Процедура X.pos доставляет в качестве своего значения текущее значение указателя позиции ссылки на текст X.
procedure setpos (/); integer /:
Действие процедуры X. setpos (i) состоит в том, что указателю позиций ссылки на текст X присваивается значение /, если I находится в интервале [1, X. length + 1]. В противном случае присваивается значение X. length + 1.
Boolean procedure more;
Процедура X. more доставляет значение true, если указатель позиции ссылки X находится в интервале [Г, X. length]. В противном случае она имеет значение false,
character procedure getchar;
Процедура Л7, getchar доставляет в качестве своего значения копию доступной в данный момент литеры текста X при условии, что значением Х.тоге является true. В противном случае выдается сообщение об ошибке. Если ошибки не про-. изошло, после выполнения копирования указатель позиции текста X увеличивается на единицу.
procedure putchar (с); character (с);
Действие процедуры Л7-putchar (с) состоит в том, что доступная в данный момент литера текста X заменяется копией литеры с при условии, что значением A".more является true. В противном случае выдается сообщение об ошибке. Если не произошло ошибки, после выполнения замены указатель позиции текста X увеличивается на единицу.
Пример:
т
procedure уплотнить (Т); text T; begin text U; character с;
Г.setpos (1); U :-T;
for с : = с while U . more do
begin с : = U . getchar ;
if с ф "_" then T . putchar (c)
end;
for c: = c while T.more do T. putchar ("Jf) end уплотнить;
Процедура переупорядочивает литеры текстового значе ния, на которое ссылается параметр Г. Литеры, отличные от пробела, собираются в левой части текста, а оставшаяся часть, если таковая имеется, заполняется литерами пробела. Поскольку параметр вызывается по ссылке,' то его указатель позиции не меняется. Значением литерной константы "_" яв ляется литера пробела. . _ ■
10.4. ПОРОЖДЕНИЕ ТЕКСТОВ
Для порождения объектов типа текст, в дальнейшем для краткости называемых просто текстами, имеются следующие основные процедуры. Эти процедуры в отличие от рассмотренных выше не локализовании в текстовых объектах.
text procedure blanks (n); integer n;
Эта процедура доставляет в качестве своего значения ссылку*на новый текстовый объект длины п, заполненный литерами пробела.
text procedure text (Г); value Г; text T;
Эта процедура доставляет в качестве своего значения ссылку на новый текстовый объект, являющийся копией текстового значения, на которое ссылается или которым является фактический параметр.
Пример:
оператор Г:—text ('ABC'), где Т есть текстовая переменная, эквивалентен составному оператору
begin Г: —blanks (3); Г: =9АВС end :
10.5. ПРИСВАИВАНИЕ ТЕКСТОВЫХ ССЫЛОК
(Синтаксис см. разд. 6.1).
к
i
Результатом текстового присваивания ссылок является то, что присваиваемая ссылка становится новым содержимым ЛЧ. Это новое содержимое ЛЧ .является копией ссылки, получающейся при вычислении ПЧ (см. .разд. 6.2). Присваиваемая ссылка включает в себя также копию указателя пози-
Г.ии ПЧ. .■'"'*
Если X есть текстовая переменная, а У — ссылка на текст, то после выполнения присваивания ссылок X: — У оба отношения X = =У и X.pos = y.pos имеют значение true.
Ь 10.6. ПРИСВАИВАНИЕ ТЕКСТОВЫХ ЗНАЧЕНИЙ
^ (Синтаксис см. разд. 6.1).
Пусть значением ЛЧ присваивания текстового значения является текст длины Lt, а значением ПЧ — текст длины Lr. Если ПЧ сама является присваиванием текстового значения, то Lr по определению есть длина текста, присвоенного при выполнении этой ПЧ в качестве присваивания. Результат при сваивания текстового значения зависит от соотношения между LI и Lr. ■
LI = Lr: Литеры значения ПЧ переписываются последовательно в значение ЛЧ.
Ll> Lr. Литеры значения ПЧ переписываются последовательно в первые Lr позиции значения ЛЧ. -Остальные LI — Lr позиций значения ЛЧ заполняются пробелами.
'LKLr- При исполнении такого присваивания выдается со- ] г . общение об ошибке.
г ™
1 ' Если ЛЧ и ПЧ ссылаются на пересекающиеся тексты, то результат присваивания текстового значения определяется-конкретной реализацией языка.
При выполнении присваивания текстового значения указатели позиций ЛЧ и ПЧ во внимание не принимаются и не изменяются. ■
Если X и Y суть тексты одинаковой длины, то после исполнения присваивания текстового значения X: = У отношение X = Y имеет значение true.
10.7. ПОДТЕКСТЫ
Имеются две процедуры для обращений к подтекстам: 1) text procedure sub (i,n)\ integer i,n;
Пусть / и п — такие целые числа, что /^ 1, пХ), и 7 + п<СХ.length + 1. Тогда выражение X.sub (i,n) ссылается на ту часть текстового значения X, первая литера которой является t-й литерой значения X и которая содержит п последующих литер. Указатель позиции в получаемой ссылке на текст равен единице и определяет местную нумерацию литер в подтексте. Указатель позиции значения X во внимание не принимается и не изменяется. В особом случае, когда п = 0, получаемая ссылка есть notext. Если i и п не удовлетворяют указанным выше условиям, то при выполнении процедуры выдается сообщение в ошибке.
Логические выражения:
правилом действий, состоящим из правил действий класса и ' префикса. В результате указанного сочленения все понятия и операции, определенные в префиксе, становятся доступными для объектов класса, имеющего этот префикс. * -
Пользователь может по своему усмотрению создавать структуры классов, соответствующие содержанию решаемых задач. Каждый из классов может иметь последовательность префиксов произвольной глубины. , " . ■ - '
С другой стороны, классы, используемые в качестве префиксов, могут разрабатываться заранее и входить в язык как • его составные части. В этом случае пользователь получает возможность обращаться к понятиям и методам, описанным в таком «системном» классе, употребив его в качестве префикса к своей программе или к ее части.
Содержание, таких системных классов может быть самым разнообразным: класс ПЛАНИМЕТРИЯ, класс БУХГАЛТЕРСКИЙ УЧЕТ, класс МЕДИЦИНСКАЯ ДИАГНОСТИКА и т. п. Системный класс может описывать те или иные свой-ства» методы и понятия в терминах, принятых в соответствующей области, и представлять, таким образом, некоторый специализированный язык. В результате программа, имеющая этот класс в качестве своего префикса, может быть также написана на специализированном языке.
Таким образом, введение классов позволяет не только опи сывать различные иерархически построенные структуры дан ных и правила действий, но и легко осуществлять специали зацию языка. ■ '
Читателю, возможно, известен язык СИМУЛА-1, предназначенный для описания сложных систем с дискретными" событиями. Не будет преувеличением сказать, что до последнего времени этот язык был наилучшим инструментом моделирования на ЭВМ, завоевавшим популярность в нашей стране и за рубежом.
Отрадно отметить, что все средства моделирования, соот- . ветствующие языку СИМУЛА-1 (параллельное функционирование объектов, управление последовательностью действий/ получение случайных чисел, обработка статистики и т. п.), являются частью языка СИМУЛА-67 и ими можно воспрль-р зоваться через системный класс МОДЕЛИРОВАНИЕ. ... ■■'■.
Введение в язык классов заставило разработать новые средства для ссылок на объекты. Предложенные авторами " решения этой проблемы привлекают своим удобством, наглядностью и эффективностью с точки зрения их реализации., ■
■ Интересной особенностью языка является использование уац щзьщъщщ виртуальных велцчин^ которые сцецифици-
и
п Ф 0 :=э X. main = =X.sub(tt n).main
если они законны, оба имеют значение true.
2) text procedure strip ;
Выражение Л7, strip эквивалентно выражению X.sub (1, га), где п есть наибольшее целое число, такое, что литеры значения X в позициях под номерами, большими п, если таковые имеются, все суть литеры пробела.
Пусть X и К —ссылки на текст. Тогда после присваивания значения X ;= У, если оно не приводит" к ошибке, отно: шение X . strip = У. strip имеет значение true.
10.8. ЧИСЛОВЫЕ ТЕКСТОВЫЕ ЗНАЧЕНИЯ
*. i
г
10.8.1. Синтаксис
/ПУСТО):: =
(ТЕРМИНАЛЬНЫЙ СИМВОЛ) :: = (ЦИФРА) | +1 -1. |10
(ПРОБЕЛ) | (РАЗДЕЛИТЕЛЬ)
(ЦИФРА) :: = 0|1 |2 |3 |4|5|6 |7 |8 |9 ЦИФРЫ) :: = (ЦИФРА)| (ЦИФРЫ) (ЦИФРА) ПРОБЕЛЫ) :: = (ПУСТО)| (ПРОБЕЛЫ) (ПРОБЕЛ)
ЗНАК) :: = (ПУСТО) | + | -
ЗНАКОВАЯ ЧАСТЬ):: = (ПРОБЕЛЫ) (ЗНАК) (ПРОБЕЛЫ) ЗАПИСЬ ЦЕЛОГО) ::= (ЗНАКОВАЯ ЧАСТЬ) (ЦИФРЫ) (ЗАПИСЬ ДРОБНОГО) :: = . (ЦИФРЫ) (ЗАПИСЬ МАНТИССЫ):: = (ЗАПИСЬ ЦЕЛОГО) |
(ЗНАКОВАЯ ЧАСТЬ)
(ЗАПИСЬ ДРОБНОГО) | . (ЗАПИСЬ ЦЕЛОГО)
(ЗАПИСЬ ДРОБНОГО) (ПОРЯДОК):: = Ю(ЗАПИСЬ ЦЕЛОГО) (ЗАПИСЬ ВЕЩЕСТВЕННОГО):: = (ЗАПИСЬ МАНТИССЫ)|
(ЗНАКОВАЯ ЧАСТЬ)
(ПОРЯДОК) I (ЗАПИСЬ МАНТИССЫ)
(ПОРЯДОК)
(РАЗДЕЛИТЕЛЬ) :: = (ПРОБЕЛ) |, (ГРУППЫ) :: = (ЦИФРЫ) | (ГРУППЫ) (РАЗДЕЛИТЕЛЬ)
(ЦИФРЫ)
(ЗАПИСЬ ГРУППАМИ) :: = (ЗНАКОВАЯ ЧАСТЬ)
(ГРУППЫ) | (ЗНАКОВАЯ ЧАСТЬ).
(ГРУППЫ)|
(ЗНАКОВАЯ ЧАСТЬ)
(ГРУППЫ). (ГРУППЫ)
(ЗАПИСЬ ЧИСЛА) :: = (ЗАПИСЬ ЦЕЛОГО) |
(ЗАПИСЬ МАНТИССЫ) | (ЗАПИСЬ ВЕЩЕСТВЕННОГО) | (ЗАПИСЬ ГРУППАМИ)