ПрограмматАУраспознаватель арифметических выражений

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



В результате работы была разработана программа, реализующая алгоритм разбора арифметического выражения, используя классические конструкции обратной польской нотации. Данная программа демонстрирует правила разбора выражения при помощи построения дерева разбора, с последующим вычислением выражения с выводом промежуточных результатов. Тестирование программы показало правильность её работы, а простота интерфейса - даёт удобство в использовании.

В процессе работы над программой мною были изучены следующие темы:

Правила создания бинарных деревьев.

Правила преобразования инфиксной записи в польскую обратную нотацию.

Литература

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   рубрикатор по предметам  рубрикатор по типам работ  пользовательское соглашение