Автор: Пользователь скрыл имя, 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
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)==
//|||||||||||||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-
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].
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<
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<
while (strlec(tek)!="end"&&tek<lec.
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:не
совпадение типов присваивания"
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.
if (Memo2->Lines->Text[i+1]!='\r'
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();