Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
02.05.2014
Размер:
132.61 Кб
Скачать

ПРИЛОЖЕНИЕ В

Исходный текст программы

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.

Соседние файлы в папке spo_sanya