Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Вычисление ОПС для присваиваний и арифметических выражений с индексами

 

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

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

 

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

x a c d + *:=

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

Табл. 15

№ шага Входные символы Содержимое магазина
x a c d + * :=  
a c d + * := x  
c d + * := x a  
d + * := x a c  
+ * := x a c d  
* := x a c+d  
:= x a*(c+d)  
   

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

 

Выражения с индексами необходимы для доступа к элементам массивов. Для одномерного массива операция индексирования вычисляется следующим образом. Первый операнд такой операции – ссылка на таблицу переменных, где находится описание (паспорт) массива. В паспорте, в свою очередь, есть ссылка на расположение начального элемента массива с индексом 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

№ шага Входные символы Содержимое магазина
M i <i> a L i j d + <i2> * :=  
i <i> a L i j d + <i2> * := M  
<i> a L i j d + <i2> * := M i  
a L i j d + <i2> * := M[i]  
+ <i2> * := M[i] a L i j d  
<i2> * := M[i] a L i j+d  
* := M[i] a L[i, j+d]  
:= M[i] a*L[i, j + d]  
   
                     

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



<== предыдущая страница | следующая страница ==>
Генерация ОПС для арифметических выражений | Генерация ОПС для присваиваний и арифметических выражений с индексами

Дата добавления: 2015-07-26; просмотров: 130; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.