По теории языков программирования и методов трансляции Разработка компилятора модельного языка

Автор: Пользователь скрыл имя, 19 Мая 2012 в 17:24, курсовая работа

Краткое описание

Теория формальных языков, грамматик и автоматов составляет фундамент синтаксических методов. Основы этой теории были заложены Н. Хомским в 40–50-е годы XX столетия в связи с его лингвистическими работами, посвященными изучению естественных языков. Но уже в следующем десятилетии синтаксические методы нашли широкое практическое применение в области разработки и реализации языков программирования.

Оглавление

Введение 3
1 Постановка задачи 4
2 Формальная модель задачи 5
3 Структура программы………………………………………………….....16
3.1 Лексический анализатор 16
3.2 Синтаксический анализатор 18
3.3 Семантический анализатор 20
3.4 Генерация ПОЛИЗа программы 22
3.5 Интерпритация ПОЛИЗа программы 24
4 Структурная организация данных 31
4.1 Спецификация входной информации 31
4.2 Спецификация выходной информации 31
4.3 Спецификация процедур и функций 31
5 Разработка алгоритма решения задачи 32
5.1 Укрупненная схема алгоритма программного средства 32
5.2 Детальная разработка алгоритмов отдельных подзадач 33
6 Установка и эксплуатация программного средства 34
7 Работа с программным средством 35
Заключение 36
Список использованных источников 37
Приложение А – Текст программы 38

Файлы: 1 файл

отчет3.doc

— 910.50 Кб (Скачать)

      return 0;}

}

//-----------вершина  дерева распознавания оператора------------------------

int verS(int beg,int fin)

{

if(ISTRUE(beg,fin)) return 100;

int t1,t2,t3,i,j,z;

TL x;   int p0,p1,p2;

beg=e(beg);

fin=re(fin);

for (i=beg;i<=fin && !(strlec(i)==":"||(strlec(i)=="13" && strlec(i-1)!=";" && strlec(i-1)!="13")) ;i++);

//|||||||||||||if||||||||||||||||||||||||

if (strlec(beg)=="if")

        {

        for (i=beg;i<=fin && strlec(i)!="then";i++);

        int fl=0;

        for (j=beg+1;j<=fin && !(strlec(j)=="else" && fl==0);j++)

               if(strlec(j)=="if") fl++; else if (strlec(j)=="else") fl--;

        if (i>fin) return 16;//нет then

        else if (j<i) return 17; //else <--> then

        else if (j<=fin) {

              t1=verE(beg+1,i-1);

              if(t1) return t1;

                if (stack.pop()!="boolean") return 18;

                        p1=poliz.gsize();

                        x.t=0; x.n=0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!F"); poliz.push(x);

              t2=verS(i+1,j-1);

              if(t2) return t2;

                        p2=poliz.gsize();

                        x.t=0; x.n=0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!"); poliz.push(x);

                        x.t=0; x.n=poliz.gsize(); poliz[p1]=x;

              t3=verS(j+1,fin);

              if(t3) return t3;

                        x.t=0; x.n=poliz.gsize(); poliz[p2]=x;

              return 0;}

        else if (j>fin){t1=verE(beg+1,i-1);

              if(t1) return t1;

                if (stack.pop()!="boolean") return 18;

                        p1=poliz.gsize();

                        x.t=0; x.n=0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!F"); poliz.push(x);

             t2=verS(i+1,fin);

             if(t2) return t2;

                        x.t=0; x.n=poliz.gsize(); poliz[p1]=x;

             return 0;}

        }

//|||||||||||||while|||||||||||||||||||||

else if (strlec(beg)=="while")

        {

        for (i=beg;i<=fin && strlec(i)!="do";i++);

        if (i>fin) return 19;//нет do

        else if (i==fin) return 20;//зацикливание

        else {

              p0=poliz.gsize();

              t1=verE(beg+1,i-1);

              if(t1) return t1;

                if (stack.pop()!="boolean") return 18;

                        p1=poliz.gsize();

                        x.t=0; x.n=0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!F"); poliz.push(x);

              t2=verS(i+1,fin);

              if(t2) return t2;

                        x.t=0; x.n=p0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!"); poliz.push(x);

                        x.t=0; x.n=poliz.gsize(); poliz[p1]=x;

              return 0;}

        }

else if (strlec(beg)=="for")

        {

        for (j=beg;j<=fin && strlec(j)!="to";j++);

        for (z=beg;z<=fin && strlec(z)!="do";z++); 

        if (strlec(beg+2)!="ass") return 21;//нет ass

        else if (j>fin) return 22;//нет to

        else if (z>fin) return 23;//нет do

        else if (lec[beg+1].t==4 && strlec(beg+2)=="ass" )

             {

             t1=verS(beg+1,j-1); //присватвание

              if(t1) return t1;

                        p0=poliz.gsize(); //заточка под while

                        x.t=4; x.n=lec[beg+1].n-1; poliz.push(x);

              t2=verE(j+1,z-1);

              if(t2) return t2;

                if(oper_ass(nid[lec[beg+1].n-1].type,stack.pop())) stack.erase(); else return 24;

                        x.t=2; x.n=ogran.find("<="); poliz.push(x);

                        p1=poliz.gsize();

                        x.t=0; x.n=0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!F"); poliz.push(x);

              t3=verS(z+1,fin);

              if(t3) return t3;

                        x.t=5; x.n=lec[beg+1].n-1; poliz.push(x);//i

                        x.t=4; x.n=lec[beg+1].n-1; poliz.push(x);//i

                        x.t=1; x.n=slova.find("true"); poliz.push(x);//1

                        x.t=2; x.n=ogran.find("+"); poliz.push(x);//+

                        x.t=1; x.n=slova.find("ass"); poliz.push(x);//ass

                        x.t=0; x.n=p0; poliz.push(x);

                        x.t=2; x.n=ogran.find("!"); poliz.push(x);

                        x.t=0; x.n=poliz.gsize(); poliz[p1]=x;

              return 0;}

        else return 100; //ошибка for

        }

//|||||||||||распознавание блока|||||||||||||||||

else if (i<fin){t1=verS(beg,i-1);

                t2=verS(i+1,fin);

                if(t1) return t1;

                else if(t2) return t2;

                else return 0;}

//|||||||||||read and write||||||||||||||

else if (strlec(beg)=="write")

     {if (strlec(beg+1)!="(" || strlec(fin)!=")") return 25;

      else   return verE2(beg+2,fin-1);}

else if (strlec(beg)=="read")

     {if (strlec(beg+1)!="(" || strlec(fin)!=")") return 26;

      else   {

              for (i=beg+3;i<=fin-1; i+=2)   if(strlec(i)!=",") return 6;

              for (i=beg+2;i<=fin-1; i+=2)   if(nid[lec[i].n-1].type=="") return 12;

              return verI1(beg+2,fin-1);

              }

     }

//||||||||||||||ass||||||||||||||||||||||

else if (lec[beg].t==4 && strlec(beg+1)=="ass")

        {if(typelec(beg)=="") return 12;/*пер не об*/

         x.t=5; x.n=lec[beg].n-1; poliz.push(x);

         t1=verE(beg+2,fin);

         if (t1) return t1;

         if(oper_ass(nid[lec[beg].n-1].type,stack.pop())) stack.erase(); else return 24;

         x.t=1; x.n=slova.find("ass"); poliz.push(x);    return 0;}

else return 27;}

//-----------вершина  дерева распознавания операторов-----------------------

int verS1(int beg,int fin){

int t1,t2;

int i;

if(ISTRUE(beg,fin)) return 100;

beg=e(beg);

while(strlec(fin)=="13") fin--;

for (i=beg;i<=fin && strlec(i)!=";";i++);

if (i>fin) return verS(beg,fin);

else {t1=verS(beg,i-1);

      t2=verS1(i+1,fin);

      if(t1) return t1;

      else if(t2) return t2;

      else return 0;}}

//------------вершина дерева распознавания программы-----------------------

int verP()

{

int tek=e(0),save,q;

while (strlec(tek)!="program" && tek<lec.gsize()) tek++;

if (strlec(tek)!="program") return 1;

tek=e(tek+1);

if(strlec(tek)!="var") return 2;

tek=e(tek+1);

save=tek;

while (strlec(save)!="begin"&&save<lec.gsize()) save++;

if(save!=lec.gsize()) {save--; while(strlec(save)=="13") save--;

   q=verD1(tek,save);}

else return 3;

if(q) return q;

tek=save;

while (strlec(save)!="begin"&&save<lec.gsize()) save++;

while (strlec(tek)!="end"&&tek<lec.gsize()) tek++;

if(tek!=lec.gsize())

q=verS1(save+1,tek-1);

else return 4;

if(q) return q;

tek=e(tek+1);

if(strlec(tek)!=".") return 5;

TL x;

x.t=2; x.n=ogran.find("."); poliz.push(x);

return 0;}

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

int SinAnalize()

{

int t=verP();

switch (t){

case 0: errt(""); break;

case 1: errt("ERROR 1: отсутствует program"); break;

case 2: errt("ERROR 2: отсутствует var"); break;

case 3: errt("ERROR 3: отсутствует begin"); break;

case 4: errt("ERROR 4: отсутствует end"); break;

case 5: errt("ERROR 5: отсутствует ."); break;

case 6: errt("ERROR 6: не  корректные идентификаторы"); break;

case 7: errt("ERROR 7: описание  не верно"); break;

case 8: errt("ERROR 8: нет типа в описании"); break;

case 9: errt("ERROR 9: нет  : в описании"); break;

case 10: errt("ERROR 10:повтор  в описании"); break;

case 11: errt("ERROR 11:отсутствует  ; в описании"); break;

case 12: errt("ERROR 12:идентификатор  не обьявлен"); break;

case 13: errt("ERROR 13:множитель не верен"); break;

case 14: errt("ERROR 14:не  совместимые типы операндов "); break;

case 15: errt("ERROR 15:ошибка выражений "); break;

case 16: errt("ERROR 16:нет then"); break;

case 17: errt("ERROR 17:then<-->else"); break;

case 18: errt("ERROR 18:условие if или while не bool"); break;

case 19: errt("ERROR 19:нет do для while"); break;

case 20: errt("ERROR 20:зацикливание while(нет оператора)"); break;

case 21: errt("ERROR 21:нет ass в for"); break;

case 22: errt("ERROR 22:нет to в for"); break;

case 23: errt("ERROR 23:нет do в for"); break;

case 24: errt("ERROR 24:не  совпадение типов присваивания"); break;

case 25: errt("ERROR 25:нет '(' или ')' в write "); break;

case 26: errt("ERROR 26:нет '(' или ')' в read"); break;

case 27: errt("ERROR 27:оператор не верен"); break;

case 28: errt("ERROR 28:баланс скобок нарушен"); break;

case 100: errt("ERROR 100:отсутствие  числа,идентификатора и т.д"); break;

default: errt("ERROR: ошибка  компилятора"); break;};

return t;}

//========================================================

AnsiString FILE_NAME;

//====================КНОПКА ОТКРЫТЬ======================

void __fastcall TForm1::Button2Click(TObject *Sender)

{

TOpenDialog* dlg=new TOpenDialog(this);

if(dlg->Execute()){

    Memo2->Clear();

    FILE_NAME=dlg->FileName;

    ifstream is(FILE_NAME.c_str(),ios::in);

    char t[100];

    while(is.getline(t,100,'\n'))

        Memo2->Lines->Add(t);

    }

}

//====================КНОПКА АНАЛИЗ=======================

void __fastcall TForm1::Button1Click(TObject *Sender)

{

text.erase(); chisla.erase(); ident.erase(); NUM.erase(); S.erase();

lec.erase(); nid.erase(); stack.erase(); poliz.erase();

finstr; nomersymbol=0;

Memo1->Clear(); Memo3->Clear();

for (int i=0;i<Memo2->Lines->Text.Length();i++)

if (Memo2->Lines->Text[i+1]!='\r') text.push(Memo2->Lines->Text[i+1]);

ifstream ts("1.txt",ios::in);

ifstream to("2.txt",ios::in);

char t[100];

while(ts.getline(t,100,'\n')) slova.push(t);

while(to.getline(t,100,'\n')) ogran.push(t);

LAnalize();

ident_to();

tab_to_poliz();

Информация о работе По теории языков программирования и методов трансляции Разработка компилятора модельного языка