Таблица идентификаторов. Проектирование лексического анализатора

Автор работы: a********@inbox.ru, 26 Ноября 2011 в 21:08, лабораторная работа

Описание

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

Содержание

Введение 3
Организация таблицы идентификаторов 4
Исходные данные 4
Назначение таблиц идентификаторов 4
Метод простого рехэширования 6
Построение таблиц идентификаторов по методу бинарного дерева 8
Проектирование лексического анализатора 12
Исходные данные 12
Принципы работы лексического анализатора 13
Схема распознавателя 15
Результат работы лексического анализаора 16
Приложение 18
Код программы организации таблицы идентификаторов: 18
Код программы лексического анализатора 22
Блок-схема лексического анализатора 26

Работа состоит из  1 файл

курсовик2.doc

— 1.08 Мб (Скачать документ)

 Node *root = first(arr[0]);

 for (int i = 1; i<dim; i++)

 search_insert(root, arr[i]);

 CString simb=m_Edd;

 bool flag=false;

 findsimb(root, 0, simb, flag);

 if (result==-1) m_Tree="no found!"; else

 {m_Tree="comparisons "+(ToString(result));

 totaltree+=result;

 }

 flag=false;

 m_Statall="all comparisons "+(ToString(totaltree));

 

//Hash-Rehash//////////////////

 int id, id2;

 simb=m_Edd;

 id=hash(simb);

 id2=id;

 flag=false;

 cntr=0;

 compare=0;

 double a,b;

 while ((cntr<dim)&&(!flag)) {

 total+=1;

 compare+=1;

 if ((table[id]!="p")&&(table[id]==simb))

           {m_StatHash="FIND!!!!"; flag=true;

            m_StatCompare="comparisons " +ToString(compare);

            m_StatAll2="all comparisons " +ToString(total);

            a=compare; b=total;

            hsh=(a/b);

            a=result; b=totaltree;

            tre=(a/b);

            if (hsh<1) {

            m_StatHash=DoubleToString(hsh);

            m_StatMid=DoubleToString(tre);}

            else {m_StatHash=ToString(hsh);

            m_StatMid=ToString(tre);

            }

 cntr+=1;

 

 }

 else {cntr+=1; id=rehs(id2, cntr);}

 }

 result=0;

 if (!flag) {m_StatHash="no found!!!!"; m_Statall="";};

 UpdateData(false);

 };

 

void CLabaDlg::OnCancelBut()

{

 UpdateData(true);

 total=0;

 compare=0;

 itog=0;

 totaltree=0;

 m_StatAll2="all comparisons 0";

 m_StatHash="0";

 m_StatCompare="comparisons";

 m_Tree="comparisons";

 m_Statall="all comparisons 0";

 m_StatMid="0";

 UpdateData(false);

}

int hash(CString string)

{

 

int hs;

int h;

int rbc;

h=strlen(string);

rbc = h/2;

h=h-1;

hs = string[0]+string[rbc]+string[h];

return hs;}

 

int rehs(int id,int j)

{return (id+j)%366;

}

void CLabaDlg::OnBUTExit()

{ OnOK(); }

 

void CLabaDlg::OnButfindall()

{ UpdateData(TRUE);

 totaltree=0;

 result=0;

 bool flag=false;

 CString simb, ss;

 Node *root = first(arr[0]);

 for (int i = 1; i<dim; i++)

 search_insert(root, arr[i]);

 for (i=0; i<a;i++){

         simb=arr[i];

         flag=false;

         findsimb(root, 0, simb, flag);

         if (result==-1) m_Tree="no found!"; else

         {m_Tree="comparisons "+(ToString(result));

         totaltree+=result;

         }

 result=0;

 }

 flag=false;

 m_Tree="";

 m_Statall="all comparisons "+(ToString(totaltree));

 m_StatMid="middle "+ ToString(totaltree/a);

/////////////////////////////HASSSSHHHHH

int id, id2;

i=0; total=0;cntr=0; flag=false;

id=dim;

for (i=0; i<dim; i++){

 if (table[i]!="p"){

 simb=table[i];

 flag=false;

 id=hash(simb);

 id2=id;

 while ((cntr<dim)&&(!flag)){

 if (table[id]==simb) {

           flag=true;

           total+=1;

           }

 else {

 cntr+=1;

 id=rehs(id2, cntr);

 total+=1;}

 }

 cntr=0;

 }

}

 m_StatHash="middle " + ToString(total/a);

 m_StatCompare="total items "+ToString(a);

 m_StatAll2="comparisons "+ToString(total);

UpdateData(false);

 

Код программы лексического анализатора

 

int k=0;

CStdioFile myfile,myfile2;

CString ee,FilName ,q,a;

char *b = new char[];

bool flag=false;

int skobka=0;

int number=0;

bool mistake = false;

CString inputstring;

 

/****/

 
 

void CLaba22Dlg::OnOK()

{

 // TODO: Add extra validation here

 

 CDialog::OnOK();

}

CString ToString(int dig){

 const size_t newsize = 100;

 char nstring[newsize];

 itoa(dig,nstring, 10);

 CString cstring(nstring);

 

return cstring;

 

}

CString Conclude(char X)

{

if(X=='C')    return("operator cikla");//for

if(X=='G')    return("operator cikla"); //do

if(X=='L')    return("znak sravnenia");

if(X=='K')    return("razdelitel");

if(X=='F') return("prisvaevanie");

if(X=='O') return("celoe chislo");

if(X=='Q') return("drobnoe chislo");   

if(X=='W')    return("chislo s plavajushjaja tochka");

if(X=='U')   return("exp vid");

if(X=='M')    return("prisvaivanie");

if(X=='Y')    return("skobki");

if(X=='y')    return("skobki");

if(X=='i')   return("!!mistake!!");

if((X=='a')||(X=='B')||(X='D'))    return("identifier");

 

    else    return("!!mistake!!");

 

}

CString Analiz(char *wInput)

{

    int i = 0;

    CString Way= "h";

    char State = 'h';

    do {

        switch (State) {

 

   case 'h':

   switch (wInput[i]) {

   case 'f' : State = 'A'; break; //for

   case 'd' : State = 'D'; break; // do

   case ';' : State = 'K'; break;

   case '>' : State = 'L'; break;

   case '<' : State = 'L'; break;

   case '=' : State = 'L'; break;

   case ':' : State = 'E'; break;

   case '(' : State = 'Y'; break;

   case ')' : State = 'y'; break;

   case '0' : State = 'O'; break;

   case '1' : State = 'O'; break;

   case '2' : State = 'O'; break;

   case '3' : State = 'O'; break;

   case '4' : State = 'O'; break;

   case '5' : State = 'O'; break;

   case '6' : State = 'O'; break;

   case '7' : State = 'O'; break;

   case '8' : State = 'O'; break;

   case '9' : State = 'O'; break;

   case 'a' : State = 'a'; break;

   case 'b' : State = 'a'; break;

   case 'c' : State = 'a'; break; 

   case 'e' : State = 'a'; break;

   case 'g' : State = 'a'; break;

   case 'h' : State = 'a'; break;

   case 'i' : State = 'a'; break;

   case 'j' : State = 'a'; break;

   case 'k' : State = 'a'; break;

   case 'l' : State = 'a'; break;

   case 'm' : State = 'a'; break;

   case 'n' : State = 'a'; break;

   case 'o' : State = 'a'; break;

   case 'p' : State = 'a'; break;

   case 'q' : State = 'a'; break;

   case 'r' : State = 'a'; break;

   case 's' : State = 'a'; break;

   case 't' : State = 'a'; break;

   case 'u' : State = 'a'; break;

   case 'v' : State = 'a'; break;

   case 'w' : State = 'a'; break;

   case 'x' : State = 'a'; break;

   case 'y' : State = 'a'; break;

   case 'z' : State = 'a'; break;

   default : State = 'i'; break;

   }; Way=Way + State; break;

  

   case 'a':

   switch (wInput[i]) {

   case 'a' : State = 'a'; break;

   case 'b' : State = 'a'; break;

   case 'c' : State = 'a'; break;

   case 'd' : State = 'a'; break;

   case 'e' : State = 'a'; break;

   case 'f' : State = 'a'; break;

   case 'g' : State = 'a'; break;

   case 'h' : State = 'a'; break;

   case 'i' : State = 'a'; break;

   case 'j' : State = 'a'; break;

   case 'k' : State = 'a'; break;

   case 'l' : State = 'a'; break;

Информация о работе Таблица идентификаторов. Проектирование лексического анализатора