- •Часть V. Проектирование программ в o Pascal.
- •19. Составные типы данных в o Pascal.
- •19.1. Массивы.
- •Design Part 1
- •19.1.1. Синтаксис и семантика для массивов.
- •19.1.2. Параметры-массивы.
- •19.2. Реализация абстрактных типов данных с помощью массивов.
- •19.2.1. Текстовые файлы ограниченного размера.
- •19.2.1. Стек ограниченного размера.
19.1.1. Синтаксис и семантика для массивов.
Следующие синтаксические правила описывают тип данных массив.
<составной тип> ::= <неупакованный структурированный тип>
<неупакованный структурированный тип> ::= SET OF <базовый тип>
| FILE OF <тип компонентов>
| RECORD <список полей> END
| ARRAY [<список индексного типа>] OF <тип компонентов>
<список индексного типа> ::= <список индексного типа>, порядковый тип
| <порядковый тип>
Поскольку значения массивов могут использоваться как другие переменные, определение <переменной> должно быть расширено, чтобы включить их.
<переменная> ::= <идентификатор переменной> | <переменная буфера>
| <переменная-компонент>
<переменная-компонент> ::= <описатель поля> | <индексированная переменная>
<индексированная переменная> ::= <переменная массива> [<список выражений>]
<переменная массива> ::= <переменная>
<список выражений> ::= <список выражений>, <выражение> | <выражение>
Формально, значения соответствующие переменным массивов в состоянии выполнения являются отношениями. В парах отношения массив-значения первые элементы принадлежат конечному множеству значений индексного типа, а вторые элементы множеству значений типа компонентов. Таким образом, количество возможных значений переменой массива велико. Каждый индекс может находится в паре с любым из возможных значений компонента, так что для N индексов и M возможных значений компонентов, массив может иметь MN значений, каждое из которых представляет из себя соответствие значений индексам. Например, переменная:
VAR
Carray: ARRAY [1..3] OF CHAR;
имеет 1283 ~ 2 100 000 возможных значений для Паскаль-машины со 128 символьными значениями, одним из которых будет {<1, X>, <2, B>, <3, 3>}. Это значение может быть результатом присваивания:
CArray[1] := ‘X’;
CArray[2] := ‘B’;
CArray[3] := ‘3’;
Раз каждый индекс в массиве имеет присвоенный ему компонент, значение массива должно быть функцией. Однако, до тех пор пока индекс остается несвязанным, эта часть массива подобна неинициализированной переменной. Например, если к CArray были применены только первое и третье присваивания, его значение будет:
{<1, X>, <3, 3>}{ <2, c>: c - символ},
которое мы обычно сокращаем до
{<1, X>, <3, 3> <2, ?> }.
Эти значения могут появляться в состоянии выполнения с идентификатором массива.
S = {CArray{<1, X>, <3, 3> <2, ?> }, ...}
Значение <индексированной переменной> может быть получено может быть получено из значения соответствующего массива. Например для приведенного выше состояния S:
CArray[1](S) = X
В общем, для идентификатора массива A и индекса I, где I принадлежит типу J:
A[I] = {<s, v>: s(I) является значением типа J, v = (s(A))(s(I))}
Определение присваивания (раздел 6.2.1) применимо к массивам без изменений, но не покрывает случай, где элемент массива находится в левой части присваивания. В этом случае присваивание завершается с ошибкой, если значение индекс не является допустимым значением соответствующего типа. Формально, для индекса I типа J:
A[I] := E = {<s, t>: I(s) является значением типа J, t =s,
за исключением того, что A[I](t)=E(s)}
Во всех других случаях значение выражения становится присоединенным к идентификатору в левой части в состоянии выполнения после выполнения оператора.
Когда оператор присваивания присваивает один идентификатор массива другому идентификатору, его значением становится отношение, представляющее значение массива в целом.
