Скачиваний:
24
Добавлен:
02.05.2014
Размер:
27.05 Кб
Скачать
#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 fl=0;
    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;
}
//---------------------------------------------------------------------------

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