Курсовая работа: Розробка компілятора з вхідної мови програмування
2.1.2. Розроблено синтаксичний аналізатор на основі автомата з магазинною пам’яттю. Складено таблицю переходів для даного автомата згідно правил записаних в нотації у формі Бекуса-Наура.
2.1.3. Розроблено генератор коду, який починає свою роботу після того, як лексичним, синтаксичним та семантичним аналізатором не було виявлено помилок у програмі, написаній мовою М13. Проміжним кодом генератора є програма на мові Assembler(i8086). Вихідним кодом є машинний код, що міститься у виконуваному файлі
3. Проведене тестування компілятора за допомогою тестових програм за наступними пунктами:
3.1.1. Виявлення лексичних помилок.
3.1.2. Виявлення синтаксичних помилок.
3.1.3. Загальна перевірка роботи компілятора.
Тестування не виявило помилок в роботі компілятора, а всі помилки в тестових програмах мовою М13 були виявлені і дано попередження про їх наявність.
В результаті виконання даної курсової роботи було успішно засвоєно методи розробки та реалізації компонент системного програмного забезпечення.
Список використаної літератури
1. Бек Л.С. Введение в системное програмирование. – М.:Мир, 1988.
2. Касаткин М.В. Касаткина Т.Я. Професиональное програмирование на языке С.В 3т. – М. Мир, 1989.//т.3. Системное програмирование.
3. Кузьмин А.Я. Лексический анализ. – М.:ВШ.,1985.
4. Фролов А.В. Проэктирование компиляторов. –М.: Мир,1989.
5. Страуструп Б. Введение в язык C++, 2001.
6. Ахо А., Сети Р., Ульман Дж.Компиляторы: принципы, технологии, инструменты. – М.: Издательский дом «Вильямс», 2003.
7. Джордейн Р. Справочник программиста ПК IBM PC, XT/AT. – М.: ФиС, 1992.
8. Абель П. Ассемблер для IBM PC, 1991.
9. Прата С. Язык программирования Си, 2003
Додатки
Додаток A
№ | A | B | C | D |
13 | 1 (byte) | ^ | NOT | while-do |
program TFirst;
uses App,dialogs,drivers,menus,objects,stddlg,views,validate;
type TMyApp=object(TApplication)
procedure InitStatusLine; virtual;
procedure InitMenuBar; virtual;
procedure NewWindow; virtual;
procedure HandleEvent(var Event:TEvent);virtual;
procedure NewDialog;virtual;
{procedure Init;virtual;}
end;
DialogData=record
{CheckBoxData:Word;
RadioButtonData:word;}
InputLineData:string[128];
end;
MyStruct=record
b:integer;
b1:integer;
c:string[32];
end;
PM13Window=^TM13Window;
TM13Window=object(TWindow)
constructor Init(Bounds:TRect;
WinTitle:string;WindowNo:Word);
procedure MakeInterior(Bounds:TRect);
end;
var M13DialogData:DialogData;
s1:string;
const
MaxLines=2000;
var LineCount:integer;
Lines:array [0..MaxLines-1]of PString;
type
PInterior=^TInterior;
TInterior=object(Tscroller)
constructor Init(var Bounds:TRect;AHScrollBar,
AVScrollBar:PScrollBar);
procedure Draw;virtual;
end;
const cmNewWin=199;cmFileOpen=200;WinCount:Integer=0;cmCompile=201;
procedure TMyApp.InitStatusLine;
var r:TRect;
begin
{GetExtent(r);}
r.a.y:=r.b.y+1;
StatusLine:=New(PStatusLine,Init(r,
NewStatusDef(0,$ffff,
NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
NewStatusKey('~Alt-F4~ New', kbF4, cmNewWin,
NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
NewStatusKey( '',kbF10, cmMenu,
nil)))),
nil)));
end;
procedure TMyApp.InitMenuBar;
var r:TRect;
begin
GetExtent(r);
r.b.y:=r.a.y+1;
MenuBar:=New(PMenuBar, Init(r, NewMenu(
NewSubMenu('~F~ile', hcNoContext, NewMenu(
NewItem('~O~pen', 'F3',kbF3,cmFileOpen, hcNoContext,
NewItem('~N~ew', 'F4',kbF4,cmNewWin, hcNoContext,
NewLine(
NewItem('E~x~it', 'Alt-x', kbAltX, cmQuit, hcNoContext,
nil))))),
NewSubMenu('~W~indow', hcNoContext, NewMenu(
NewItem('~N~ext', 'F6',kbF6,cmNext, hcNoContext,
NewItem('~Z~oom', 'F5',kbF5,cmZoom, hcNoContext,
nil))),
NewSubMenu('~C~ompile', hcNoContext, NewMenu(
NewItem('~C~ompile','Alt-F9',kbAltF9,cmCompile,hcNoContext,
nil)),
nil
))))));end;
procedure TMyApp.NewWindow;
var Window:PM13Window;
r:TRect;
i:integer;
begin
i:=0;
inc(WinCount);
r.assign(0,0,80,23-wincount+1);
r.move(0,i+wincount-1);
window:=new(pM13window, init(r, 'Compile window', wincount));
desktop^.insert(window);
end;
procedure TMyApp.NewDialog;
var
Dialog:PDialog;
R:TRect;
control:Word;
B:PView;
Window:PM13Window;
i:integer;
f:text;
s:string;
begin
R.Assign(20,6,60,19);
Dialog:=New(PDialog,Init(R,'M13 Dialog'));
with Dialog^ do
begin
R.Assign(15,10,25,12);
Insert(New(PButton,Init(R,'~O~K',cmOK,bfDefault)));
R.Assign(28,10,38,12);
Insert(New(PButton,Init(R,'Cancel',cmCancel,bfNormal)));
R.Assign(3,8,37,9);
B:=New(PInputLine,Init(r,128));
insert(b);
R.Assign(2,7,24,8);
insert(New(PLabel,Init(R,'Delivery instructions',B)));
end;
Dialog^.SetData(M13DialogData);
Control:=DeskTop^.ExecView(Dialog);
if Control<>cmCancel then Dialog^.GetData(M13DialogData);
i:=0;
while M13DialogData.InputLineData[i]<>'.' do
begin
s[i]:=M13DialogData.InputLineData[i];
i:=i+1;
end;
s[i]:=M13DialogData.InputLineData[i];
s[i+1]:=M13DialogData.InputLineData[i+1];
s[i+2]:=M13DialogData.InputLineData[i+2];
s[i+3]:=M13DialogData.InputLineData[i+3];
s1:=s;
LineCount:=0;
Assign(F,s);
reset(F);
while not Eof(F) and (LineCount<MaxLines)do
begin
readln(f,s);
lines[linecount]:=newstr(s);
inc(linecount);
{writeln(lines[linecount]^);}
end;
close(F);
i:=0;
inc(WinCount);
r.assign(0,0,80,23-wincount+1);
r.move(0,i+wincount-1);
window:=new(pM13window, init(r, s1, wincount));
desktop^.insert(window);
end;
function vuraz(var s:char):integer;
var
w:integer;
begin
if ((integer(s)>=97)and(integer(s)<=122))or((integer(s)>=65)and(integer(s)<=90))
then vuraz:=30
else vuraz:=29;
end;
procedure Compiles;
label aa;
var a1:array [1..100] of MyStruct;
i,j,j1,k,kk,i1,i2,var_kil,begin_kil,end_kil,var_index,begin_index,end_index:integer;
q,q1:string;
ss:array [1..50] of string[50];
f1,f2,f3,f4:text;
ch,ch1:char;
mn:string;
m,nerivne,m1,pa:integer;
begin
assign(f1,s1);
reset(f1);
i:=0;j:=0;
while s1[i]<>'.' do
begin
q[j]:=s1[i];q1[i]:=s1[i];
i:=i+1;j:=j+1;
end;
q[j]:=s1[i];j:=j+1;q[j]:='t';j:=j+1;q[j]:='x';j:=j+1;q[j]:='t';
q1[i]:=s1[i];q1[i+1]:='a';q1[i+2]:='s';q1[i+3]:='m';
for i:=1 to 100 do
a1[i].b:=0;
i1:=1;
assign(f2,q);
Rewrite(f2);
assign(f3,q1);
rewrite(f3);
j1:=1;k:=0;i:=1;
j:=1;
while not EOF(f1) do
begin
readln(f1,ss[j]);
a1[i].c[1]:=ss[j][1];j1:=2;ch1:=ss[j][1];
i2:=2;
while ss[j][i2]<>#0 do
begin
if (ss[j][i2]=' ')or(ss[j][i2]=';')or(ss[j][i2]='+')or(ss[j][i2]='-')or(ss[j][i2]='*')
or (ss[j][i2]='.')or(ss[j][i2]='/')or(ss[j][i2]=')')or(ss[j][i2]='(')or(ss[j][i2]=',')or(ss[j][i2]=':')
or(ss[j][i2]='=')or(ss[j][i2]='>')or(ss[j][i2]='<')or((ss[j][i2]='<')and(ss[j][i2]='>'))
or ((ss[j][i2]='=')and(ss[j][i2]='='))or(ss[j][i2]='^')
then begin
if (ch1=' ')or(ch1=';')or(ch1='+')or(ch1='-')or(ch1='*')
or (ch1='.')or(ch1='/')or(ch1=')')or(ch1='(')or(ch1=',')or(ch1=':')or(ch1='=')
or(ch1='>')or(ch1='<')or((ch1='<')and(ch1='>'))
or ((ch1='=')and(ch1='='))or(ch1='^')
then begin i:=i+1;end