ПрограмматАУраспознаватель арифметических выражений
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
В результате работы была разработана программа, реализующая алгоритм разбора арифметического выражения, используя классические конструкции обратной польской нотации. Данная программа демонстрирует правила разбора выражения при помощи построения дерева разбора, с последующим вычислением выражения с выводом промежуточных результатов. Тестирование программы показало правильность её работы, а простота интерфейса - даёт удобство в использовании.
В процессе работы над программой мною были изучены следующие темы:
Правила создания бинарных деревьев.
Правила преобразования инфиксной записи в польскую обратную нотацию.
Литература
1.А. В. Ахо, Р. Сети, Д. Д. Ульман. Компиляторы: принципы, технологии и инструменты. М.: Вильямс, 2003.
2.Компаниец Р.И. и др. Системное программирование.Основы построения трансляторов.- СПб.: КОРОНА принт, 2000.-256 с.
3.Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Основы построения трансляторов. -СПб.: КОРОНА принт, 2000. -256 с.
4.Хантер Р. Проектирование и конструирование компиляторов. М.: Финансы и статистика. 1984 г.
.Грис Д. Конструирование компиляторов для цифровых вычислительных машин. М.: Мир,1975 г.
.Иртегов Д. Введение в операционные системы. Учебное пособие. - СПб.: БХВ-Петербург, 2002. - 624 с.
.Молчанов А.Ю. Системное программное обеспечение. Лабораторный практкум.- СПб.: Питер, 2005.- 284 с.
.Юров В.И. Assembler. Учебник для вузов. 2-е издание - СПб.: Питер.- 2004.- 637 с.
.Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное программирование: Основы построения трансляторов + FD.- М.: КОРОНА принт.- 2004.- 255 с.
.Молчанов А.Ю. Системное программное обеспечение. Лабораторный практикум. - СПб.: Питер, 2005. - 284 с.
.Юров В.И. Assembler. Учебник для вузов. 2-е изд. - СПб: Питер, 2004. - 637 с.
.Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции. - М.:Мир, 1978. - Т.1, 612 с. Т. 2, 487 с.
.Ахо А.,Сети Р., Ульман Дж. Компиляторы: принципы, технологии и инструменты: Пер. с англ. - М.: Издательский дом Вильямс, 2003. - 768 с.
.Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. - СПб.: Питер, 2002. - 734 с.
.Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное программирование. Основы построения трансляторов: Учебное пособие для высших средних учебных заведений. - СПб:КОРОНА принт, 2000. - 256 с.
.Гордеев А.В. Опреационные системы: Учебник для вузов. 2-е изд. - СПб.: Питер, 2004. - 416 с.
Приложение
Листинг программыUnit1;
interface
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, math;
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Memo2: TMemo;
Label3: TLabel;
Button2: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Form1: TForm1;
st,op1,op2:string;
mtxi,mtxpr:integer;
mtx:array of string;
{$R *.dfm}is_num(a:string):boolean;
if ((a='"') or (a='0') or (a='1') or (a='2') or (a='3') or (a='4') or (a='5') or (a='6') or (a='7') or (a='8') or (a='9'))
then is_num:=true
else is_num:=false;;
TForm1.Button1Click(Sender: TObject);i,j,fl,m,l:integer;:string;:=form1.Edit1.Text;:=0;
memo1.Lines.Add('');
fl:=1;
if (pos('^',st)>0) then
begin
fl:=0;
memo1.Lines[m]:=memo1.Lines[m]+'^ ';
i:=pos('^',st);
j:=i+1;
i:=i-1;
ss:='';
while is_num(st[i]) do
begin
ss:=ss+st[i];
i:=i-1;
end;
for l:=length(ss) downto 0 do memo1.Lines[m]:=memo1.Lines[m]+ss[l];
memo1.Lines[m]:=memo1.Lines[m]+' ';
while is_num(st[j]) do
begin
memo1.Lines[m]:=memo1.Lines[m]+st[j];
j:=j+1;
end;
delete(st,i+1,j-i-1);
insert('"'+inttostr(m)+'"',st,i+1);
edit1.text:=st;
m:=m+1;
end;fl=1;
memo1.Lines.Add('');
fl:=1;
if (pos('*',st)>0) then
begin
fl:=0;
memo1.Lines[m]:=memo1.Lines[m]+'* ';
i:=pos('*',st);
j:=i+1;
i:=i-1;
ss:='';
while is_num(st[i]) do
begin
ss:=ss+st[i];
i:=i-1;
end;
for l:=length(ss) downto 0 do memo1.Lines[m]:=memo1.Lines[m]+ss[l];
memo1.Lines[m]:=memo1.Lines[m]+' ';
while is_num(st[j]) do
begin
memo1.Lines[m]:=memo1.Lines[m]+st[j];
j:=j+1;
end;
delete(st,i+1,j-i-1);
insert('"'+inttostr(m)+'"',st,i+1);
edit1.text:=st;
m:=m+1;
end;fl=1;
memo1.Lines.Add('');
fl:=1;
if (pos('/',st)>0) then
begin
fl:=0;
memo1.Lines[m]:=memo1.Lines[m]+'/ ';
i:=pos('/',st);
j:=i+1;
i:=i-1;
ss:='';
while is_num(st[i]) do
begin
ss:=ss+st[i];
i:=i-1;
end;
for l:=length(ss) downto 0 do memo1.Lines[m]:=memo1.Lines[m]+ss[l];
memo1.Lines[m]:=memo1.Lines[m]+' ';
while is_num(st[j]) do
begin
memo1.Lines[m]:=memo1.Lines[m]+st[j];
j:=j+1;
end;
delete(st,i+1,j-i-1);
insert('"'+inttostr(m)+'"',st,i+1);
edit1.text:=st;
m:=m+1;
end;fl=1;
memo1.Lines.Add('');
fl:=1;
if (pos('+',st)>0) then
begin
fl:=0;
memo1.Lines[m]:=memo1.Lines[m]+'+ ';
i:=pos('+',st);
j:=i+1;
i:=i-1;
ss:='';
while is_num(st[i]) do
begin
ss:=ss+st[i];
i:=i-1;
end;
for l:=length(ss) downto 0 do memo1.Lines[m]:=memo1.Lines[m]+ss[l];
memo1.Lines[m]:=memo1.Lines[m]+' ';
while is_num(st[j]) do
begin
memo1.Lines[m]:=memo1.Lines[m]+st[j];
j:=j+1;
end;
delete(st,i+1,j-i-1);
insert('"'+inttostr(m)+'"',st,i+1);
edit1.text:=st;
m:=m+1;
end;fl=1;
memo1.Lines.Add('');
fl:=1;
if (pos('-',st)>0) then
begin
fl:=0;
memo1.Lines[m]:=memo1.Lines[m]+'- ';
i:=pos('-',st);
j:=i+1;
i:=i-1;
ss:='';
while is_num(st[i]) do
begin
ss:=ss+st[i];
i:=i-1;
end;
for l:=length(ss) downto 0 do memo1.Lines[m]:=memo1.Lines[m]+ss[l];
memo1.Lines[m]:=memo1.Lines[m]+' ';
while is_num(st[j]) do
begin
memo1.Lines[m]:=memo1.Lines[m]+st[j];
j:=j+1;
end;
delete(st,i+1,j-i-1);
insert('"'+inttostr(m)+'"',st,i+1);
edit1.text:=st;
m:=m+1;
end;fl=1;
memo1.Lines[memo1.Lines.Count-1]='' do
memo1.Lines.Delete(memo1.Lines.Count-1);
.Lines:=memo1.Lines;
i:=0 to memo2.Lines.Count do
if ((length(memo1.Lines[i])<>0)) then
st:=memo1.Lines[i];
case st[1] of
'^':begin
delete(st,1,2);
if (st[1]='"') then
begin
op1:=memo2.Lines[strtoint(st[2])];
delete(st,1,4);
end
else
begin
op1:=copy(st,1,pos(' ',st));
delete(st,1,pos(' ',st));
end;
if (st[1]='"') then
begin
op2:=st[2]; memo2.Lines[strtoint(st[2])];
edit2.text:=op2;
end
else
begin
op2:=st;
end;
memo2.Lines[i]:=floattostr(Power(strtofloat(op1),strtofloat(op2)));
end;
'*':begin
delete(st,1,2);
if (st[1]='"') then
beg
Copyright © 2008-2014 geum.ru рубрикатор по предметам рубрикатор по типам работ пользовательское соглашение