Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Симула.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
393.73 Кб
Скачать

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 (ЗАПИСЬ МАНТИССЫ)

(ПОРЯДОК)

(РАЗДЕЛИТЕЛЬ) :: = (ПРОБЕЛ) |, (ГРУППЫ) :: = (ЦИФРЫ) | (ГРУППЫ) (РАЗДЕЛИТЕЛЬ)

(ЦИФРЫ)

(ЗАПИСЬ ГРУППАМИ) :: = (ЗНАКОВАЯ ЧАСТЬ)

(ГРУППЫ) | (ЗНАКОВАЯ ЧАСТЬ).

(ГРУППЫ)|

(ЗНАКОВАЯ ЧАСТЬ)

(ГРУППЫ). (ГРУППЫ)

(ЗАПИСЬ ЧИСЛА) :: = (ЗАПИСЬ ЦЕЛОГО) |

(ЗАПИСЬ МАНТИССЫ) | (ЗАПИСЬ ВЕЩЕСТВЕННОГО) | (ЗАПИСЬ ГРУППАМИ)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]