Курсовые проекты / курса не мои / Ильшатей / spo_sanya / ПРИЛОЖЕНИЕ В
.doc
ПРИЛОЖЕНИЕ В
Исходный текст программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, StrUtils;
type
TTblR = class(TObject)
function Hash(str:String;i:Integer):Integer;
procedure ClearTable;
function Add(str,info1,info2:String):Integer;
function Find(str:String):Integer;
function GetNFind(str:String):Integer;
private
public
lastfind:Integer;
collision:Integer;
compares:Integer;
count:Integer;
rand:Array [0..255] of Integer;
tbl1:Array [0..255] of String;
tbl2:Array [0..255] of String;
tbl3:Array [0..255] of String;
end;
type//Объявление класса таблицы с хэш адресацией
TTbl = class(TObject)
function Hash(str:String;i:Integer):Integer;//Подсче хэш значения (принцип далее...)
procedure ClearTable;//процедура очистки таблицы
function Add(str:String):Integer;//Функция добавления элемента
function Find(str:String):Integer;//Функция поиска элемента
private
public
lastfind:Integer;
collision:Integer;//После добавления элемента в эта переменная инкриментируется при каждой коллизии
compares:Integer;//После каждой операции сравнения данная переменная инкриментируется
NextNumber:Integer;
tbl:Array [0..255] of String;//Таблица элементов
tbli:Array [0..255] of Integer;//Таблица дополнительных значений по каждому элементу
count:Integer;
end;
type//Объявление класса лексического анализатора
TLeksemma = class(TObject)//Лексический анализатор содержит и реализует граф переходов
function Add(i,j:Integer;simbols,action:String):Boolean;//Функция добавления правила перехода
function sigma(sost:Integer;simbol:Char):Integer;//Функция перехода из состояния под действием входного символа
private
sig:Array [-1..20] of Array [-1..20] of String;//Массивы символов разрешающие переход из состояния i в состояние j
act:Array [-1..20] of Array [-1..20] of String;//Дополнительные команды, выполняемые при переходе
public
tbl:^TTbl;//Таблица идентификаторов на основе Хэш таблицы
List:^TListView;//Элемент управления "ListView" для вывода графической информации (левое поле формы программы)
tmp:String;//Временное хранилище получаемых символов.
end;
type
TKursovaia = class(TForm)
Text: TMemo;
OpenDialog: TOpenDialog;
List: TListView;
UpdateIDs1: TButton;
FindAll1: TButton;
Find1: TEdit;
FindItem1: TButton;
UpdateIDs2: TButton;
FindAll2: TButton;
Find2: TEdit;
FindItem2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Open: TButton;
GetCompile: TButton;
Tree: TTreeView;
Compile: TButton;
procedure OpenClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure UpdateIDs1Click(Sender: TObject);
procedure FindItem1Click(Sender: TObject);
procedure UpdateIDs2Click(Sender: TObject);
procedure FindItem2Click(Sender: TObject);
procedure FindAll1Click(Sender: TObject);
procedure FindAll2Click(Sender: TObject);
procedure GetCompileClick(Sender: TObject);
procedure LoadFileClick(Sender: TObject);
function down(src:String;sub:Integer):String;//функция анализа лексических строений
procedure CompileClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
Table1:TTbl;
Table2:TTblR;
Graph:TLeksemma;
P:Array [0..9] of Array [0..1] of String;
{ Private declarations }
public
{ Public declarations }
end;
var
Kursovaia: TKursovaia;
implementation
{$R *.dfm}
function TLeksemma.sigma(sost:Integer;simbol:Char):Integer;//Функция переходов из состояния sost по
var //под действием символа simbol
i:Integer;
j:Integer;
k:Integer;
Item:TListItem;
begin //данная функция определяет новое состояние в графе на основе текущего состояния
Result:=-2; // и входного символа, при этом производится какое-либо действие
if(sost<>-1) then begin
i:=-1;
j:=0;
while (Result=-2) and (i<21) do begin
j:=AnsiPos(String(simbol),sig[sost][i]);
if(j>0) then Result:=i;
i:=i+1;
end;
tmp:=tmp+simbol;
if(Result=-2) then
for i:=-1 to 20 do
if(sig[sost][i]='ALL') then Result:=i;
if(Result<>-2) and (j<>0) then begin
k:=1;
if(act[sost][Result]<>'') then
while(j>1)do begin
while(act[sost][Result][k]<>' ') and (act[sost][Result][k]<>#0) and (act[sost][Result][k+1]<>#0) do
k:=k+1;
k:=k+1;
j:=j-1;
end;
if(act[sost][Result]<>'') then
while(act[sost][Result][k]<>' ') and (act[sost][Result][k]<>#0) do begin
case act[sost][Result][k] of //в таблице act определены символы-действия (в основном по добавки в таблицу идентификаторов и т.д.)
'r':begin tmp:=''; end;
';':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add(';'); Item.SubItems.Add(tmp); Item.SubItems.Add('Ключевое слово'); tmp:=''; end;
'=':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('='); Item.SubItems.Add(tmp); Item.SubItems.Add('Условие'); tmp:=''; end;
'<':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('<'); Item.SubItems.Add(tmp); Item.SubItems.Add('Условие'); tmp:=''; end;
'>':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('>'); Item.SubItems.Add(tmp); Item.SubItems.Add('Условие'); tmp:=''; end;
')':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add(')'); Item.SubItems.Add(tmp); Item.SubItems.Add('Ключевое слово'); tmp:=''; end;
'(':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('('); Item.SubItems.Add(tmp); Item.SubItems.Add('Ключевое слово'); tmp:=''; end;
'f':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('for'); Item.SubItems.Add(tmp); Item.SubItems.Add('Ключевое слово'); tmp:=''; end;
'd':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('do'); Item.SubItems.Add(tmp); Item.SubItems.Add('Ключевое слово'); tmp:=''; end;
':':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add(':='); Item.SubItems.Add(tmp); Item.SubItems.Add('Знак присвоения'); tmp:=''; end;
'v':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('a'); Item.SubItems.Add(tmp); Item.SubItems.Add('Идентификатор'); tmp:=''; end;
'c':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('a'); Item.SubItems.Add(tmp); Item.SubItems.Add('Константа'); tmp:=''; end;
'k':begin Item:=List.Items.Add; Item.Caption:=tmp; Item.SubItems.Add('k'); Item.SubItems.Add(tmp); Item.SubItems.Add('Коментарии'); tmp:=''; end;
end;
k:=k+1;
end;
end;
end;
end;
function TLeksemma.Add(i,j:Integer;simbols,action:String):Boolean;//Добавление правила перехода из состояния
begin //i в состояние j при поступлении одного из символов строки simbols. action - строка параметров перехода
if(i>20) or (j>20) then Result:=false
else begin
sig[i][j]:=simbols;
act[i][j]:=action;
Result:=true;
end;
end;
function TTblR.Hash(str:String;i:Integer):Integer;
var
j:Integer;
HASH_MIN,HASH_MAX,REHASH1,REHASH2:Integer;
begin
HASH_MIN:=0;
HASH_MAX:=255;
REHASH1:=131;
REHASH2:=251;
Result:=0;
if(str<>'') then begin
Result:=Result xor Ord(str[1]);
if(Length(str)>1) then
Result:=Result xor Ord(str[2]);
if(Length(str)>2) then
Result:=Result xor Ord(str[3]);
Result:=Result mod 256;
Result := (Result - HASH_MIN + i*REHASH1 mod REHASH2) mod (HASH_MAX - HASH_MIN +1) + HASH_MIN;
if Result <HASH_MIN then Result := HASH_MIN;
end;
end;
procedure TTblR.ClearTable;
var
j:Integer;
k,l:Integer;
begin
for j:=0 to High(Tbl1) do begin
Tbl1[j] := '';
rand[j]:=j;
end;
collision:=0;
for j:=1 to High(rand) do begin
k := Random(High(rand)-1)+1;
l := rand[k];
rand[k]:=rand[j];
rand[j]:=l;
end;
count:=0;
end;
function TTblR.Find(str:String):Integer;
begin
Result:=0;
compares:=1;
while (Result<256) and (tbl1[Hash(str,Result)]<>str) and (tbl1[Hash(str,Result)]<>'') do begin
Result:=Result+1;
compares:=compares+1;
end;
if(tbl1[Hash(str,Result)]='') then
Result:=-1;
if(Result=256) then
Result:=-1;
lastfind:=Hash(str,Result);
end;
function TTblR.GetNFind(str:String):Integer;
begin
Result:=0;
compares:=1;
while (Result<256) and (tbl1[Hash(str,Result)]<>str) and (tbl1[Hash(str,Result)]<>'') do begin
Result:=Result+1;
compares:=compares+1;
end;
if(tbl1[Hash(str,Result)]='') then
Result:=-1;
if(Result=256) then
Result:=-1;
if(Result>=0) then
Result:=StrToInt(tbl3[Hash(str,Result)]);
end;
function TTblR.Add(str,info1,info2:String):Integer;
var
j:Integer;
begin
j := 0;
if(Find(str)=-1) then begin
while tbl1[Hash(str,j)]<>'' do
j:=j+1;
if(j>0) then collision:=collision+1;
if(tbl1[Hash(str,j)]='')then begin
tbl1[Hash(str,j)]:=str;
count:=count+1;
tbl3[Hash(str,j)]:=IntToStr(count);
Result:=count;
end else
Result:=-1;
end else
Result:=-1;
end;
procedure TKursovaia.OpenClick(Sender: TObject);
var
i:Integer;
Item:TListItem;
begin
if(OpenDialog.Execute) then begin
List.Clear;
FindItem1.Enabled:=false;
FindItem2.Enabled:=false;
FindAll1.Enabled:=false;
FindAll2.Enabled:=false;
UpdateIDs1.Enabled:=true;
UpdateIDs2.Enabled:=true;
Text.Clear;
Text.Lines.LoadFromFile(OpenDialog.Files.Strings[0]);
for i:=0 to Text.Lines.Count-1 do begin
Item := List.Items.Add;
Item.Caption := Text.Lines.Strings[i];
Item.SubItems.Add(IntToStr(Table1.Hash(Text.Lines.Strings[i],0)));
end;
MessageBox(0,PAnsiChar('Количество элементов: '+IntToStr(Text.Lines.Count)),'',0);
end;
end;
procedure TKursovaia.FormCreate(Sender: TObject);
begin
Randomize;
Table1 := TTbl(TTbl.NewInstance);
Table2 := TTblR(TTblR.NewInstance);
Graph := TLeksemma(TLeksemma.NewInstance);
Graph.tbl:=@Table1;
Graph.List:=@List;
//Далее происходит задание графу правил переходов под действиями определенных символов.
Graph.Add(0,0,#9+' ()=<>;','r r ( ) = < > ;');//r - ничего не делать; z - добавление в таблицу ";"; x->")"; y->"("; a->"-"; b->"+"; c->"*"; d->"/";
Graph.Add(0,9,'d','');
Graph.Add(9,10,'o','');
Graph.Add(9,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(10,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(1,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(2,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(3,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(10,0,' ','d');
Graph.Add(0,1,'f','');
Graph.Add(1,2,'o','');
Graph.Add(2,3,'r','');
Graph.Add(3,0,#9+' ','f f ');
Graph.Add(0,4,'1234567890','');
Graph.Add(4,4,'1234567890','');
Graph.Add(4,0,' ','c');
Graph.Add(4,5,'.','');
Graph.Add(5,6,'1234567890','');
Graph.Add(4,7,'e','');
Graph.Add(6,6,'1234567890','');
Graph.Add(6,0,' ','c');
Graph.Add(6,7,'e','');
Graph.Add(7,8,'1234567890','');
Graph.Add(8,8,'1234567890','');
Graph.Add(8,0,' ','c');
Graph.Add(0,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(11,11,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_1234567890','');
Graph.Add(11,0,' ','v');
Graph.Add(0,-1,'ALL','');
Graph.Add(1,-1,'ALL','');
Graph.Add(2,-1,'ALL','');
Graph.Add(3,-1,'ALL','');
Graph.Add(4,-1,'ALL','');
Graph.Add(5,-1,'ALL','');
Graph.Add(6,-1,'ALL','');
Graph.Add(7,-1,'ALL','');
Graph.Add(8,-1,'ALL','');
Graph.Add(9,-1,'ALL','');
Graph.Add(10,-1,'ALL','');
Graph.Add(11,-1,'ALL','');
Graph.Add(12,-1,'ALL','');
Graph.Add(13,-1,'ALL','');
Graph.Add(0,12,#13,'r');
Graph.Add(12,0,#10,'r');
Graph.Add(0,13,':','');
Graph.Add(13,0,'=',':');
Graph.Add(0,14,'{','');
Graph.Add(14,14,'ALL','');
Graph.Add(14,0,'}','k');
//Заполняется матрица правил граматики
//Та что в задании
//P[0][0]:='a'; {->} P[0][1]:='E';
//P[1][0]:='-(F)'; {->} P[1][1]:='E';
//P[2][0]:='(F)'; {->} P[2][1]:='E';
//P[3][0]:='E'; {->} P[3][1]:='T';
//P[4][0]:='T/E'; {->} P[4][1]:='T';
//P[5][0]:='T*E'; {->} P[5][1]:='T';
//P[6][0]:='T'; {->} P[6][1]:='F';
//P[7][0]:='F+T'; {->} P[7][1]:='F';
//P[8][0]:='a=F;'; {->} P[8][1]:='S';
//Придумано самой для ускорения
P[0][0]:='a=a'; {->} P[0][1]:='E';
P[1][0]:='a>a'; {->} P[1][1]:='E';
P[2][0]:='a<a'; {->} P[2][1]:='E';
P[3][0]:=';E;'; {->} P[3][1]:='T';
P[4][0]:='F;E;'; {->} P[4][1]:='T';
P[5][0]:=';E;F'; {->} P[5][1]:='T';
P[6][0]:='F;E;F'; {->} P[6][1]:='T';
P[7][0]:='a:a'; {->} P[7][1]:='F';
P[8][0]:='f(T)dF';{->} P[8][1]:='F';
P[9][0]:='F;'; {->} P[9][1]:='S';
end;
function TTbl.Hash(str:String;i:Integer):Integer;// Подсчет хэш значения строки
var
j:Integer;
begin //Хэш считается как сумма всех кодов символов по модулю 256
Result:=0;
if(str<>'') then begin
Result:=Result xor Ord(str[1]);
if(Length(str)>1) then
Result:=Result xor Ord(str[2]);
if(Length(str)>2) then
Result:=Result xor Ord(str[3]);
if(i<>0) then
Result := (Result+i mod 256) mod 251
else
Result := Result mod 256;
end;
end;
procedure TTbl.ClearTable;//Очистка таблицы с хэш элементами
var
j:Integer;
begin
for j:=0 to High(Tbl) do
Tbl[j] := '';
collision:=0;
NextNumber:=0;
end;
function TTbl.Find(str:String):Integer;//Функция поиска по Хэш таблице
begin
Result:=0;
compares:=1;
while (Result<256) and (tbl[Hash(str,Result)]<>str) and (tbl[Hash(str,Result)]<>'') do begin
Result:=Result+1;
compares:=compares+1;
end;
if(tbl[Hash(str,Result)]='') then
Result:=-1;
if(Result=256) then
Result:=-1;
if(Result<>-1) then begin
lastfind:=Hash(str,Result);
Result:=tbli[Hash(str,Result)];
end;
end;
function TTbl.Add(str:String):Integer;//Функция добавления элемента в Хэш таблицу
var
j:Integer;
begin
j := 0;
Result:=Find(str);
if(Result<0) then begin
while tbl[Hash(str,j)]<>'' do
j:=j+1;
if(j>0) then collision:=collision+1;
if(tbl[Hash(str,j)]='')then begin
tbl[Hash(str,j)]:=str;
tbli[Hash(str,j)]:=NextNumber;
NextNumber:=NextNumber+1;
Result:=NextNumber;
end else
Result:=-1;
end;
end;
procedure TKursovaia.UpdateIDs1Click(Sender: TObject);
var
i:Integer;
begin
Table1.ClearTable;
Table1.count:=Text.Lines.Count;
i:=0;
while i < Text.Lines.Count do begin
if(-1=Table1.Add(Text.Lines.Strings[i])) then begin
i:=Text.Lines.Count;
MessageBox(WindowHandle,'Переполнение таблицы','до 256',0);
end;
i:=i+1;
end;
if(i<>(Text.Lines.Count+1)) then begin
FindItem1.Enabled:=true;
FindAll1.Enabled:=true;
MessageBox(0,PAnsiChar('Коллизий:'+IntToStr(Table1.collision)),'',0);
end;
end;
procedure TKursovaia.UpdateIDs2Click(Sender: TObject);
var
i:Integer;
begin
Table2.ClearTable;
i:=0;
while i < Text.Lines.Count do begin
if(Table2.Add(Text.Lines.Strings[i],'','')<0) then begin
i:=Text.Lines.Count;
MessageBox(WindowHandle,'Переполнение таблицы или совпадение','до 256',0);
end;
i:=i+1;
end;
if(i<>(Text.Lines.Count+1)) then begin
FindItem2.Enabled:=true;
FindAll2.Enabled:=true;
MessageBox(0,PAnsiChar('Коллизий:'+IntToStr(Table2.collision)),'',0);
end;
end;
procedure TKursovaia.FindItem1Click(Sender: TObject);
begin
if(Table1.Find(Find1.Text)<>-1) then
MessageBox(0,PAnsiChar('Элемент найден'+#10+'Хэш:'+IntToStr(Table1.lastfind)+#10+'сравнений:'+IntToStr(Table1.compares)),'',0)
else
MessageBox(0,PAnsiChar('Элемент не найден'),'',0);
end;
procedure TKursovaia.FindItem2Click(Sender: TObject);
begin
if(Table2.Find(Find2.Text)<>-1) then
MessageBox(0,PAnsiChar('Элемент найден'+#10+'Хэш:'+IntToStr(Table2.lastfind)+#10+'сравнений:'+IntToStr(Table2.compares)),'',0)
else
MessageBox(0,PAnsiChar('Элемент не найден'),'',0)
end;
procedure TKursovaia.FindAll1Click(Sender: TObject);
var
count:Integer;
i:Integer;
begin
count:=0;
for i:=0 to Text.Lines.Count-1 do begin
Table1.Find(Text.Lines.Strings[i]);
count:=count+Table1.compares;
end;
MessageBox(0,PAnsiChar('Сравнений:'+IntToStr(count)+#10+'Среднее число:'+FloatToStr(count / Text.Lines.Count)),'',0);
end;
procedure TKursovaia.FindAll2Click(Sender: TObject);
var
count:Integer;
i:Integer;
begin
count:=0;
for i:=0 to Text.Lines.Count-1 do begin
Table2.Find(Text.Lines.Strings[i]);
count:=count+Table2.compares;
end;
MessageBox(0,PAnsiChar('Сравнений:'+IntToStr(count)+#10+'Среднее число:'+FloatToStr(count/Text.Lines.Count)),'',0);
end;
procedure TKursovaia.GetCompileClick(Sender: TObject);
var
state:Integer;
cur:Integer;
begin
state:=0;
cur:=1;
List.Clear;
Table1.ClearTable;
Graph.tmp:='';
while(cur<=Length(Text.text)) and (state<>-1) do begin
state:=Graph.sigma(state,Text.Text[cur]);
cur:=cur+1;
end;
if(state<>0) then begin
Text.SelStart:=cur-2;
Text.SelLength:=1;
if(Text.SelText='') then
Text.SelStart:=cur-3;
MessageBox(WindowHandle,'Ошибка в тексте','Ошибка',0);
end;
end;
procedure TKursovaia.LoadFileClick(Sender: TObject);
begin
if(OpenDialog.Execute) then
Text.Lines.LoadFromFile(OpenDialog.Files.Strings[0]);
end;
function TKursovaia.down(src:String;sub:Integer):String;//Рекурсивная функция верхсходящего
var //алгоритма анализатора лексических структур
cur:Integer;
pos:Integer;
tmp:String;
i:Integer;
q:Integer;
begin
Result:='';
cur:=0;
q:=Length(src);
while((Result='')and(cur<10)) do begin
i:=q;
while((i>0)and(Result='')) do begin
pos:=AnsiPos(P[cur][0],RightStr(src,i));
if(pos=0)then i:=0;
if(pos<>0) then begin
pos:=pos+q-i;
i:=q-pos+1;
tmp:=LeftStr(src,pos-1)+P[cur][1]+RightStr(src,q-Length(P[cur][0])-pos+1);
if(sub=0) then
sub:=sub;
if(tmp='S') then
Result:=IntToStr(cur)+'[1]'
else begin
Result:=down(tmp,sub+1);
if(Result<>'') then
Result:=Result+IntToStr(cur)+'['+IntToStr(pos)+']';
end;
end;
i:=i-1;
end;
cur:=cur+1;
end;
end;
procedure TKursovaia.CompileClick(Sender: TObject);//Процедура компиляции включает:
var
state:Integer;
cur:Integer;
det:String;
i:Integer;
it:Array [1..32] of TTreeNode;
tit:TTreeNode;
numP:String;
num:String;
inumP:Integer;
inum:Integer;
j:Integer;
begin
Tree.Items.Clear;
state:=0;
cur:=1;
List.Clear;
Table1.ClearTable;
Graph.tmp:='';
while(cur<=Length(Text.text)) and (state<>-1) do begin//Лексический анализ
state:=Graph.sigma(state,Text.Text[cur]);
cur:=cur+1;
end;
if(state<>0) then begin
Text.SelStart:=cur-2;
Text.SelLength:=1;
if(Text.SelText='') then
Text.SelStart:=cur-3;
MessageBox(WindowHandle,'Ошибка в тексте','Ошибка',0);
end else begin //далее построение входной цепочки
for i:=0 to List.Items.Count-1 do
if(List.Items.Item[i].SubItems.Strings[1][1]<>'k') then
det:=det+LeftStr(List.Items.Item[i].SubItems.Strings[0],1);
det:=down(det,0); //проверка лексической структуры
if(det='') then
MessageBox(WindowHandle,'Ошибка в построении','Ошибка',0)
else begin
for i:=1 to 32 do
it[i]:=nil;
it[1]:=Tree.Items.Insert(nil,'S');
while(det<>'') do begin //Построение дерева вывода.
numP:='';
num:='';
while(det[1]<>'[') do begin
numP:=numP+det[1];
det:=RightStr(det,Length(det)-1);
end;
det:=RightStr(det,Length(det)-1);
while(det[1]<>']') do begin
num:=num+det[1];
det:=RightStr(det,Length(det)-1);
end;
det:=RightStr(det,Length(det)-1);
inum:=StrToInt(num);
inumP:=StrToInt(numP);
tit:=it[inum];
for i:=2 to Length(P[inumP][0]) do begin
j:=30;
while j>(inum) do begin
it[j+1]:=it[j];
j:=j-1;
end;
end;
for i:=0 to Length(P[inumP][0])-1 do
it[i+inum]:=Tree.Items.AddChild(tit,P[inumP][0][i+1]);
end;
i:=0;
j:=1;
while j<32 do begin
if(it[j]<>nil) then begin
if((it[j].Text='a')or(it[j].Text=';')or(it[j].Text=':')or(it[j].Text='f')or(it[j].Text='d')or(it[j].Text='(')or(it[j].Text=')')or(it[j].Text='<')or(it[j].Text='>')or(it[j].Text='=')) then begin
while(List.Items.Item[i].SubItems.Strings[1][1]='k') do i:=i+1;
it[j].Text := List.Items.Item[i].SubItems.Strings[1];
i:=i+1;
end;
end;
j:=j+1;
end;
end;
end;
end;
procedure TKursovaia.Button1Click(Sender: TObject);
begin
if(OpenDialog.Execute) then
Text.Lines.LoadFromFile(OpenDialog.Files.Strings[0]);
end;
end.