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

3.4 Результат выполнения программы

Результаты построения дерева разбора входных выражений представлены на рисунке 3.1.

Рис. 3.1 – Результаты построения дерева разбора

По последовательности правил «свертки» легко строится цепочка вывода и дерево синтаксического разбора. Дерево строится сверху вниз путем последовательного применения правил. Алгоритм разбора порождает правосторонний вывод.

3.5 Вывод

Была разработана программа, производящая построение дерева вывода заданных логических выражений и проверяющая их синтаксис.

Заключение

В результате выполнения курсовой работы для заданного входного языка были построены отдельные части компилятора.

В первой части работы был разработан программа, которая получает на входе набор идентификаторов, организует таблицу идентификаторов методом цепочек и методом бинарного дерева, позволяет осуществить многократный поиск идентификатора в этих таблицах.

Было также выявлено, что метод цепочек более эффективен, чем метод бинарного дерева, так как для поиска идентификатора в таблице организованной методом цепочек используется меньшее количество сравнений.

Во второй части работы была написана программа, которая выполняет лексический анализ входного текста и порождает таблицу лексем с указанием их типов и значений.

Третья часть курсовой работы была посвящена разработке программы, которая порождает таблицу лексем и выполняет синтаксический разбор текста с построением дерева разбора.

Отдельные части компилятора, разработаные в данной курсовой работе, дают представление о технике и методах, лежащих в основе по­строения компиляторов.

Список литературы

  1. Гордеев А. В. Молчанов Л. Ю. Системное программное обеспечение, – СПб.: Питер. 2002. – 734с.

  2. Кампапиец Р. II. Манькоп Е. В., Филатов Н. Е. Системное программирование. Основы построения трансляторов: Учеб. пособие для высших и средних учеб­ных заведений. – СПб.: КОРОНА Принт, 2000. – 256 с.

  3. Гордеев А. В. Операционные системы: Учебник для вузов. 2-е изд.–СПб.: Питер, 2004. – 416 с.

  4. Олифер В. Г., Олифер Н.А. Сетевые операционные системы. – СПб.: Питер. 2002. – 544 с.

Приложение а – Листинги программы

String input_line[256];

String stack[256];

String terminal[32];

String rules[32];

String input_rules[256];

int index_rule;

int **mega_matrix;

int all_rules=0;

int comment=0;

class TForm1:: Identificator // класс идентификатора

{

public:

char *Name;

int Right;

int Left;

Identificator ()

{

Name = new char[32];

Right=0;

Left=0;

}

int Hash()

{

return (Name[0]|Name[strlen(Name)-1]);

}

};

int TForm1::AddToHashTableChane(int IDindex,Identificator *IDTable,int *HashTable)

{ //добавление ид-ра в таблицу методом цепочек

if (!HashTable[IDTable[IDindex].Hash()])

{

HashTable[IDTable[IDindex].Hash()]=IDindex;

mTextChane->Lines->Add((IDTable[IDindex].Name));

mTextChane->Text=mTextChane->Text+ "-> в хэш ";

}

else

{

mTextChane->Lines->Add((IDTable[IDindex].Name));

mTextChane->Text=mTextChane->Text+ " коллизия ";

int HashIndex = HashTable[IDTable[IDindex].Hash()];

int fl=0;

colis_chane++;

do

{

mTextChane->Text=mTextChane->Text+ "R";

if(IDTable[HashIndex].Right!=0)

{

HashIndex = IDTable[HashIndex].Right;

colis_chane++;

}

else

{

IDTable[HashIndex].Right=IDindex;

fl=1;

}

}while(!fl);

}

}

int TForm1::SearchIdChane(char *ID,Identificator *IDTable,int *HashTable) // поиск в табл. метода цепочек

{

int HashID=ID[0]|ID[strlen(ID)-1];

if (!HashTable[HashID])

{

return -1;

}

else

{

int HashIndex = HashTable[HashID];

int fl=0;

cmp_count_chane = 1;

do

{

cmp_count_chane++;

if (strcmp(IDTable[HashIndex].Name,ID)==0) return(HashIndex);

else

{

if (strcmp(IDTable[HashIndex].Name,ID)!=0)

if(IDTable[HashIndex].Right!=0) HashIndex = IDTable[HashIndex].Right;

else return -1;

}

}while(1);

}

}

int TForm1:: A(char ch) // функции состояния автомата

{

if(ch=='r') return 2;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: B(char ch)

{

if(ch=='o') return 3;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: C(char ch)

{

if(ch=='g') return 4;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: D(char ch)

{

if(ch=='\0') return 999;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: E(char ch)

{

if(ch=='n') return 6;

if(ch=='l') return 11;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: H(char ch)

{

if(ch=='d') return 7;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: G(char ch)

{

if(ch=='.') return 8;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: K(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: L(char ch)

{

if(ch=='=') return 10;

else return 666;

}

int TForm1:: M(char ch)

{

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: R(char ch)

{

if(ch=='s') return 23;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: N(char ch)

{

if(ch=='f') return 13;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: O(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: P(char ch)

{

if(ch=='h') return 15;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: I(char ch)

{

if(ch=='e') return 16;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: J(char ch)

{

if(ch=='n') return 17;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: Q(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: V(char ch)

{

if(ch=='e') return 19;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: W(char ch)

{

if(ch=='g') return 20;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: X(char ch)

{

if(ch=='i') return 21;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: Y(char ch)

{

if(ch=='n') return 22;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: Z(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: T(char ch)

{

if(ch=='e') return 24;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: U(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: F(char ch)

{

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: FF(char ch)

{

if(ch=='-') return 26;

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: AA(char ch)

{

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: AM(char ch)

{

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: AB(char ch)

{

if(ch=='n') return 29;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AC(char ch)

{

if(ch=='d') return 30;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AD(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AG(char ch)

{

if(ch=='r') return 32;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AF(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AH(char ch)

{

if(ch=='o') return 34;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AI(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AE(char ch)

{

if(ch=='o') return 36;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AK(char ch)

{

if(ch=='t') return 37;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AL(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AJ(char ch)

{

if(ch=='h') return 39;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AN(char ch)

{

if(ch=='i') return 40;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AO(char ch)

{

if(ch=='l') return 41;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AP(char ch)

{

if(ch=='e') return 42;

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AQ(char ch)

{

if(ch=='\0') return 999;

else return 777;

}

int TForm1:: AR(char ch)

{

if(ch=='*') return 45;

else return 666;

}

int TForm1:: AT(char ch)

{

comment=1;

if(ch=='*') return 46;

else return 45;

}

int TForm1:: AU(char ch)

{

if(ch=='/') return 47;

else return 45;

}

int TForm1:: AV(char ch)

{

if(ch=='\0') {comment=0; return 999;}

else return 666;

}

int TForm1:: AW(char ch)

{

if((ch>='0')&&(ch<='9')) return 48;

if((ch>='a')&&(ch<='f')) return 49;

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: AX(char ch)

{

if((ch>='0')&&(ch<='9')) return 49;

if((ch>='a')&&(ch<='f')) return 49;

if(ch=='\0') return 999;

else return 666;

}

int TForm1::h(char ch)

{

if(ch=='p') return 1;

if(ch=='e') return 5;

if(ch==':') return 9;

if(ch=='i') return 12;

if(ch=='t') return 14;

if(ch=='b') return 18;

if(ch=='a') return 28;

if(ch=='o') return 31;

if(ch=='-') return 50;

if(ch=='('||ch==')') return 27;

if(ch=='+'||ch=='<'||ch=='>'||ch=='=') return 25;

if(ch=='d') return 33;

if(ch=='n') return 35;

if(ch=='/') return 43;

if(ch==';') return 51;

if(ch=='w') return 38;

if((ch>='0')&&(ch<='9')) return 48;

else return 777;

}

int TForm1:: IDF(char ch)

{

if((ch>='0')&&(ch<='9')) return 777;

if((ch>='a')&&(ch<='z')) return 777;

if(ch=='\0') return 999;

else return 666;

}

int TForm1:: RR(char ch)

{

if(ch=='\0') return 999;

else return 666;

}

String TForm1::GetState(int st) // функция определение состояния автомата по его номеру

{

String res;

switch(st) {

case 0: res = "h"; break;

case 1: res = "A"; break;

case 2: res = "B"; break;

case 3: res = "C"; break;

case 4: res = "D"; break;

case 5: res = "E"; break;

case 6: res = "H"; break;

case 7: res = "G"; break;

case 8: res = "K"; break;

case 9: res = "L"; break;

case 10: res = "M"; break;

case 11: res = "R"; break;

case 12: res = "N"; break;

case 13: res = "O"; break;

case 14: res = "P"; break;

case 15: res = "I"; break;

case 16: res = "J"; break;

case 17: res = "Q"; break;

case 18: res = "V"; break;

case 19: res = "W"; break;

case 20: res = "X"; break;

case 21: res = "Y"; break;

case 22: res = "Z"; break;

case 23: res = "T"; break;

case 24: res = "U"; break;

case 25: res = "F"; break;

case 26: res = "AA"; break;

case 27: res = "AM"; break;

case 28: res = "AB"; break;

case 29: res = "AC"; break;

case 30: res = "AD"; break;

case 31: res = "AG"; break;

case 32: res = "AF"; break;

case 33: res = "AH"; break;

case 34: res = "AI"; break;

case 35: res = "AE"; break;

case 36: res = "AK"; break;

case 37: res = "AL"; break;

case 38: res = "AJ"; break;

case 39: res = "AN"; break;

case 40: res = "AO"; break;

case 41: res = "AP"; break;

case 42: res = "AQ"; break;

case 43: res = "AR"; break;

case 45: res = "AT"; break;

case 46: res = "AU"; break;

case 47: res = "AV"; break;

case 48: res = "AW"; break;

case 49: res = "AX"; break;

case 50: res = "FF"; break;

case 51: res = "RR"; break;

case 777: res = "IDF"; break;

case 666 :res="Err"; break;

case 999 :res="S"; break;

}

return res;

}

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

sgrTable->Rows[0]->Add("Лексема");

sgrTable->Rows[0]->Add("Тип лексемы");

sgrTable->Rows[0]->Add("Лексема");

index_rule = 0;

}

//---------------------------------------------------------------------------

void TForm1::AddTerminal(String filename) // считывание терминальных символов

{

FILE *input;

char *temp;

temp = new char[32];

input = fopen(filename.c_str(),"r");

int i=0;

while (strcmp(temp,"over"))

{

fscanf(input,"%s",temp);

terminal[i]=temp;

i++;

}

terminal[i]="#";

for(int j=0;j<i;j++) {

sgMatrix->Cols[j+1]->Add(terminal[j]);

if(terminal[j]=="over") sgMatrix->Rows[j+1]->Add("bgn");

else sgMatrix->Rows[j+1]->Add(terminal[j]);

}

sgMatrix->ColCount = i+1;

sgMatrix->RowCount = i+1;

AddMatrix(input,i);

fclose(input);

}

void TForm1::AddMatrix(FILE *input,int n) // считывание матрицы предшествования

{

int i=0;

char *temp;

temp = new char [32];

mega_matrix = new int *[n];

for (int i = 0; i < n; i++)

mega_matrix[i] =new int[n];

while(!feof(input))

{

fscanf(input,"%s",temp);

for(int j=0;j<n;j++) {

fscanf(input,"%s",temp);

if(temp[0]=='<') mega_matrix[i][j] = 1;

if(temp[0]=='>') mega_matrix[i][j] = 2;

if(temp[0]=='=') mega_matrix[i][j] = 0;

if(temp[0]=='-') mega_matrix[i][j] = -1;

sgMatrix->Cells[j+1][i+1] = temp;

}

i++;

}

}

int TForm1:: index_terminal(String trm) // функция определния индекса терминала в массиве терм. симв.

{

int count=0;

if(trm=="bgn") trm = "over";

while(terminal[count]!="#") {

if(trm==terminal[count]) return count;

count++;

}

return -1;

}

int TForm1::first_terminal(int count) // функция возвращает первый терминальный символ в стеке

{

for(int i=count;i!=0;i--)

{

if(index_terminal(stack[i])!=-1) return i;

}

}

int TForm1::cmp_substr(String sub1, String sub2) // функция сравнения двух символов

{

if(index_terminal(sub1)>=0&&index_terminal(sub2)>=0)

return mega_matrix[index_terminal(sub1)][index_terminal(sub2)];

else return -1;

}

void TForm1::sdvig(int count_s,int count_l) // функция сдвига

{

stack[count_s+1]=input_line[count_l];

}

int TForm1::AddRules() // функция добавления правил грамматики

{

char *temp = new char [32];

FILE *input = fopen("Rules.txt","r");

int i=0;

while(!feof(input))

{

fgets(temp,256, input);

rules[i] = String(temp);

rules[i].SetLength(rules[i].Length()-1);

while(rules[i].Pos(" ")) {rules[i].Delete(rules[i].Pos(" "),1);}

i++;

}

return i;

}

int TForm1::cmp_rules(String rls,int n) //функция сравнение правил

{

for(int i=0;i<n;i++)

{

if(rls==rules[i]) return i;

}

return -1;

}

int TForm1::package(int count_st,int n) //функция свертки

{

String trm,tV,Vt,VVt,V;

int ftrm = first_terminal(count_st);

trm = stack[ftrm];

tV = trm + stack[ftrm+1];

Vt = stack[ftrm-1] + trm;

V = stack[ftrm-1] + trm + stack[ftrm+1];

VVt = stack[ftrm-2]+ stack[ftrm-1]+trm;

if(cmp_rules(trm,n)>=0)

{

int rez = cmp_rules(trm,n);

stack[ftrm]="S";

input_rules[index_rule]=IntToStr(rez);

index_rule++;

return 0;

}

if(cmp_rules(V,n)>=0)

{

int rez = cmp_rules(V,n);

String right_empty = stack[ftrm+1];

stack[ftrm-1]="S";

stack[ftrm]="";

stack[ftrm+1]="";

input_rules[index_rule]=IntToStr(rez);

index_rule++;

if(right_empty=="") return 1; else return 2;

}

if(cmp_rules(Vt,n)>=0)

{

int rez = cmp_rules(Vt,n);

stack[ftrm-1]="S";

stack[ftrm]="";

input_rules[index_rule]=IntToStr(rez);

index_rule++;

return 1;

}

if(cmp_rules(tV,n)>=0)

{

int rez = cmp_rules(tV,n);

stack[ftrm]="S";

stack[ftrm+1]="";

input_rules[index_rule]=IntToStr(rez);

index_rule++;

return 1;

}

if(cmp_rules(VVt,n)>=0)

{

int rez = cmp_rules(VVt,n);

stack[ftrm-2]="S";

stack[ftrm-1]="";

stack[ftrm]="";

input_rules[index_rule]=IntToStr(rez);

index_rule++;

return 2;

}

return -1;

}

String TForm1::Conclude(String X,char *temp,int i) // определение типа лексемы

{

if(X=="AM") {

input_line[i]=AnsiString(temp);

return("Круглая скобка");

}

if(X=="RR") {

input_line[i]=AnsiString(temp);

return("Разделительный символ");

}

if(X=="AX") {

input_line[i]="g";

return("Константа");

}

if(X=="F" || X=="FF" || X=="AA") {

input_line[i]=AnsiString(temp);

return("Знак операции");

}

if(X=="AD" || X=="AL" || X=="AF") {

input_line[i]=AnsiString(temp);

return("Логическая операция");

}

if(X=="G" || X=="M" || X=="O" || X=="Q"|| X=="U"|| X=="Z"||X=="AI"||X=="AQ") {

input_line[i]=AnsiString(temp);

return("Оператор");

}

if(X=="AT" || X=="AV") return("Комментарий");

if(X=="D" || X=="K") {

input_line[i]=AnsiString(temp);

return("Слово начала/конца программы");

}

if(X=="AW") {

input_line[i]="g";

return("Число");

}

if(X=="Err") return("Ошибка");

else {

input_line[i]="c";

return("Идентификатор");

}

}

String TForm1::Analiz(char *wInput) // функция анализа лексемы

{

int i = 0;

int State=0;

String Way="h";

String last="";

if(comment==1) State = 45;

do {

switch (State) {

case 0: State = h(wInput[i]); break;

case 1: State = A(wInput[i]); break;

case 2: State = B(wInput[i]); break;

case 3: State = C(wInput[i]); break;

case 4: State = D(wInput[i]); break;

case 5: State = E(wInput[i]); break;

case 6: State = H(wInput[i]); break;

case 7: State = G(wInput[i]); break;

case 8: State = K(wInput[i]); break;

case 9: State = L(wInput[i]); break;

case 10: State = M(wInput[i]); break;

case 11: State = R(wInput[i]); break;

case 12: State = N(wInput[i]); break;

case 13: State = O(wInput[i]); break;

case 14: State = P(wInput[i]); break;

case 15: State = I(wInput[i]); break;

case 16: State = J(wInput[i]); break;

case 17: State = Q(wInput[i]); break;

case 18: State = V(wInput[i]); break;

case 19: State = W(wInput[i]); break;

case 20: State = X(wInput[i]); break;

case 21: State = Y(wInput[i]); break;

case 22: State = Z(wInput[i]); break;

case 23: State = T(wInput[i]); break;

case 24: State = U(wInput[i]); break;

case 25: State = F(wInput[i]); break;

case 26: State = AA(wInput[i]); break;

case 27: State = AM(wInput[i]); break;

case 28: State = AB(wInput[i]); break;

case 29: State = AC(wInput[i]); break;

case 30: State = AD(wInput[i]); break;

case 31: State = AG(wInput[i]); break;

case 32: State = AF(wInput[i]); break;

case 33: State = AH(wInput[i]); break;

case 34: State = AI(wInput[i]); break;

case 35: State = AE(wInput[i]); break;

case 36: State = AK(wInput[i]); break;

case 37: State = AL(wInput[i]); break;

case 38: State = AJ(wInput[i]); break;

case 39: State = AN(wInput[i]); break;

case 40: State = AO(wInput[i]); break;

case 41: State = AP(wInput[i]); break;

case 42: State = AQ(wInput[i]); break;

case 43: State = AR(wInput[i]); break;

case 45: State = AT(wInput[i]); break;

case 46: State = AU(wInput[i]); break;

case 47: State = AV(wInput[i]); break;

case 48: State = AW(wInput[i]); break;

case 49: State = AX(wInput[i]); break;

case 50: State = FF(wInput[i]); break;

case 51: State = RR(wInput[i]); break;

case 777: State = IDF(wInput[i]); break;

case 999: State = IDF(wInput[i]); break;

case 666 : break;

}

Way=Way +"-"+GetState(State);

if(GetState(State)!="S") last = GetState(State);

}while (wInput[i++]!='\0');

return last;

}

void __fastcall TForm1::Button1Click(TObject *Sender) // непосредственно загрузка входного текста

{

colis_chane=0;

int i=1;

char *temp;

temp = new char[32];

TableChane = new Identificator[256];

FILE *inFile;

inFile=fopen("input.txt","r");

for (int i=0;i<=255;i++){HashTableChane[i]=0;}

mTextChane->Lines->Clear();

while (!feof(inFile))

{

fscanf(inFile, "%s", temp);

strcpy(TableChane[i].Name,temp);

AddToHashTableChane(i,TableChane,HashTableChane);

String last = Analiz(temp);

sgrTable->Rows[i]->Add(temp);

sgrTable->Rows[i]->Add(Conclude(last,temp,i-1));

sgrTable->Rows[i]->Add(input_line[i-1]);

i++;

input_line[i-1]="over";

sgrTable->RowCount = i;

}

fclose(inFile);

String Way;

mSource->Lines->LoadFromFile("input.txt");

mSource2->Lines->LoadFromFile("input.txt");

mRules->Lines->LoadFromFile("Rules.txt");

AddTerminal("hyper_matrix.txt");

all_rules = AddRules();

int count_stack;

stack[0] = "bgn";

Button3->Enabled = true;

}

void __fastcall TForm1::Button3Click(TObject *Sender) // строим цепочку вывода

{

int stack_index = 0;

int lines_index = 0;

stack[0]="bgn";

String temp;

int cmp_rez;

int left;

int fl = 0;

while(1)

{

if((input_line[lines_index]=="over") && (stack[1]=="S") && (stack[2]=="")) break;

cmp_rez = cmp_substr(stack[first_terminal(stack_index)],input_line[lines_index]);

if(cmp_rez==1 || cmp_rez==0)

{

sdvig(stack_index,lines_index);

lines_index++;

stack_index++;

}

if(cmp_rez==2)

{

left = package(stack_index,all_rules);

if(left == -1) {fl=1; break; }

else stack_index= stack_index - left;

}

if(cmp_rez==-1) {fl=1; break; }

}

if (fl==1) {

Edit1->Text= "Неправильная конструкция";

} // далее можно поставить нужный разделительный символ (сейчас пробел " ")

else for(int k = 0; k< index_rule; k++) temp += IntToStr(StrToInt(input_rules[k])+1) + " ";

Edit1->Text=temp;

Button4->Enabled = true;

}

void TForm1::AddChild(String child,int ind_item) // добавление листьев к дереву

{

int lenght = child.Length();

char *rezult_child;

String temp_string="";

rezult_child = new char [lenght];

TTreeNode *Node1;

Node1 = tree->Items->Item[ind_item];

strcpy(rezult_child,child.c_str());

for(int i=0;i<lenght;i++)

{

temp_string = temp_string + rezult_child[i];

if(temp_string=="S")

{

tree->Items->AddChild(Node1,temp_string);

temp_string="";

}

if(rezult_child[i+1]!='.')

if(index_terminal(temp_string)>=0)

{

tree->Items->AddChild(Node1,temp_string);

temp_string="";

}

}

}

void __fastcall TForm1::Button4Click(TObject *Sender) // строим дерево

{

TTreeNode *Node1;

tree->Items->Clear();

tree->Items->Add(NULL, "S");

Node1 = tree->Items->Item[0];

for(int j = index_rule; j>0 ;j--)

{

int n = tree->Items->Count;

for (int i=n-1;i>=0 ;i--)

{

if(tree->Items->Item[i]->HasChildren == false)

if(tree->Items->Item[i]->Text =="S")

{

AddChild(rules[StrToInt(input_rules[j-1])],i);

break;

}

}

}

}

//---------------------------------------------------------------------------

14

Соседние файлы в папке Курсовой проект [Вариант 12-13]