Автор: Пользователь скрыл имя, 11 Февраля 2013 в 18:48, контрольная работа
Постановка задачи:
Создать грамматику, описывающую конструкцию языка Pascal-оператор if. Для этой грамматики разработать интерпретатор, обеспечивающий показ промежуточных шагов анализа (лексический анализ, синтаксический анализ, построение дерева вывода и синтаксическое дерево).
Постановка задачи 2
Теоретические основы разработки трансляторов 3
Построение лексического анализатора 3
Построение синтаксического анализатора 4
Описание синтаксических конструкций …………………………………………...6
Грамматика, описывающая язык…………………………………………………… 8
Управляющая таблица 8
Листинг программы 9
Результаты работы программы 17
Список литературы 22
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
form1.StringGrid_UprTabl.
end;
Function GetString(s:string;var state:integer):string;
var i:char;max:integer;
begin
if s='' then
begin
GetString:='';state:=1;
exit;
end;
if s[1]=' ' then
begin
GetString:=' ';state:=2;
exit;
end;
if length(s)>1 then
if copy(s,1,2)=':=' then
begin
GetString:=':=';state:=3;
exit;
end;
if length(s)>1 then
if (copy(s,1,2)='<>')or(copy(s,1,
begin
GetString:=copy(s,1,2);state:=
exit;
end;
if (s[1]='(')or(s[1]=')') then
begin
GetString:=s[1];state:=8;
exit;
end;
if (s[1]='<')or(s[1]='>') then
begin
GetString:=s[1];state:=4;
exit;
end;
if (s[1]='/')or(s[1]='*')or(s[1]=
begin
GetString:=s[1];state:=5;
exit;
end;
if length(s)>1 then
if copy(s,1,2)='IF' then
begin
GetString:='IF';state:=9;
exit;
end;
if length(s)>3 then
if copy(s,1,4)='THEN' then
begin
GetString:='THEN';state:=9;
exit;
end;
if length(s)>3 then
if copy(s,1,4)='ELSE' then
begin
GetString:='ELSE';state:=9;
exit;
end;
if length(s)>2 then
if copy(s,1,3)='VAR' then
begin
GetString:='VAR';state:=9;
exit;
end;
if length(s)>6 then
if copy(s,1,7)='INTEGER' then
begin
GetString:='INTEGER';state:=9;
exit;
end;
if length(s)>5 then
if copy(s,1,6)='DOUBLE' then
begin
GetString:='DOUBLE';state:=9;
exit;
end;
if ((s[1]>='A')and(s[1]<='Z')) then
begin
max:=1000;
for i:=#0 to #255 do
begin
if not(((i>='A')and(i<='Z'))or((
if (pos(i,s)>0)and(pos(i,s)<max) then max:=pos(i,s);
end;
if max=1000 then max:=length(s);
GetString:=copy(s,1,max-1);
exit;
end;
if (s[2]='.') then
begin
max:=1000;
for i:=#0 to #255 do
begin
if not(((i>='0')and(i<='9'))or((
if (pos(i,s)>0)and(pos(i,s)<max) then max:=pos(i,s) ;
end;
if max=1000 then max:=length(s);
GetString:=copy(s,1,max-1);
exit;
end;
if (s[1]='0')or(s[1]='1')or(s[1]=
begin
GetString:=s[1];state:=7;
exit;
end;
state:=0;
GetString:='error';
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
s,s1:string;
i,state:integer;
begin
list_cur:=0;
stringgrid1.RowCount:=2;
for i:=0 to memo1.Lines.Count do
begin
s:=' ';
s1:=memo1.Lines[i];
while (s<>'')and(s<>'error') do
begin
s:=GetString(UpperCase(s1),
if (length(s)<=length(s1))and(
begin
delete(s1,1,length(s));
if (s<>' ')and(s<>'error') then
begin
stringgrid1.Cols[0][
stringgrid1.Cols[1][
stringgrid1.RowCount:=
inc(list_cur);
list[list_cur]:=s;
listZ[list_cur]:=state;
end;
end;
if s='error' then messagebox(0,'error',0,0);
end;
end;
end;
Function Find(x,y:string):string;
var i,j,bi,bj:integer;
begin
form1.AT.RecNo:=1;
bi:=100;bj:=100;
for i:=1 to form1.at.FieldCount-1 do
if x=form1.AT.Fields.Fields[i].
for j:=1 to form1.at.RecordCount do begin
if j>1 then form1.AT.RecNo:=form1.AT.
if y=form1.at.Fields.Fields[0].
end;
form1.AT.RecNo:=bj;
if (bi<100)and(bj<100) then
Find:=form1.at.Fields.Fields[
else Find:='Error';
globalX:=bi;
GlobalY:=bj;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.Cols[0][0]:='Type'
stringgrid1.Cols[1][0]:='
LoadTiGrid();
end;
procedure TForm1.Button2Click(Sender: TObject);
var
st:string;
Rez,inP:string;
stek:array [1..100] of string;
stek_cur,i,j,k,m{,s_c}:
bExt,bDel,bRez:boolean;
cur,cur1,cu,cu1:TTreeNode;
m_i:integer;
s_temp_stek,s_temp_str,s_temp_
ruls:integer;
begin
s_temp_rules:='';
BitBtn1Click(Sender);
bRez:=True;
tv.Items.Clear;
tv.Items.Add(nil,'Äåðåâî âûâîäà');
cur:=tv.Items.Item[0];
cu:=tvv.Items.Item[0];
Stek[1]:='$';
Stek[2]:='START';
Stek_cur:=2;
inc(list_cur);
list[list_cur]:='e';
i:=1;
bExt:=false;
while not(bExt) do begin
case listz[i] of
4:inP:='ZN';
6,7,10:inP:='P';
5:begin
if List[i]=';' then inp:=';';
if List[i]=',' then inp:=',';
if List[i]=':' then inp:=':';
if (List[i]='+')or(List[i]='-') then inp:='+';
if (List[i]='/')or(List[i]='*') then inp:='*';
end;
else inP:=List[i];
end;
Rez:= Find(inP,Stek[stek_cur]); //s_temp_stek,s_temp_str
//////////////////////////////
s_temp_stek:='';
s_temp_str:='';
for m_i:=1
to stek_cur do s_temp_stek:=s_temp_stek+Stek[
for m_i:=i
to list_cur-1 do s_temp_str:=s_temp_str+list[m_
//form1.Memo2.Lines.Add(s_
//form1.Memo2.Lines.Add(s_
//////////////////////////////
if (Rez='Error')or(Rez='') then begin
bExt:=True;
bRez:=False;
MessageBox(0,'Îøèáêà àíàëèçà òåêñòà','',0);
end;
if (Rez='DOPUSK') then begin
bExt:=True;
bRez:=True;
form1.Memo2.Lines.Add('['+s_
// MessageBox(0,'Òåêñò ïðîàíàëèçèðîâàí','',0);
end;
if (Rez='VYBROS') then begin
cur.Text:=list[i];
inc(i);
dec(stek_cur);
cur1:=cur.GetNext;
cur:=cur1;
form1.Memo2.Lines.Add('['+s_
end
else if not(bExt) then begin
dec(stek_cur);
k:=2;
for j:=1 to length(rez) do
if rez[j]=' ' then k:=k+1;
m:=stek_cur;
if Rez[1]<>'e' then begin
if (globaly = 18) then globaly:=7;
if (globaly = 19) then globaly:=8;
s_temp_rules:=s_temp_rules+' '+inttostr(globaly);
while pos(' ',rez)>0 do begin
inc(stek_cur);
Stek[k+m+m-stek_cur]:=copy(
delete(rez,1,pos(' ',rez));
end;
inc(stek_cur);
Stek[{stek_cur}m+1]:=rez;
for j:=stek_cur downto m+1 do
cur1:=tv.Items.AddChild(cur,
cur:=cur1.Parent.
end
else begin
tv.Items.AddChild(cur,'e');
cur:=cur.GetNext.GetNext;
end;
end;
end;
//if bRez then BuildSintaxTree;
end;
procedure TForm1.RecBuildTree(T: TTreeNode; i :integer);
var
j :integer;
begin
if T.Count=0 then
begin
if T.Text = 'e' then
Exit;
if T.Text = ')' then
Exit;
if T.Text = '(' then
Exit;
if T.Text = ';' then
Exit;
if T.Text = ',' then
Exit;
if T.Text = ':' then
Exit;
if T.Text = 'VAR' then
Exit;
if T.Text = 'INTEGER' then
Exit;
if T.Text = 'DOUBLE' then
Exit;
if T.Text = 'THEN' then
Exit;
if T.Text = 'ELSE' then
Exit;
Inc(StrCount);
Pri[StrCount]:=i;
Str[StrCount]:=T.Text;
end
else
for j:=T.Count-1 downto 0 do
RecBuildTree(T.Item[j], i+1);
end;
procedure TForm1.BuildSintaxTree;
var i: integer;
T: TTreeNode;
begin
StrCount:=0;
RecBuildTree(TV.TopItem, 0);
for i:= 1 to StrCount do
if (Str[i]<>'+')and(Str[i]<>'*')
TVV.Items.Clear;
if StrCount = 1 then TVV.Items.AddChild(nil,str[1])
else
begin
T:= nil;
SintaxTree(T,1,StrCount);
end;
end;
procedure TForm1.SintaxTree(T: TTreenode; l, r: integer);
var i, min,m,mmin,ii,jj: integer;
T1,T2: TTreeNode;
begin
if r-l < 2 then
begin
T.Text:=str[l];
end
else
begin
min:=maxInt;
for i:= l to r do
if (pri[i] <= min)and(pri[i]<>0) then begin
min:= pri[i];
m:=i;
end;
i:=m;
if T = nil then
begin
T1:=TVV.Items.AddChild(T,str[
TVV.Items.AddChild(T1,'');
TVV.Items.AddChild(T1,'');
T:= T1;
end
else
begin
T.Text:=str[i];
TVV.Items.AddChild(T,'');
TVV.Items.AddChild(T,'');
end;
if T.Text<>'IF' then begin
if T.Text<>':=' then begin
SintaxTree(T.Item[1],l,i-1);
SintaxTree(T.Item[0],i+1,r);
end else begin
SintaxTree(T.Item[0],i+1,r);
mmin:=0;
for ii:=l to i-1 do
if str[ii]=':=' then mmin:=ii;
if mmin>0 then begin
SintaxTree(T.Item[1],mmin+2,i-
T2:=TVV.Items.AddChild(T.
SintaxTree(T2,l,mmin+1);
end
else SintaxTree(T.Item[1],l,i-1);
end;
end else begin
jj:=1;
while(pri[jj]>0)or(pri[jj+1]>
SintaxTree(T.Item[0],l,{l+2}
SintaxTree(T.Item[1],{l+3}jj+
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then memo1.Lines.LoadFromFile(
end;
end.
7. Результаты работы программы
8. Список литературы