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

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)}

Во всех других случаях значение выражения становится присоединенным к идентификатору в левой части в состоянии выполнения после выполнения оператора.

Когда оператор присваивания присваивает один идентификатор массива другому идентификатору, его значением становится отношение, представляющее значение массива в целом.

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