Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MетТЯПиМТ-ЛР-2010.doc
Скачиваний:
174
Добавлен:
19.03.2016
Размер:
814.08 Кб
Скачать

8.2.2 Структура машины

Машина состоит из области данных (таблицы переменных), кода и стека.

Область данных будет хранить все переменные, которые используются в программе и их типы.

Таблицу переменных для наглядности будем хранить в объекте sgData класса TStringGrid с двумя столбцами: имя и значение.

Стек будет использован в данном трансляторе только для хранения чисел, поэтому зададим его в качестве массива. Кроме того, необходимо определить способы работы со стеком.

var

stack:array [1..100] of real;

p_s:integer;

function pop:real;

begin

result:=stack[p_s];

dec(p_s);

end;

procedure push(value:real);

begin

inc(p_s);

stack[p_s]:=value;

end;

Машина, работающая с языком арифметических выражений, будет иметь следующие команды.

ldc (value) – поместить в стек константу (число), передаваемую в качестве параметра.

procedure ldc(value:real);

begin

push(value);

end;

ldv (value) – поместить в стек значение переменной, передаваемой в качестве параметра. Эта команда производит поиск по таблице переменных, если переменная присутствует в таблице, то в стек помещается ее значение. Если переменная не найдена, то порождается ошибочная ситуация.

procedure ldv(value:string);

var i:integer; f:boolean;

begin

i:=0; f:=true;

while (i<sgData.RowCount) and f do

begin

if sgData.cells[0,i]=value

then

begin

push(strtofloat(sgData.cells[1,i]));

f:=false;

end

else inc(i);

end;

if f

then raise exception.Create('Неизвестный идентификатор');

end;

add – сложение.

sub – вычитание.

mult – умножение.

div – деление.

Операции арифметических действий выполняются одинаково. Они заключаются в чтении из стека двух значений, выполнения операции и записи результата в стек. Приведем в качестве примере процедуру для выполнения вычитания.

procedure TForm1.sub;

var a1,a2:real;

begin

a1:=pop; a2:=pop;

push(a2-a1)

end;

assignment(value) – присвоение значения переменной, полученной в качестве параметра. Эта команда читает значение из стека и записывает прочитанную величину в качестве значения переменной в таблицу переменных.

procedure assignment(value:string);

var i:integer; f:boolean;

begin

i:=0; f:=true;

while (i<sgData.RowCount) and f do

begin

if sgData.cells[0,i]=value

then

begin

sgData.cells[1,i]:=floattostr(pop);

f:=false;

end

else inc(i);

end;

if f

then raise exception.Create('Неизвестный идентификатор')

end;

read(value) – чтение значения переменной, передаваемой в качестве параметра. Для реализации такого диалога с пользователем будем использовать объект класса Tform, создаваемый при необходимости ввода и разрушаемый после ввода. На такой форме будут помещаться объекты класса TLabel для вывода имени переменной и класса TEdit для ввода пользователем значения переменной. Если переменной, значение которой необходимо вести нет в таблице переменных, то порождается ошибочная ситуация.

procedure read;

var form:Tform; edit:Tedit; label1:Tlabel;

i:integer; f:boolean;

begin

i:=0; f:=true;

while (i<sgData.RowCount) and f do

begin

if sgData.cells[0,i]=value

then

begin

push(strtofloat(sgData.cells[1,i]));

f:=false;

end

else inc(i);

end;

if f

then raise exception.Create('Неизвестный идентификатор')

else

begin

form:=tform.Create(application);

edit:=tedit.Create(form);

edit.Parent:=form;

edit.top:=20;

label1:=tlabel.Create(form);

label1.Parent:=form;

label1.caption:=sgData.Cells[0,i];

form.ShowModal;

sgData.Cells[1,i]:=edit.text;

form.Destroy;

end;

end;

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