- •Оглавление
- •1. Теоретическая часть .1 История разработки вопроса разбора математических выражений
- •.2 Обратная польская нотация
- •.3 Вычисления на стеке
- •.4 Преобразование из инфиксной нотации
- •2. Практическая часть .1 Постановке задачи
- •.2 Описание входного языка
- •Программа распознаватель арифметический выражение
- •2.3 Описание выходной информации
- •.4 Алгоритмические аспекты программы
- •2.5 Алгоритм программы
- •2.7 Работа с программой
- •Заключение
- •Литература
- •Приложение
Литература
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
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(strtofloat(op1)*strtofloat(op2));
end;
'+':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:=memo2.Lines[strtoint(st[2])]; memo2.Lines[strtoint(st[2])];
end
else
begin
op2:=st;
end;
memo2.Lines[i]:=floattostr(strtofloat(op1)+strtofloat(op2));
end;
end;
edit2.text:=memo2.Lines[memo2.Lines.count-1];;
;
TForm1.Button2Click(Sender: TObject);.Text:='';.Text:='';.Lines.Clear;.Lines.Clear;
end;
.
