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

Автор: Пользователь скрыл имя, 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 Кб (Скачать)

if(!SinAnalize()) {AnsiString strpoliz="";

                   for(int i=0;i<poliz.gsize();i++) {strpoliz+="<"; strpoliz+=i; strpoliz+="::";

                                                     switch (poliz[i].t)

                                                     {

                                                      case 0: {strpoliz+="#";strpoliz+=poliz[i].n;} break;

                                                      case 1: {strpoliz+=slova[poliz[i].n];} break;

                                                      case 2: {strpoliz+=ogran[poliz[i].n];} break;

                                                      case 3: {strpoliz+=chisla[poliz[i].n];} break;

                                                      case 4: {strpoliz+=ident[poliz[i].n];} break;

                                                      case 5: {strpoliz+=ident[poliz[i].n];} break;

                                                     }strpoliz+=">";}

                   errt(strpoliz);}}

//====================КНОПКА СОХРАНИТЬ=======================

void __fastcall TForm1::Button4Click(TObject *Sender)

{

if (FILE_NAME=="")

        {

        TSaveDialog* dlg=new TSaveDialog(this);

        if(dlg->Execute()){

            FILE_NAME=dlg->FileName;

            Memo2->Lines->SaveToFile(FILE_NAME);} }

else Memo2->Lines->SaveToFile(FILE_NAME);

}

//====================КНОПКА START============================

void __fastcall TForm1::Button5Click(TObject *Sender)

{

long mant (double x,int &p);

ST.erase();

strB x,y;

for(int i=0;i<poliz.gsize();i++) switch(poliz[i].t)

        {

        case 0: {

                x.m=poliz[i].n; x.p=0;

                ST.push(x);

                } break;

        case 1: {

                if(slova[poliz[i].n]=="ass")

                      { x=ST.pop();

                        y=ST.pop();

                        nid[y.m].zn=x;}

                else if (slova[poliz[i].n]=="or")

                      { x=ST.pop();

                        y=ST.pop();

                        if (x.p==0 && y.p==0 && (x.m || y.m)) {x.m=1; ST.push(x);}

                        else {x.m=0; ST.push(x);}}

                else if (slova[poliz[i].n]=="and")

                      { x=ST.pop();

                        y=ST.pop();

                        if (x.p==0 && y.p==0 && (x.m && y.m)) {x.m=1; ST.push(x);}

                        else {x.m=0; ST.push(x);}}

                else if (slova[poliz[i].n]=="not")

                      { x=ST.pop();

                        if (x.p==0 && x.m==1) x.m=0;

                        else x.m=1;

                        ST.push(x);}

                else if (slova[poliz[i].n]=="true")

                      { x.m=1;

                        x.p=0;

                        ST.push(x);}

                else if (slova[poliz[i].n]=="false")

                      { x.m=0;

                        x.p=0;

                        ST.push(x);}

                } break;

        case 2: {

                if (ogran[poliz[i].n]=="<>")

                       { x=ST.pop();

                         y=ST.pop();

                         if ((x.m==y.m && x.p==y.p) || (x.m==0&&y.m==0&&x.p!=y.p)) {x.m=0;x.p=0;ST.push(x);}

                         else {x.m=1; x.p=0; ST.push(x);}}

                else if (ogran[poliz[i].n]=="=")

                       { x=ST.pop();

                         y=ST.pop();

                         if ((x.m==y.m && x.p==y.p) || (x.m==0&&y.m==0&&x.p!=y.p)) {x.m=1;x.p=0;ST.push(x);}

                         else {x.m=0; x.p=0; ST.push(x);}}

                else if (ogran[poliz[i].n]=="<=")

                       { y=ST.pop();

                         x=ST.pop();

                         if (x.p<y.p) {x.m=1;x.p=0;ST.push(x);}

                         else if (x.m<=y.m && x.p==y.p) {x.m=1;x.p=0;ST.push(x);}

                         else {x.m=0; x.p=0; ST.push(x);}}

                else if (ogran[poliz[i].n]==">=")

                       { y=ST.pop();

                         x=ST.pop();

                         if (x.p>y.p) {x.m=1;x.p=0;ST.push(x);}

                         else if (x.m>=y.m && x.p==y.p) {x.m=1;x.p=0;ST.push(x);}

                         else {x.m=0; x.p=0; ST.push(x);}}

                else if (ogran[poliz[i].n]==">")

                       { y=ST.pop();

                         x=ST.pop();

                         if (x.p>y.p) {x.m=1;x.p=0;ST.push(x);}

                         else if (x.m>y.m && x.p==y.p) {x.m=1;x.p=0;ST.push(x);}

                         else {x.m=0; x.p=0; ST.push(x);}}

                else if (ogran[poliz[i].n]=="<")

                       { y=ST.pop();

                         x=ST.pop();

                         if (x.p<y.p) {x.m=1;x.p=0;ST.push(x);}

                         else if (x.m<y.m && x.p==y.p) {x.m=1;x.p=0;ST.push(x);}

                         else {x.m=0; x.p=0; ST.push(x);}}

                else if (ogran[poliz[i].n]=="+")

                       { y=ST.pop();

                         x=ST.pop();

                         if (x.p>y.p) for(;y.p!=x.p;x.p--) x.m*=10;

                         if (x.p<y.p) for(;y.p!=x.p;y.p--) y.m*=10;

                         x.m+=y.m;

                         if (x.m==0) x.p=0;

                         ST.push(x);}

                else if (ogran[poliz[i].n]=="-")

                       { y=ST.pop();

                         x=ST.pop();

                         if (x.p>y.p) for(;y.p!=x.p;x.p--) x.m*=10;

                         if (x.p<y.p) for(;y.p!=x.p;y.p--) y.m*=10;

                         x.m-=y.m;

                         if (x.m==0) x.p=0;

                         ST.push(x); }

                else if (ogran[poliz[i].n]=="*")

                       { y=ST.pop();

                         x=ST.pop();

                         x.p+=y.p;

                         x.m*=y.m;

                         if (x.m==0) x.p=0;

                         ST.push(x); }

                else if (ogran[poliz[i].n]=="/")

                       { y=ST.pop();

                         x=ST.pop();

                         if (y.m==0) {errt("ERROR 29:деление на ноль"); return ;}

                         x.p-=y.p;

                         double q1=x.m,q2=y.m;

                         q1/=q2;

                         x.m=mant(q1,x.p);

                         ST.push(x);}

               else if (ogran[poliz[i].n]=="!")

                       { y=ST.pop();

                         i=y.m-1;  }

                else if (ogran[poliz[i].n]=="!F")

                       { x=ST.pop();

                         y=ST.pop();

                        if (y.m==0) i=x.m-1;}

                else if (ogran[poliz[i].n]=="R")

                       { y=ST.pop();

                         void INP(int nomer);

                         INP(y.m);}

                else if (ogran[poliz[i].n]=="W")

                       { y=ST.pop();

                         void OUTP(strB x);

                         OUTP(y);

                       }

                } break;

        case 3: {

                ST.push(NUM[poliz[i].n]);

                } break;

        case 4: {

                ST.push(nid[poliz[i].n].zn);

                } break;

        case 5: {

                 x.m=poliz[i].n;

                 x.p=0;

                 ST.push(x);

                } break;

        }

}

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

void INP(int nomer)

{

long mant (double x,int &p);

AnsiString value="";

while (value=="") value=InputBox("Введите:"+nid[nomer].type,nid[nomer].id,"");

if (nid[nomer].type=="boolean")

        {

        if (value=="true") {nid[nomer].zn.m=1;nid[nomer].zn.p=0;}

        if (value=="false") {nid[nomer].zn.m=0;nid[nomer].zn.p=0;}

        if (value=="1") {nid[nomer].zn.m=1;nid[nomer].zn.p=0;}

        if (value=="0") {nid[nomer].zn.m=0;nid[nomer].zn.p=0;}

        }

else if (nid[nomer].type=="integer"){nid[nomer].zn.m=value.ToInt();

                                     nid[nomer].zn.p=0;}

else {double x=value.ToDouble();

      nid[nomer].zn.m= mant(x,nid[nomer].zn.p);}

}

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

void OUTP(strB x)

{

AnsiString a=">>";

if (x.p==0 &&(x.m==0 || x.m==1))

        {

        if (x.m==1) a+="true";

        else a+="false";

        }

else if (x.p==0) a+=x.m;

else {a+=x.m; a+="E"; a+=x.p;}

Form1->Memo4->Lines->Add(a);

}

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

long mant (double x,int &p)

{

while (fabs(x)>=1) {x/=10; p++;}

int i; double c;

for (i=0;i<9 && modf(x,&c)!=0;i++) {x*=10; p--;}

return floor(x+0.1);

} 
 
 
 
 

//////////////////////////UNIT ARRAY////////////////////////////////////////// 

#include<iostream.h>

#include <conio.h>

template <class D> class array

{

D *p;

int size;

//+++++++++++++++++++++++++++++

public:

array(int n=10)

      {size=n;

       p=new D[size];

  }

//+++++++++++++++++++++++++++++

array (const D a[],int n)

      {

      size=n;

      p=new D [size];

      for(int i=0;i<size;i++) p[i]=a[i];

      }

//+++++++++++++++++++++++++++++

~array() {delete [] p;}

//+++++++++++++++++++++++++++++

D & operator [] (int i)

      {

      if(i<0||i>=size)

            {

            cout<<"\nincorrect index array";

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