Н. Вирт - Программирование на языке Модула-2 (1160777), страница 29
Текст из файла (страница 29)
Этовозможно только в тех частях программы, которые находятся внутри так называемой облаcтивидимости описания. В общем случае область видимости простирается на весь тот блок (процедуруили описание модуля), которому принадлежит данное описание и в котором соответствующий $ОписаниеКонстанты =$Идентификатор "=" КонстВыражение.$ КонстВыражение = Выражение.
(!)Константное выражение - выражение, которое может быть вычислено в процессе чтенияпрограммы без ее выполнения. Его операндами являются константы (см. гл. 8). Примерыописаний констант:N = 100npeдел=2*N-lвсе={0.. WordSize-1}граница=МАХ(INTEGER)-N1436. ОПИСАНИЯ ТИПОВТип данных определяет множество значений, которое может принимать переменная этоготипа, и связывает с этим типом идентификатор.
Имеется три разновидности структур: массивы,записи и множества.$ОписаниеТипа = Идентификатор "=" Тип.$Тип = ПростойТип | ТипМассив | ТипЗапись$| ТипМножество | ТипУказатель | ТипПроцедура.$ПростойТип = КвалИдент | Перечисление$| ТипДиапазон.Примеры:цвет = (красный,зеленый,синий)Индекс = [1..80]Карта = ARRAY Индекс OF CHARУзел = RECORD ключ:CARDINAL;левый,правый:УкДереваENDОттенок = SET OF ЦветУкДерева = POINTER TOУзел Функция = PROCEDURE (CARDINAL)CARDINAL6.1. Основные типыСледующиеидентификаторами:основныетипыпредопределеныиобозначаютсястандартными1. INTEGER содержит целые числа в диапазоне от MIN(INTEGER) до MAX(INTEGER).2.
CARDINAL содержит целые числа в диапазоне от 0 до МАХ(CARDINAL).3. BOOLEAN содержит истинностные значения TRUE и FALSE.4. CHAR включает в себя набор литер, предоставляемый вычислительной системой.5. REAL (и LONGREAL) обозначает конечное множество действительных чисел.6. LONGINTMAX(LONGINT).содержитцелыечиславдиапазонеот MIN(LONGINT) до(* В разд. 29 основного текста упоминается также тип LONGCARD. - Прим.перев. *)6.2. ПеречисленияПеречисление представляет собой список идентификаторов, обозначающих значения,образующие тип данных. Эти идентификаторы используются в программе как константы.
Они, итолько они образуют соответствующий тип данных. Их значения упорядочены, и отношение144порядка определяется последовательностью идентификаторов в перечислении. Порядковый номерпервого значения равен О.$Перечислеление = "(" СписИдент ")" .$СписИдент = Идентификатор { "," Идентификатор } .Примеры перечислений:(красный, зеленый, синий)(трефы, бубны, червы, пики)(Понедельник, Вторник, Среда, Четверг,Пятница, Суббота, Воскресенье)6.3.
Тип диапазонТип Т может быть определен как диапазон другого типа Т1, основного или перечисления(за исключением REAL), путем указания наименьшего и наибольшего значения диапазона.$$ТипДиапазон = [Идентификатор]"[" КонстВыражение ".." КонстВыражение "]" . (!)Первая константа определяет нижнюю границу, и она не должна превышать верхнююграницу. Тип границ Т1 называется базовым типом для Т, и все операции, применимые коперандам типа Т1, применимы также к операндам типа Т.
Однако значение, присваиваемоепеременной типа диапазон, должно лежать внутри заданного отрезка. Базовый тип можетзадаваться идентификатором, предшествующим указанию границ. Если он опушен и нижняяграница - неотрицательное целое, базовым типом диапазона считается CARDINAL; если этоотрицательное целое, то INTEGER.Говорят, что тип T1 совместим с типом Т0, если либо он описан как Т1=Т0, либо какдиапазон Т0, либо если Т0 является диапазоном Т1, либо если и Т0, и Т1 - оба диапазоны одного итого же (базового) типа. Примеры типов диапазон:[0. .N-1]["A".."Z"][Понедельник.. Пятница]6.4.
Тип массивМассив - структура, состоящая из Фиксированного числа компонент одного типа,называемого типом компонент. Элементы массива обозначаются индексами, значения которыхпринадлежат типу индекса. Описание типа массив определяет тип компонент и тип индекса.Последний должен быть перечислением, типом диапазон или одним из основных типовBOOLEAN или CHAR.$ТипМассив = ARRAY ПростойТип {"," ПростойТип} OF Тип.Описание видаARRAY T1.T2, ...
, Tn OF Tс n типами индексов Т1 ... Тn можно рассматривать как сокращение описанияARRAY Т1 OF145ARRAY T2 OF….ARRAY Tn OF TПримеры типов массив:ARRAY [0..N-1] OF CARDINALARRAY [1..10],[1..20] OF [0..99]ARRAY [-10..+10] OF BOOLEANARRAY ДеньНедели OF ЦветARRAY Цвет OF ДеньНедели6.5. Тип записьТип запись - структура, состоящая из Фиксированного числа компонент, возможно,различных типов. Описание типа записи определяет для каждой компоненты ее Тип иидентификатор, обозначающий эту компоненту.
Областью видимости этих идентификаторовкомпонент является само определение записи; кроме того, они присутствуют внутри обозначений(см. п.8.1), ссылающихся на соответствующие, компоненты переменных данного типа запись, атакже внутри операторов присоединения.$ТипЗапись = RECORD ПослСписковКомпонент END .$ПослСписковКомпонент = СписокКомпонент${";" СписокКомпонент}.$СписокКомпонент = [СписИдент ":" Тип|$$$CASE [Идентификатор]":"КвалИдент OF Вариант{"|" Вариант }(!)[ELSE ПослСписковКомпонент] END].$Вариант = [СписокМетокВарианта ":"$ПослСписковКомпонент].(!)$$$СписокМетокВарианта = МеткиВарианта{"," МеткиВарианта}.МеткиВарианта=КонстВыражение [".."КонстВыражение].Примеры типов записи:RECORD день: [1..3];месяц:[1..12];год:[0..2000]146ENDRECORDимя,фамилия:ARRAY[0..9] OF CHAR;возраст:[0..99];зарплата:REALENDRECORD x,y:T0;CASE призн0:Цвет OFкрасный:а: Тк1;b: Тк2|зеленый:с:Тз1;d:Тз2|синий:e:Tcl;f:Тс2END;z.T0;CASE призн1:BOOLEAN OFTRUE:u,v:INTEGER |FALSE :r,s: CARDINALENDENDПриведенный выше пример содержит два вариантных списка компонент.
В первом случаевыбор варианта определяется значением компоненты призн0, стоящей в заголовке варианта иназываемой дискриминантом или селектором варианта. Во втором случае -дискриминантом призн1.6.6. Тип множествоТип множество, определенный как SET OF T, содержит все множества значений базовоготипа Т. Базовым типом должен быть либо диапазон целых между 0 и N-1, либо перечислимый тип(или его диапазон) не более чем с N значениями, где N - небольшая константа, определяемаяреализацией (обычно это размер машинного слова или его небольшое кратное).$ТипМножество = SET OF ПростойТип.Стандартный тип BITSET определяется следующим образом: BITSET=SET OF [0..W-l]Здесь W - константа, определяемая реализацией (обычно это размер машинного слова).1476.7. Тип указательПеременные типа указатель Р в качестве значений имеют указатели на переменные другоготипа Т. Говорят, что тип указатель Р подчинен Т.
Значение указателя Формируется при обращении кпроцедуре размещения в модуле управления памятью.$ТипУказатель = POINTER TO Тип.Помимо значений-указателей, переменная типа указатель может иметь значение NIL, неявляющееся указателем ни на какую переменную.6.8. Тип процедураПеременная Т типа процедура может своим значением иметь процедуру Р. Типыформальных параметров Р должны совпадать с типами, указанными в списке Формальных типовТ. Это же относится и к типу результата в случае процедуры-функции.
( Ограничение: Р не можетбыть локальной или стандартной процедурой.)$ТипПроцедура = PROCEDURE [СписокФормТипов] .$СписокФормТипов = "(" [[VAR] ФормТип${"," [VAR] ФормТип }] ")" [":" КвалИдент].Стандартный тип PROC обозначает процедуру без параметров: PROC » PROCEDURE7. ОПИСАНИЯ ПЕРЕМЕННЫХОписание переменной служит для введения переменной и связывания с ней уникальногоидентификатора, типа данных и структуры.
Всепеременные, перечисленные в одном списке, получают одинаковый тип.$ОписаниеПеременной = СписИдент ":" Тип.Тип данных определяет множество значений, которые может принимать переменная, иоперации, которые можно над ней выполнять. Кроме того, он определяет структуру переменной.Примеры описаний переменных (см. примеры в гл. 6):i,j: CARDINALk:INTEGERp,q: BOOLEANs:BITSETF:ФУНКЦИЯa:ARRAY Индекс OF CARDINALw:ARRAY [0..7]0FRECORD ch:CHAR;счетч:CARDINALEND1488. ВЫРАЖЕНИЯВыражения - конструкции, дающие правила вычислений для получения значенийпеременных и Формирования новых значений. Выражения состоят из операндов и знаковопераций.
Для группирования операндов и операций могут использоваться скобки.8.1. ОперандыЗа исключением литерных констант, т.е. чисел, цепочек и множеств (см. гл. 5), операндыпредставляются обозначениями. Обозначение состоит из идентификатора, ссылающегося наобозначаемую константу, переменную или процедуру. Этот идентификатор может бытьквалифицирован идентификатором модуля (см.
гл. 4 и 11) и за ним могут следовать селекторы,если обозначаемый объект -элемент структуры. Если структура - массив А, то обозначение А[Е]означает элемент А, индекс которого - текущее значение выражения Е. Тип индекса А долженбыть совместим по присваиванию с типом Е (см. п.9.1). Обозначение вида А[Е1,Е2,...,Еп] означает тоже, что и А[Е1][Е2]...[Еn].Если структура - запись R, то R.P обозначает компоненту f записи R. Обозначение P^используется для переменной, на которую ссылается указатель Р.$Обозначение = КвалИдент {"." Идентификатор |$"[" СписВыражений "]" | "^" }.$СписВыражений = Выражение {"," Выражение}.Если обозначаемый объект - переменная, то обозначение ссылается на текущее значениепеременной. Если объект -процедура-Функция, обозначение без списка параметров ссылается наэту процедуру.
Если за ним следует (возможно, пустой) список параметров, обозначениепредполагает активацию процедуры и в данной точке используется значение, являющеесярезультатом ее выполнения, т.е. "возвращаемое" значение. Типы Фактических параметров должнысоответствовать типам формальных параметров, специфицированным в описании процедуры (см.гл. 10). Примеры обозначений (см. примеры в гл. 7):k(INTEGER)a[i](CARDINAL)w[3].ch(CHAR)t^.ключ(CARDINAL)t^.левый ^. правый(УказВерш)8.2.