Автор: Пользователь скрыл имя, 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
if(!SinAnalize()) {AnsiString strpoliz="";
for(int i=0;i<poliz.gsize();i++) {strpoliz+="<"; strpoliz+=i; 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_
else Memo2->Lines->SaveToFile(FILE_
}
//====================КНОПКА
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[
if (nid[nomer].type=="boolean")
{
if (value=="true") {nid[nomer].zn.m=1;nid[nomer].
if (value=="false") {nid[nomer].zn.m=0;nid[nomer].
if (value=="1") {nid[nomer].zn.m=1;nid[nomer].
if (value=="0") {nid[nomer].zn.m=0;nid[nomer].
}
else if (nid[nomer].type=="integer"){
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";