Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект2 / Пояснительная Записка (v2.0).doc
Скачиваний:
47
Добавлен:
02.05.2014
Размер:
1.52 Mб
Скачать

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

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

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

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

3.5 Вывод

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

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

#include <vcl.h>

#include <stdio.h>

#include <math.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

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;

int node_count = 0;

int root_index = 0;

class TfrmMain::Identificator{

private:

int iHash;

public:

char *Name;

int Right;

int Left;

int HashERROR;

Identificator (){

Name = new char[32];

Right=0;

Left=0;

iHash=0;

HashERROR=0;

strcpy(Name,"");

}

int GetCollisionCount(){

return iHash-1;

}

int Hash(int N){

iHash++;

int t =((Name[0]|Name[strlen(Name)-1])+iHash);

t = fmod(t,N);

return t;

}

};

void TfrmMain::AddToTree(int IDindex,Identificator *IDTable){

if (node_count==0){

root_index = IDindex;

node_count++;

}else{

int fl=0;

int current_node = root_index;

do{

if (strcmp(IDTable[current_node].Name,IDTable[IDindex].Name)<0){

if(IDTable[current_node].Right!=0){

current_node = IDTable[current_node].Right;

}else{

IDTable[current_node].Right=IDindex;

node_count++;

fl=1;

}

}

if (strcmp(IDTable[current_node].Name,IDTable[IDindex].Name)>0){

if(IDTable[current_node].Left!=0){

current_node = IDTable[current_node].Left;

}else{

IDTable[current_node].Left=IDindex;

node_count++;

fl=1;

}

}

if (strcmp(IDTable[current_node].Name,IDTable[IDindex].Name)==0){

fl = 1;

}

}while(!fl);

}

}

void TfrmMain::ShowTree(Identificator *Table, int Length, TStringGrid *sgGrid){

sgGrid->Rows[0]->Add("№");

sgGrid->Rows[0]->Add("идентификатор");

sgGrid->Rows[0]->Add("Right");

sgGrid->Rows[0]->Add("Left");

int j = 0;

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

if (strlen(Table[i].Name)>0){

j++;

sgGrid->RowCount++;

sgGrid->Rows[j]->Add(i);

sgGrid->Rows[j]->Add(Table[i].Name);

sgGrid->Rows[j]->Add(IntToStr(Table[i].Right));

sgGrid->Rows[j]->Add(IntToStr(Table[i].Left));

}

}

int TfrmMain:: A(char ch){

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

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

else return 777;

}

int TfrmMain:: B(char ch){

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

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

else return 777;

}

int TfrmMain:: C(char ch){

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

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

else return 777;

}

int TfrmMain:: D(char ch){

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

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

else return 777;

}

int TfrmMain:: E(char ch){

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

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

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

else return 777;

}

int TfrmMain:: H(char ch){

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

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

else return 777;

}

int TfrmMain:: G(char ch){

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

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

else return 777;

}

int TfrmMain:: K(char ch){

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

else return 777;

}

int TfrmMain:: L(char ch){

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

else return 666;

}

int TfrmMain:: M(char ch){

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

else return 666;

}

int TfrmMain:: R(char ch){

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

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

else return 777;

}

int TfrmMain:: N(char ch){

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

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

else return 777;

}

int TfrmMain:: O(char ch){

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

else return 777;

}

int TfrmMain:: P(char ch){

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

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

else return 777;

}

int TfrmMain:: I(char ch){

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

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

else return 777;

}

int TfrmMain:: J(char ch){

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

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

else return 777;

}

int TfrmMain:: Q(char ch){

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

else return 777;

}

int TfrmMain:: V(char ch){

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

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

else return 777;

}

int TfrmMain:: W(char ch){

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

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

else return 777;

}

int TfrmMain:: X(char ch){

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

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

else return 777;

}

int TfrmMain:: Y(char ch){

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

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

else return 777;

}

int TfrmMain:: Z(char ch){

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

else return 777;

}

int TfrmMain:: T(char ch){

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

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

else return 777;

}

int TfrmMain:: U(char ch){

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

else return 777;

}

int TfrmMain:: F(char ch){

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

else return 666;

}

int TfrmMain:: AA(char ch){

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

else return 666;

}

int TfrmMain:: AM(char ch){

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

else return 666;

}

int TfrmMain:: AB(char ch){

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

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

else return 777;

}

int TfrmMain:: AC(char ch){

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

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

else return 777;

}

int TfrmMain:: AD(char ch){

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

else return 777;

}

int TfrmMain:: AG(char ch){

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

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

else return 777;

}

int TfrmMain:: AF(char ch){

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

else return 777;

}

int TfrmMain:: AH(char ch){

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

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

else return 777;

}

int TfrmMain:: AI(char ch){

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

else return 777;

}

int TfrmMain:: AE(char ch){

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

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

else return 777;

}

int TfrmMain:: AK(char ch){

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

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

else return 777;

}

int TfrmMain:: AL(char ch){

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

else return 777;

}

int TfrmMain:: AJ(char ch){

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

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

else return 777;

}

int TfrmMain:: AN(char ch){

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

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

else return 777;

}

int TfrmMain:: AO(char ch){

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

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

else return 777;

}

int TfrmMain:: AP(char ch){

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

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

else return 777;

}

int TfrmMain:: AQ(char ch){

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

else return 777;

}

int TfrmMain:: AR(char ch){

comment=1;

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

else return 666;

}

int TfrmMain:: AT(char ch){

comment = 0;

return 999;

}

int TfrmMain:: FF(char ch){

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

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

else return 666;

}

int TfrmMain:: AW(char ch){

if((ch=='0')||(ch=='1')) return 48;

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

else return 666;

}

int TfrmMain::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=='('||ch==')') return 27;

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

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=='1')) return 48;

if((ch>='2')&&(ch<='9')) return 666;

else return 777;

}

int TfrmMain:: 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 TfrmMain:: RR(char ch){

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

else return 666;

}

String TfrmMain::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 TfrmMain::TfrmMain(TComponent* Owner): TForm(Owner){

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

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

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

index_rule = 0;

}

void TfrmMain::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 TfrmMain::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 TfrmMain:: 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 TfrmMain::first_terminal(int count){

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

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

}

}

int TfrmMain::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 TfrmMain::sdvig(int count_s,int count_l){

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

}

int TfrmMain::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 TfrmMain::cmp_rules(String rls,int n){

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

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

}

return -1;

}

int TfrmMain::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 TfrmMain::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=="AR"){

input_line[i]="comment";

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 TfrmMain::Analiz(char *wInput,FILE *inp){

int i = 0;

int State=0;

String Way="h";

String last="";

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 48: State = AW(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);

if(last == "AT"){

String cmt;

fgets(cmt.c_str(),256,inp);

break;

}

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

return last;

}

int TfrmMain::Exists(Identificator *Idents, int IdentsLength, Identificator Lexem){

int t = 0;

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

if (strcmp(Idents[i].Name,Lexem.Name)==0)

t = 1;

}

return t;

}

void __fastcall TfrmMain::Button1Click(TObject *Sender){

int i=1;

char *temp;

temp = new char[32];

Lexems = new Identificator[256];

Identificator *Idents;

Idents = new Identificator[256];

FILE *inFile;

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

int j=0;

while (!feof(inFile)){

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

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

String last = Analiz(temp,inFile);

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

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

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

if ((input_line[i-1]=="c")&&(!Exists(Idents,255,Lexems[i]))){

strcpy(Idents[j].Name,Lexems[i].Name);

AddToTree(j,Idents);

j++;

}

i++;

input_line[i-1]="over";

sgrTable->RowCount = i;

}

ShowTree (Idents, i, sgBinTreeView);

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 TfrmMain::btnSearchClick(TObject *Sender){

cmp_count_tree=0;

cmp_count_rehash=0;

mResReHash->Clear();

mResTree->Clear();

int temp=SearchId(edSearch->Text.c_str(),TreeIdentTable);

if(temp>0){

mResTree->Lines->Add("Идентификатор найден:");

mResTree->Lines->Add("адрес в таблице символов ");

mResTree->Text=mResTree->Text+ IntToStr(temp);

mResTree->Lines->Add("Количество сравнений:");

mResTree->Text=mResTree->Text+ IntToStr(cmp_count_tree);

}

else mResTree->Lines->Add("Идентификатор не найден");

int id = HashIdSearch(HashIdentTable,HashTable, HashTableLen, edSearch->Text);

if(id>0){

mResReHash->Lines->Add("Идентификатор найден:");

mResReHash->Lines->Add("адрес в таблице символов ");

mResReHash->Text=mResReHash->Text + IntToStr(id);

mResReHash->Lines->Add("Количество сравнений:");

mResReHash->Text=mResReHash->Text+ IntToStr(cmp_count_rehash-1);

}

else mResReHash->Lines->Add("Идентификатор не найден");

}

void __fastcall TfrmMain::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]!="comment"){

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;}

}else

lines_index++;

}

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 TfrmMain::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 TfrmMain::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;

}

}

}

}

int TfrmMain::SearchId(char *ID,Identificator *IDTable){

int current_node = root_index;

do{

cmp_count_tree++;

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

if(IDTable[current_node].Left==0 && IDTable[current_node].Right==0) return -1;

else{

if (strcmp(IDTable[current_node].Name,ID)<0)

current_node = IDTable[current_node].Right;

else{

current_node = IDTable[current_node].Left;

}

}

}while(1);

}

int TfrmMain::NextHash(Identificator *ident, int *hashTable, int HashTableLength){

int t = ident->Hash(HashTableLength);

if (t>HashTableLength) return -1;

if (hashTable[t]==0) return t;

else NextHash(ident,hashTable,HashTableLength);

};

int *TfrmMain::MakeHashTable(Identificator *IdentTable, int IdentTableLength, int HashTableLength){

int *Hash;

Hash = new int[HashTableLength+1];

for (int i=0;i<=HashTableLength;i++) Hash[i] = 0;

for (int i=1;i<=IdentTableLength;i++){

int tmp = NextHash(&IdentTable[i],Hash,HashTableLength);

if (tmp==-1)

IdentTable[i].HashERROR = 1;

else

Hash[tmp] = i;

}

return Hash;

}

void TfrmMain::ShowTable(TStringGrid *sgGrid, int *hashTable, int HashTableLength){

sgGrid->Rows[0]->Add("Хэш-функция");

sgGrid->Rows[0]->Add("Адрес в табл. ид.");

int j=0;

for (int i=1;i<=HashTableLength;i++){

if (hashTable[i]!=0){

j++;

sgGrid->RowCount++;

sgGrid->Rows[j]->Add(i);

sgGrid->Rows[j]->Add(hashTable[i]);

}

}

}

int TfrmMain::HashIdSearch(Identificator *IdentTable, int *hashTable, int HashTableLength, AnsiString Name){

Identificator ID;

ID.Name = Name.c_str();

int tmp=0;

while (tmp <= HashTableLength){

tmp = ID.Hash(HashTableLength);

if (hashTable[tmp]!=0){

cmp_count_rehash++;

if (strcmp(IdentTable[hashTable[tmp]].Name,ID.Name)==0) {

cmp_count_rehash++;

return hashTable[tmp];

}

}

}

return 0;

}

void __fastcall TfrmMain::FormShow(TObject *Sender)

{

int IdentsCount=0;

char *temp;

temp = new char[32];

mInputFile->Lines->LoadFromFile("compare_input.txt");

HashTableLen = 255;

TreeIdentTable = new Identificator[256];

HashIdentTable = new Identificator[HashTableLen+1];

FILE *inFile;

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

while (!feof(inFile)){

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

strcpy(TreeIdentTable[IdentsCount].Name,temp);

strcpy(HashIdentTable[IdentsCount].Name,temp);

AddToTree(IdentsCount,TreeIdentTable);

IdentsCount++;

}

ShowTree (TreeIdentTable, IdentsCount-1, sgBinTreeViewCompare);

HashTable = MakeHashTable(HashIdentTable,IdentsCount,HashTableLen+1);

ShowTable(sgHashTable,HashTable,255);

collision_rehash = 0;

for (int i=1;i<=IdentsCount;i++){

if(HashIdentTable[i].GetCollisionCount()!=0)

collision_rehash++;

}

edCollision->Text = IntToStr(collision_rehash-1);

fclose(inFile);

node_count = 0;

root_index = 0;

}

14