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

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

Присваивание можно определить как операцию, у которой первый операнд должен быть переменной, а второй – арифметическим выражением. При этом значение переменной хранится в некоторой области памяти (например, в таблице переменных), а результатом операции должно быть изменение этого значения. В отличие от других операций, после вычисления операции присваивания результат операции не должен сохраняться в магазине, т.е. магазин будет пустым.

Чтобы интерпретатор правильно вычислял как арифметические операции, так и операцию присваивания, для каждой ячейки магазина требуется хранить признак, указывающий, что в ней хранится – переменная или значение. Если на вход интерпретатора поступает операнд-константа, то должно записываться значение, а если переменная – то ссылка на ее размещение (например, на таблицу переменных). При поступлении на вход интерпретатора этот признак должен учитываться, и значения для операции должны либо извлекаться из магазина, либо по ссылке из таблицы переменных.

Пример 12. Дано присваивание x := a*(c + d). ОПС для него:

x a c d + *:=

В табл. 15 приведены шаги алгоритма вычисления ОПС.

Табл. 15

шага

Входные

символы

Содержимое

магазина

1

x a c d + * :=

2

a c d + * :=

x

3

c d + * :=

x

a

4

d + * :=

x

a

c

5

+ * :=

x

a

c

d

6

* :=

x

a

c+d

7

 :=

x

a*(c+d)

8

Конец примера.

Выражения с индексами необходимы для доступа к элементам массивов. Для одномерного массива операция индексирования вычисляется следующим образом. Первый операнд такой операции – ссылка на таблицу переменных, где находится описание (паспорт) массива. В паспорте, в свою очередь, есть ссылка на расположение начального элемента массива с индексом 0, количество элементов, длина или тип каждого элемента. Второй операнд операции индексирования – значение индекса. Результатом операции является ссылка на индексируемый элемент массива. При этом вычисление ведется по формуле:

M + d*i,

где M – ссылка на элемент массива с индексом 0, d – длина элемента массива, i – значение индекса.

Для двумерного массива операция индексирования требует трех операндов: 1) ссылка на паспорт массива, 2) значение индекса по первому измерению, 3) значение индекса по второму измерению. При этом вычисление ведется по формуле:

M + d*(i*m + j),

где M – ссылка на элемент массива с индексом 0, d – длина элемента массива, m – количество элементов в массиве по второму измерению, i , j – значения индексов по первому и второму измерению соответственно.

По аналогичным формулам проводится вычисление в операции индексирования по трем и более индексам. Далее в примерах операцию индексирования по одному индексу будем обозначать <i>, а индексирование по двум индексам – <i2>.

При выполнении операции индексирования перед вычислением ссылки на индексируемый элемент массива можно выполнить проверку корректности индексов, и при выходе их за пределы массива останавливать вычисления с сигнализацией ошибки.

Пример 13. Дано присваивание с индексацией M[i] := a*L[i, j + d]. ОПС для него:

M i <i> a L i j d + <i2> * :=

В табл. 16 приведены шаги алгоритма вычисления ОПС. Для сокращения таблицы шаги 5 – 8 в ней пропущены.

Табл. 16

шага

Входные

символы

Содержимое

магазина

1

M i <i> a L i j d + <i2> * :=

2

i <i> a L i j d + <i2> * :=

M

3

<i> a L i j d + <i2> * :=

M

i

4

a L i j d + <i2> * :=

M[i]

9

+ <i2> * :=

M[i]

a

L

i

j

d

10

<i2> * :=

M[i]

a

L

i

j+d

11

* :=

M[i]

a

L[i, j+d]

12

:=

M[i]

a*L[i, j + d]

13

Конец примера.