Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Список використаної літературиСодержание книги Поиск на нашем сайте
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
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 else begin a1[i].c[j1]:=#0;i:=i+1;end; ch1:=ss[j][i2]; a1[i].c[1]:=ss[j][i2];a1[i].c[2]:=#0;i:=i+1;j1:=1; end else begin a1[i].c[j1]:=ss[j][i2];j1:=j1+1;ch1:=ss[j][i2];end; i2:=i2+1; end; j:=j+1; end; k:=i-1; for i:=1 to k do begin if ((a1[i].c[1]='p')and(a1[i].c[2]='r')and(a1[i].c[3]='o')and(a1[i].c[4]='g') and(a1[i].c[5]='r')and(a1[i].c[6]='a')and(a1[i].c[7]='m'))then a1[i].b:=1; if ((a1[i].c[1]='v')and(a1[i].c[2]='a')and(a1[i].c[3]='r'))then a1[i].b:=2; if ((a1[i].c[1]='b')and(a1[i].c[2]='y')and(a1[i].c[3]='t')and(a1[i].c[4]='e'))then a1[i].b:=3; if ((a1[i].c[1]='c')and(a1[i].c[2]='h')and(a1[i].c[3]='a')and(a1[i].c[4]='r'))then a1[i].b:=4; if ((a1[i].c[1]='b')and(a1[i].c[2]='o')and(a1[i].c[3]='o')and(a1[i].c[4]='l') and(a1[i].c[5]='e')and(a1[i].c[6]='a')and(a1[i].c[7]='n'))then a1[i].b:=5; if ((a1[i].c[1]='b')and(a1[i].c[2]='e')and(a1[i].c[3]='g')and(a1[i].c[4]='i') and(a1[i].c[5]='n'))then a1[i].b:=7; if ((a1[i].c[1]='w')and(a1[i].c[2]='r')and(a1[i].c[3]='i')and(a1[i].c[4]='t') and(a1[i].c[5]='e')and(a1[i].c[6]='l')and(a1[i].c[7]='n'))then a1[i].b:=8; if ((a1[i].c[1]='r')and(a1[i].c[2]='e')and(a1[i].c[3]='a')and(a1[i].c[4]='d') and(a1[i].c[5]='l')and(a1[i].c[6]='n'))then a1[i].b:=9; if ((a1[i].c[1]='e')and(a1[i].c[2]='n')and(a1[i].c[3]='d'))then a1[i].b:=15; if (a1[i].c[1]=';')then a1[i].b:=16; if (a1[i].c[1]=',')then a1[i].b:=17; if (a1[i].c[1]='(')then a1[i].b:=18; if (a1[i].c[1]=')')then a1[i].b:=19; if (a1[i].c[1]='*')then a1[i].b:=20; if (a1[i].c[1]='+')then a1[i].b:=21; if (a1[i].c[1]='-')then a1[i].b:=22; if (a1[i].c[1]='/')then a1[i].b:=23; if (a1[i].c[1]=' ')then a1[i].b:=24; if (a1[i].c[1]='\n')then a1[i].b:=25; if (a1[i].c[1]=':')then a1[i].b:=26; if (a1[i].c[1]='=')then a1[i].b:=27; if (a1[i].c[1]='.')then a1[i].b:=28; if (a1[i].c[1]='>')then a1[i].b:=29; if (a1[i].c[1]='<')then a1[i].b:=30; if ((a1[i].c[1]='!')and(a1[i].c[1]='=')) then a1[i].b:=31; if ((a1[i].c[1]='=')and(a1[i].c[1]='=')) then a1[i].b:=32; if (a1[i].c[1]='^')then a1[i].b:=33; if ((a1[i].c[1]='N')and(a1[i].c[2]='O') and(a1[i].c[3]='T'))then a1[i].b:=34; end; for i:=0 to k do if a1[i].b=0 then a1[i].b:=vuraz(a1[i].c[1]); var_kil:=0;begin_kil:=0;end_kil:=0; for i:=1 to k do begin if a1[i].b=2 then var_kil:=var_kil+1; if a1[i].b=7 then begin_kil:=begin_kil+1; if a1[i].b=15 then end_kil:=end_kil+1; end; for i:=1 to k do begin writeln(f2,a1[i].b); end; if var_kil>1 then writeln(f2,'Error 1: Декiлька разiв вiдбуваеться опис даних'); if begin_kil>1 then writeln(f2,'Error 2: Декiлька разiв введено слово begin'); if end_kil>1 then writeln(f2,'Error 3: Декiлька разiв введено слово end'); if var_kil=0 then writeln(f2,'Error 4: Немає опису даних'); if begin_kil=0 then writeln(f2,'Error 5: Немає початку тiла програми'); if end_kil=0 then writeln(f2,'Error 6: Немає кiнця тiла програми'); if nevid=0 then writeln(f2,'Error 18: Невідома змінна:',k); var_index:=0;begin_index:=0;end_index:=0; for i:=1 to k do begin if a1[i].b=2 then var_index:=i; if a1[i].b=7 then begin_index:=i; if a1[i].b=15 then end_index:=i; end; for i:=var_index to begin_index do begin if a1[i].b=3 then begin if a1[i-1].b<>26 then writeln(f2,'Error 7: Пропущено-: при описi змiнних типу Byte'); j:=i-2; while a1[j].b<>16 do begin if a1[j].b=30 then a1[j].b:=35; j:=j-1; end; end; if a1[i].b=4 then begin if a1[i-1].b<>26then writeln(f2,'Error 7: Пропущено-: при описi змiнних типу Char'); j:=i-2; while a1[j].b<>26 do begin if a1[j].b=30 then a1[j].b:=36; j:=j-1; end; end; if a1[i].b=5 then begin if a1[i-1].b<>16then writeln(f2,'Error 7: Пропущено-: при описi змiнних типу Boolean'); j:=i-2; while a1[j].b<>16 do begin if a1[j].b=30 then a1[j].b:=37; j:=j-1; end; end; end; assign(f4,'1.M13'); reset(f4); readln(f4,mn); writeln(f3,'ideal'); writeln(f3,'model small'); writeln(f3,'stack 256'); writeln(f3,'dataseg'); writeln(f3,'perkur db ',mn,'$',mn); writeln(f3,'TrueStr db ',mn,'TRUE$',mn); writeln(f3,'FalseStr db ',mn,'False$',mn); writeln(f3,'InString db 255 DUP(?)'); writeln(f3,'OutString db 255 DUP(?)'); writeln(f3,'CharStr db 2,5 DUP(?)'); writeln(f3,'len dw?'); for i:=var_index+1 to begin_index do begin if a1[i].b=31 then begin j:=1; while a1[i].c[j]<>#0 do begin write(f3,a1[i].c[j]); j:=j+1; end; writeln(f3,' dw?'); end; if a1[i].b=32 then begin j:=1; while a1[i].c[j]<>#0 do begin write(f3,a1[i].c[j]); j:=j+1; end; writeln(f3,' db?'); end; if a1[i].b=33 then begin j:=1; while a1[i].c[j]<>#0 do begin write(f3,a1[i].c[j]); j:=j+1; end; writeln(f3,' db?'); end; end; writeln(f3,'codeseg'); writeln(f3,'start:'); writeln(f3,'mov ax,@data'); writeln(f3,'mov ds,ax'); i:=begin_index+1; while i<>end_index do begin kk:=i; if a1[i].b=8 then begin if (a1[i+1].b<>18)then writeln(f2,'Error: Пропущено (при написаннi функцii writeln'); kk:=i+2; while a1[kk].b<>19 do begin if (a1[kk].b<>17) or (a1[kk].b<>19) then begin for j:=var_index+1 to begin_index do begin if (copy(a1[kk].c,1,a1[kk].b1))=(copy(a1[j].c,1,a1[j].b1)) then a1[kk].b:=a1[j].b; end; writeln(a1[kk].b); if a1[kk].b=31 then begin writeln(f3,'mov ax,[',copy(a1[kk].c,1,a1[kk].b1),']'); writeln(f3,'call WriteByte'); end; if a1[kk].b=32 then begin writeln(f3,'mov al,[',copy(a1[kk].c,1,a1[kk].b1),']'); writeln(f3,'call WriteChar'); end; if a1[kk].b=33 then begin writeln(f3,'mov al,[',copy(a1[kk].c,1,a1[kk].b1),']'); writeln(f3,'call WriteBool'); end; end; kk:=kk+1; end; if a1[kk+1].b<>16 then if a1[kk+2].b<>16 then writeln(f2,'Error: Пропущено; пiсля операцii writeln'); end; if a1[i].b=9 then begin if (a1[i+1].b<>18)then writeln(f2,'Error: Пропущено (при написаннi функцii writeln'); kk:=i+2;while a1[kk].b<>19 do begin if a1[kk].b<>17 then begin m:=0;while a1[kk].c[m]<>#0 do m:=m+1; m:=m+1; for j:=var_index+1 to begin_index do begin nerivne:=0;m1:=0; while m1<>m do begin if a1[kk].c[m1]=a1[j].c[m1] then nerivne:=nerivne+1; m1:=m1+1 end; if nerivne=m then a1[kk].b:=a1[j].b; end; if a1[kk].b=31 then begin writeln(f3,'call ReadInt'); writeln(f3,'mov [',a1[kk].c,'],ax'); end; if a1[kk].b=32 then begin writeln(f3,'call ReadChar'); writeln(f3,'mov [',a1[kk].c,'],al'); end; if a1[kk].b=33 then begin writeln(f3,'call ReadBool'); writeln(f3,'mov [',a1[kk].c,'],al'); end; end; kk:=kk+1; end; if a1[kk+1].b<>16 then if a1[kk+2].b<>16 then writeln(f2,'Error 15: Пропущено; пiсля операцii writeln'); end; {if a1[i].b=30 then pa:=assign(a1,i);} i:=kk+1; end; close(f3); close(f2); close(f1); writeln('Кiнець'); end; procedure TMyApp.HandleEvent(var Event:TEvent); begin TApplication.HandleEvent(Event); if Event.What=evCommand then begin case Event.Command of cmNewWin:NewWindow; cmFileOpen:NewDialog; cmCompile:Compiles; else Exit; end; ClearEvent(Event); end; end; constructor TInterior.Init(var Bounds:TRect;AHScrollBar, AVScrollBar:PScrollBar); begin TScroller.Init(Bounds,AHScrollBar,AVScrollBar); GrowMode:=gfGrowHiX+gfGrowHiY; SetLimit(128,LineCount); end; procedure TInterior.Draw; var i,y:integer; Color:Byte; B:TDrawBuffer; begin Color:=GetColor(1); for y:=0 to size.y-1 do begin MoveChar(B,' ',Color,Size.x); i:=Delta.Y+y; if (i<LineCount) and (Lines[i]<>nil) then MoveStr(B,Copy(Lines[i]^,Delta.x+1,Size.x),Color); writeLine(0,y,Size.x,1,b); end; end; procedure ReadFile; var F:Text; S:String; begin LineCount:=0; Assign(F,'Test.M13'); 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); end; procedure TM13Window.MakeInterior(Bounds:Trect); var HScrollBar,VScrollBar:PScrollBar; interior:PInterior; R:TRect; begin VScrollBar:=StandardScrollBar(sbVertical+sbHandleKeyboard); HScrollBar:=StandardScrollBar(sbHorizontal+sbHandleKeyboard); Interior:=New(PInterior,Init(Bounds,HScrollBar,VScrollBar)); Insert(Interior); end; constructor TM13Window.Init(Bounds:TRect; WinTitle:string;WindowNo:Word); var s:string[3]; begin str(WindowNo, s); TWindow.Init(Bounds, WinTitle+' '+s, wnNoNumber); GetExtent(Bounds); Bounds.Grow(-1,-1); MakeInterior(Bounds); end; procedure DoneFile; var i:integer; begin for i:=0 to linecount-1 do if lines[i]<>nil then disposestr(lines[i]); end; var MyApp:TMyApp; begin MyApp.Init; MyApp.Run; MyApp.Done; end.
Додаток Б Тестова програма на мові M13 з лексичною помилкою: 'Error 13: Невідомий символ: BegAn ' program ja; var a:byte; begАn a:=13; writeln ('Varian:', a); end. Тестова програма на мові M13 з синтаксичною помилкою:
Error15: Пропущено; пiсля операцii writeln' program ja; var a:byte; begin a:=13; writeln ('Varian:', a) end. Тестова програма на мові M13 з семантичною помилкою: 'Error 18: Пропущено змінну: b' program ja; var a,c:byte; begАn a:=53; b:=13; c:=a+b; writeln ('Varian:', b) end.
Тестова програма на мові M13 без помилок: program ja; var a:byte; begin b:=13; writeln ('Varian:', b); end.
Рисунок 6 Вигляд працездатного компілятора.
|
||||||||||||||
|
Последнее изменение этой страницы: 2020-03-02; просмотров: 160; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.20 (0.006 с.) |