|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Теоретичні відомості. З дисципліни «Системне програмне забезпечення»Лабораторна робота № 2 З дисципліни «Системне програмне забезпечення» На тему «Синтаксичний аналіз»
Виконала: Студентка гр. БЧСП-1-09 Калашник І. О.
Перевірив: викладач Дель Д.Г.
Черкаси 2012 Мета роботи: вивчення методу граматичного розбору на основі синтаксичних діаграм. Теоретичні відомості Синтаксична діаграма графічно зображує структуру конструкцій алгоритмічного мови. Окремими елементами діаграми можуть бути основні символи або поняття мови. З кожного елемента виходить одна або кілька стрілок, що вказують на ті елементи, які можуть безпосередньо слідувати за даними елементом (тобто стрілки вказують можливих наступників кожного з елементів діаграми). Стрілка, не виходить з будь-якого елемента, є входом діаграму, а стрілка, не веде до якого-або елемента, означає вихід з діаграми, тобто кінець синтаксичного визначення. Щоб було легше відрізнити в діаграмах основні символи (термінальні) від понять (нетермінальні символи) їх виділяють будь-яким способом, наприклад, укладають основні символи в гуртки або овали, а поняття - у прямокутники. Однак, це не зовсім зручно при підготовці друкованих документів. Тому збережемо для понять символіку БНФ, тобто поняття будуть полягати в кутові дужки, а термінальні символи будуть без дужок. Результати роботи програми: Текст програми: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; StringGrid1: TStringGrid; StringGrid2: TStringGrid; StringGrid3: TStringGrid; StringGrid4: TStringGrid; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; sss,ss:string; ch1:set of char; ii,ij:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j,j1,jj,k,m,tt,p,h,hh,zz,ii1,zz1,jjj:integer; sd,sss:string; ch,ch1,ch2,ch3: set of char; a,b,c,d,e:array [1..10000] of string; roditelgl:integer; sost:integer; roditel:integer; potomok:array[1..10000]of integer; identific:array[1..10000]of string; tr:byte; kolbegin,kolend,otkrskob,zakrskob:integer; oshibka:integer; tif,tdo:integer; cikl:integer; trrt:integer; label l1; begin Memo2.Lines.Clear; Memo3.Lines.Clear; for i:=1 to 100 do begin StringGrid2.Cells[1,i]:=''; StringGrid3.Cells[1,i]:=''; StringGrid3.Cells[2,i]:=''; end; oshibka:=0; ch:=['a'..'z','а'..'я']; ch2:=['0'..'9']; ch1:=[' ',',','.',';',':','?',chr(39),'!','|','/','\','~','*','+','-','(',')','{','}','<','>','[',']','#','%','&','^', '=','"']; ch3:=['!','?','\','@','$']; ii:=1; for i:=0 to length(Memo1.Text)do begin sss:=Memo1.Lines[i]; sss:=LowerCase(sss); j:=1; while j<=length(Memo1.Lines[i]) do if(not(sss[j]in ch1)) then begin a[ii]:=a[ii]+sss[j]; inc(j); end else begin if((sss[j]='>')and(sss[j+1]='<'))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': Указан '+'"><" неверный знак'); j:=j+2; end else if((sss[j]=':')and(sss[j+1]='='))then begin inc(ii); a[ii]:=':='; j:=j+2; end; tif:=0; tdo:=0; otkrskob:=0; zakrskob:=0; zz:=0; cikl:=0; if((a[i]='If')and(tif=0))then begin tif:=1; tdo:=1; inc(cikl); end; if((a[i]='(')and(tif=1))then inc(otkrskob) else if((a[i]=')')and(tif=1))then inc(zakrskob) else if((a[i]='do')and(tdo=1))then begin tif:=0; tdo:=0; if((otkrskob>zakrskob)and(tdo=0))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': If' +'- Количество открывающих скобок больше количества закрывающих'); end else if((otkrskob<zakrskob)and(tdo=0))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': If'+'- Количество открывающих скобок меньше количества закрывающих'); end; otkrskob:=0; zakrskob:=0; end; end; ii:=zz; ii1:=0; kolend:=0; for i:=1 to ii do begin if(a[i]='end')then inc(kolend); for j:=1 to 75 do if((a[i]=StringGrid1.Cells[1,j])) then begin inc(ii1); StringGrid2.Cells[1,ii1]:=a[i]; a[i]:=''; break; end; end; StringGrid2.RowCount:=ii1+1; for i:=1 to StringGrid2.RowCount+1 do begin b[i]:=StringGrid2.Cells[1,i]; StringGrid2.Cells[1,i]:=''; end; h:=0; sd:=''; k:=0; for i:=1 to StringGrid2.RowCount+1 do begin sd:=b[i]; for j:=1 to i-1 do begin if sd=b[j] then inc(k) end; if k=0 then begin inc(h); StringGrid2.Cells[1,h]:=sd; end; k:=0; end; StringGrid2.RowCount:=h; ij:=0; trrt:=0; for i:=1 to ii do if(a[i]='begin')then inc(trrt) else if(trrt=0)then for j:=1 to length(a[i]) do if ((a[i]<>'')and(a[i]<>' '))and((a[i][j]in ch2)and(a[i][j+1]in ch))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': идентификатор ' +a[i]+' не может начинаться с цифры!'); a[i]:=' '; break; end else if(((a[i]<>'')and(a[i]<>' '))and(((a[i][j]in ch)and(a[i][j+1]in ch2))))then begin inc(ij); StringGrid4.Cells[1,ij]:=a[i]; a[i]:=' '; break; end else if(((a[i]<>'')and(a[i]<>' '))and((a[i][j]in ch)and(not(a[i][j+1]in ch2))))then begin inc(ij); StringGrid4.Cells[1,ij]:=a[i]; a[i]:=' '; break; end; StringGrid4.RowCount:=ij+1; k:=0; hh:=0; for i:=1 to StringGrid4.RowCount+1 do begin c[i]:=StringGrid4.Cells[1,i]; StringGrid4.Cells[1,i]:=''; end; h:=0; sd:=''; for i:=1 to StringGrid4.RowCount+1 do begin sd:=c[i]; for j:=1 to i-1 do begin if sd=c[j] then inc(k) end; if k=0 then begin inc(h); StringGrid4.Cells[1,h]:=sd; identific[h]:=sd; hh:=h; end; k:=0; end; StringGrid4.RowCount:=h; jj:=0; for i:=1 to ii do for j:=1 to length(a[i]) do begin if(((a[i]<>'')and(a[i]<>' '))and((a[i][j]>'0')and(a[i][j]<'9')))then begin inc(jj); StringGrid3.Cells[1,jj]:=a[i]; a[i]:=''; break; end; end; StringGrid3.RowCount:=jj+1; for i:=1 to StringGrid3.RowCount+1 do begin b[i]:=StringGrid3.Cells[1,i]; StringGrid3.Cells[1,i]:=''; end; h:=0; sd:=''; for i:=1 to StringGrid3.RowCount+1 do begin sd:=b[i]; for j:=1 to i-1 do begin if sd=b[j] then inc(k) end; if k=0 then begin inc(h); StringGrid3.Cells[1,h]:=sd; end; k:=0; end; StringGrid3.RowCount:=h; kolbegin:=0; tr:=0; for k:=1 to length(Memo1.Text) do begin if(Memo1.Lines[k]='begin')then inc(kolbegin); if(kolbegin=1)then tr:=1; for j:=StringGrid4.RowCount downto 1 do if((tr=1) and(StringGrid4.Cells[1,j]+':'+'integer;'=Memo1.Lines[k])) then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': Строка '+inttostr(k)+'- идентификатор нужно определять в var!'); StringGrid4.RowCount:=StringGrid4.RowCount-1; break; end else begin if((StringGrid4.Cells[1,j]+':'+'integer;')=Memo1.Lines[k])then begin StringGrid4.Cells[2,j]:='integer'; StringGrid4.Cells[3,j]:=inttostr(k); end end; for j:=StringGrid4.RowCount downto 1 do if((StringGrid4.Cells[1,j]<>'')and(StringGrid4.Cells[2,j]=''))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': '+StringGrid4.Cells[1,j]+'- неопределенный идентификатор!'); StringGrid4.Cells[1,j]:=''; StringGrid4.RowCount:=StringGrid4.RowCount-1; end; if(kolbegin>kolend)then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': Количество begin больше количества end'); end else if(kolbegin<kolend)then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': Количество begin меньше количества end'); end; for i:=1 to StringGrid3.RowCount do for j:=1 to length(StringGrid3.Cells[1,i])do begin if(StringGrid3.Cells[1,i][j]<>'.') then StringGrid3.Cells[2,i]:='integer'; end; sost:=0; Memo2.Lines.Clear; tif:=0; for i:=1 to zz do begin for j:=1 to StringGrid2.RowCount do if((d[i]='while')and(tif=0))then begin tif:=1; Memo2.Text:=Memo2.Text+#13+'WHILE'; break; end else if((d[i]='(')and(d[i-1]='while'))then begin Memo2.Text:=Memo2.Text+'('+#13; break; end else if((d[i]=')')and(d[i+1]='do')and(tif=1))then begin tif:=0; Memo2.Text:=Memo2.Text+#13+')'; break; end else if(d[i]='do')then begin Memo2.Text:=Memo2.Text+'DO'+#13; break; end else if(d[i]='and')then begin Memo2.Text:=Memo2.Text+#13+'and'+#13; break; end else if(d[i]='or')then begin Memo2.Text:=Memo2.Text+#13+'or'+#13; break; end else if((tif=1)and(d[i]='begin'))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': В самом условии While не может быть begin'); break; end else if((tif=1)and(d[i]='integer'))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': Тип '+d[i]+' должен быть в var'); break; end else if((tif=1)and(d[i]='<')and(d[i+1]='>'))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': "< >" в знаках!'); break; end else if((tif=1)and(d[i][1]in ch3))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': в If "'+d[i]+'"!'); break; end else if((d[i]='begin')and(sost=0))then begin sost:=1; Memo2.Text:=Memo2.Text+#13+'BEGIN'; break; end else if((d[i]='end')and(d[i+1]='.'))then begin Memo2.Text:=Memo2.Text+#13+'END.'; goto l1; end else if(d[i]='var')then begin Memo2.Text:=Memo2.Text+#13+'VAR'+#13; break; end else if((d[i]=StringGrid2.Cells[1,j])and(StringGrid2.Cells[1,j]<>'')) then begin Memo2.Text:=Memo2.Text+'<1,'+inttostr(j)+'>'; break; end; for j:=1 to StringGrid3.RowCount do if((d[i]=StringGrid3.Cells[1,j])and(StringGrid3.Cells[1,j]<>''))then Memo2.Text:=Memo2.Text+'<40,'+inttostr(j)+'>'; for j:=1 to StringGrid4.RowCount do if((d[i]=StringGrid4.Cells[1,j])and(StringGrid4.Cells[2,j]='boolean')and ((d[i+2][1]in ch)or(d[i+3][1]in ch)))then begin inc(oshibka); Memo3.Lines.Add('Ошибка '+inttostr(oshibka)+': Несоответствие типов'); end else if((d[i]=StringGrid4.Cells[1,j])and(StringGrid4.Cells[1,j]<>''))then Memo2.Text:=Memo2.Text+'<50,'+inttostr(j)+'>'; end; l1: end; procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin Memo1.clear; Memo2.clear; memo3.Clear; StringGrid1.Cells[0,0]:='№'; StringGrid1.Cells[1,0]:='Терминальный символ'; StringGrid2.Cells[0,0]:='№'; StringGrid2.Cells[1,0]:='Терминал'; StringGrid2.Cells[2,0]:='Разделитель'; StringGrid3.Cells[0,0]:='№'; StringGrid3.Cells[1,0]:='Литерал'; StringGrid3.Cells[2,0]:='Тип'; StringGrid3.Cells[3,0]:='№ строки'; StringGrid4.Cells[0,0]:='№'; StringGrid4.Cells[1,0]:='Идентификатор'; StringGrid4.Cells[2,0]:='Тип'; StringGrid4.Cells[3,0]:='№ строки'; For i:=1 to 100 do begin StringGrid1.Cells[0,i]:=inttostr(i); StringGrid2.Cells[0,i]:=inttostr(i); StringGrid3.Cells[0,i]:=inttostr(i); StringGrid4.Cells[0,i]:=inttostr(i); end; StringGrid1.Cells[1,1]:=':='; StringGrid1.Cells[1,2]:='else'; StringGrid1.Cells[1,3]:='if'; StringGrid1.Cells[1,4]:='begin'; StringGrid1.Cells[1,5]:='integer'; StringGrid1.Cells[1,6]:='end'; StringGrid1.Cells[1,7]:='var'; StringGrid1.Cells[1,8]:=';'; StringGrid1.Cells[1,9]:='then'; StringGrid1.Cells[1,10]:='program'; StringGrid1.Cells[1,11]:='.'; StringGrid1.RowCount:=12; StringGrid1.ColCount:=2; end; procedure TForm1.Button2Click(Sender: TObject); begin Close; end; end.
Висновок: на лабораторній роботі був вдосконалений лексичний аналізатор до синтаксичного. Були здобуті нові теоретичні та практичні навички по побудові синтаксичного аналізатора. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.038 сек.) |