АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Теоретичні відомості. З дисципліни «Системне програмне забезпечення»

Читайте также:
  1. E. Відновлення свідомості
  2. Беляневич О. А. Господарське договірне право України (теоретичні аспекти). – К.: Юрінком Інтер, 2006. – 592 с.
  3. Ви приступили до надання допомоги дорослому постраждалому на місці події. Він без свідомості й лежить на животі. У якому випадку Ви перевертаєте постраждалого на спину?
  4. Ви приступили до надання допомоги постраждалому на місці події. Він без свідомості й лежить на животі. Ви перевернули його на спину. Постраждалий не дихає. Ваші дії далі.
  5. Відомості про будь-які обмеження щодо права володіння цінними паперами.
  6. Властивості та оцінка масової свідомості
  7. Головні елементи моральної свідомості
  8. Два фактори, що зіграли вирішальну роль у виникненні свідомості
  9. Добро і зло як ціннісні полюси моральної свідомості і практики
  10. Добро і зло — основні поняття моральної свідомості і категорії етики.
  11. Загальні відомості
  12. ЗАГАЛЬНІ ВІДОМОСТІ

Лабораторна робота № 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 сек.)