курсовая 2. 1 Постановка задачи 4 2 Формальная модель задачи 5
Скачать 0.89 Mb.
|
4 Структурная организация данных 4.1 Спецификация входной информации
4.2 Спецификация выходной информации
4.3 Спецификация процедур и функций
5 Разработка алгоритма решения задачи 5.1 Укрупненная схема алгоритма программного средства Укрупненная схема алгоритма программного средства представлена на рисунке 5.1. 1 – лекс анализ 2 – Син и Сем анализы 3 - ПОЛИЗ 4 - интерпритатор 1 2 3 4 Рисунок 5.1 – Укрупненная схема алгоритма программного средства 5.2 Детальная разработка алгоритмов отдельных подзадач Схема алгоритма интерпретатора программы: Рисунок 5.2 – Схема алгоритма интерпретатора программы 6 Установка и эксплуатация программного средства Программное средство занимает 2,63 МБ памяти на жестком диске, для работы необходимо 12 000 000 байт оперативной памяти. Чтобы начать работу с программным средством, необходимо запустить приложение «Project1.exe». Программное средство находится в папке prog вместе с используемыми файлами, которую достаточно скопировать в нужный каталог. Работает на Windows 95/98/NT/Me/XP/Vista. 7 Пример работы программы Заключение При выполнении курсовой работы были практически исследованы основы классической теории формальных языков, грамматик и автоматов. Были опробованы принципы и методы разработки компиляторов, а также формальные методы описания перевода. Разработали на языке программирования С++ в системе Borland С++ Builder 6.0 программное средство «Компилятор модельного языка». В процессе работы над данным программным средством выработал навыки самостоятельного решения инженерных задач. Программное средство способно выполнять следующие функции: - ввод и редактирование текста программ, написанных на определенном модельном языке; - производить лексический анализ программ; - выполнять синтаксическую и семантическую проверку программ; - переводить программы в обратную польскую запись; - интерпретировать программы на модельном языке, записанных в форме ПОЛИЗа. Программное средство протестировано на различных программах, написанных на модельном языке. Программное средство безошибочно производить лексический анализ программ, выполняет синтаксическую и семантическую проверку программ, переводить программы в обратную польскую запись, интерпретирует программы на модельном языке, записанных в форме ПОЛИЗа. Таким образом, поставленная цель курсовой работы достигнута. Список использованных источников 1 Ахо, А.В. Компиляторы: принципы, технологии и инструменты [Текст]: / А. Ахо, Р. Сети, Д. Ульман; перевод с англ. И.В. Красикова и др. - М.: Вильямс, 2001. - 767 с.: ил.; 24 см. - Библиогр.: с. 742-763. - Предм. указ.: 764-767. - 5000 экз. - ISBN 5-8459-0189-8 (в пер.). 2 Власенко, А.В. Теория языков программирования и методы трансляции [Текст]: учеб. пособие / А.В. Власенко, В.И. Ключко; М-во образования и науки РФ, ГОУ ВПО «Кубан. гос. технол. ун-т». - Краснодар: Изд-во КубГТУ, 2004. - 119 с.: ил.; 21 см. - Библиогр.: с. 118. - 75 экз. - ISBN 5-8333-0176-9. 3 Гордеев, А.В. Системное программное обеспечение [Текст]: учеб. для вузов / А. В. Гордеев, А.Ю. Молчанов; под. общ. ред. А.В. Гордеева. – СПб.: Питер, 2001. - 734 с.: ил.; 24 см. - Библиогр.: с. 719-724. – 5000 экз. – ISBN 5-272-00341-1 (в пер.). 4 Ишакова Е.Н. Теория языков программирования и методов трансляции: учебное пособие / Е.Н. Ишакова. – Оренбург: ИПК ГОУ ОГУ, 2007. – 137 с.-300 экз.- ISBN978-57410-0712-9. 5 Калинин, А.Г. Универсальные языки программирования: Семантический подход [Текст] / А.Г. Калинин, И.В. Мацкевич. – М.: Радио и связь, 1991. - 398, [1] с.: ил.; 21 см. - Библиогр.: с. 395-398. – 10000 экз. – ISBN 5-256-00638-X (в пер.). Приложение A Текст программы //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" #include #include #include #include "array.cpp" #include #include #include TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){} //=================================1========================================= //символ считываемый char CH; //структура мантиса и порядок struct strB{ long m; int p;}; strB B; array array array array array array array enum typeCS1 {lA,lB,lC,lD,lE,lF,lJ,lO,lCHISLO,lERR,lEND}; //состояния автомата enum typeCS2 {l0,l1,l2,l3,l4,l5,l6,l7,ERR,V}; //состояние автомата определения чисел typeCS1 CS1;typeCS2 CS2; int finstr=0; //--------------------------------------------------------------------------- int let() {return isalpha(CH);} int digit() {return isdigit(CH);} int hexdigit() {return (digit()||CH=='A'||CH=='B'||CH=='C'||CH=='D'||CH=='E'||CH=='F'||CH=='a'||CH=='b'||CH=='c'||CH=='d'||CH=='e'||CH=='f');} int nomersymbol=0; int gc() {if(nomersymbol else {CH=' ';return 1;}} void retgc(){nomersymbol--;} //--------------------------------------------------------------------------- void AddTab(int numT){ AnsiString temp=""; for (int i=0;i switch (numT) { case 3: {chisla.push(temp);}break; case 4: {ident.push(temp);}break; }} //--------------------------------------------------------------------------- struct TL{int t;int n;}; //--------------------------------------------------------------------------- array //--------------------------------------------------------------------------- void outlec(int numT,int numL){ TL l; t=numT; l.n=numL; lec.push(l); AnsiString temp="("; temp+=numT; temp+=',';temp+=numL;temp+=')';temp+=' '; for (int i=0;i Form1->Memo1->Lines->Add(temp); finstr++;} //--------------------------------------------------------------------------- int AnalizeChislo(){ CS2=l0; int syscount=10; S.erase(); bool znak=true; int por=0; do switch (CS2) {case l0:{B.m=0; B.p=0; if(digit()) CS2=l3; if(CH=='.') {CS2=l1; S.push(CH);}}break; case l1:{gc(); if(digit()) {B.p--; B.m=B.m*10+atoi(&CH); CS2=l2; S.push(CH);} else CS2=ERR;} break; case l2:{gc(); AnsiString og=""; og+=CH; if(digit()) {B.p--; B.m=B.m*10+atoi(&CH); S.push(CH);} else if (CH=='E'||CH=='e') {CS2=l5; S.push(CH);} else if (ogran.find(og)>=0||CH=='\n') {CS2=V; retgc();} else CS2=ERR; if (!digit()) while(B.m%10==0 && B.m!=0) {B.m=B.m/10; B.p++;} } break; case l3:{AnsiString mantisa=""; if (CH=='1'||CH=='0') {while(CH=='1'||CH=='0') {S.push(CH);gc();} syscount=2;} if (CH<'8'&&CH>='0') {while (CH<'8'&&CH>='0') {S.push(CH);gc();} syscount=8;} if (digit()) {while(digit()) {S.push(CH);gc();} syscount=10;} gc(); char next=CH; retgc(); retgc(); gc(); if ((ogran.find(CH)>=0 || CH=='\n' || CH==' ' || CH=='\t')&&syscount<=10 && CH!='.') { for (int i=0;i char **q=new char*; B.m=(long)strtol(mantisa.c_str(),q,10) ; retgc(); CS2=V; } else if ((ogran.find(next)>=0 || next=='\n' || next==' ' || next=='\t')&&(CH=='b'||CH=='B'||CH=='d'||CH=='D'||CH=='o'||CH=='O')) { S.push(CH); for (int i=0;i char **q=new char*; CS2=V; if ((CH=='b'||CH=='B')&&syscount==2) B.m=(long)strtol(mantisa.c_str(),q,2) ; else if ((CH=='o'||CH=='O')&&syscount<=8) B.m=(long)strtol(mantisa.c_str(),q,8) ; else if ((CH=='d'||CH=='D')&&syscount<=10) B.m=(long)strtol(mantisa.c_str(),q,10) ; else CS2=ERR; } else if (CH=='.'&& syscount<=10) {S.push(CH); for (int i=0;i B.m=mantisa.ToInt(); CS2=l4;} if (CS2==V || CS2==ERR || CS2==l4 ) continue; if (hexdigit()) while(hexdigit()) {S.push(CH);gc();} if (CH=='h'||CH=='H') { for (int i=0;i S.push(CH); char **q=new char*; CS2=V; B.m=(long)strtol(mantisa.c_str(),q,16) ; } else if (CH=='+'||CH=='-') {S.push(CH); int flag=0; for (int j=0;j if (S[S.gsize()-2]!='E'&&S[S.gsize()-2]!='e') flag=1; if (flag) {CS2=ERR; continue;} for (int i=0;i B.m=mantisa.ToInt(); while(B.m%10==0) {B.m=B.m/10; B.p++;} if (CH=='-')znak=false; CS2=l5;} else if (ogran.find(CH)>=0 || CH=='\n' || CH==' ' || CH=='\t') {int Ne,flag=0; for (Ne=0;Ne if (Ne==S.gsize() || Ne==S.gsize()-1 || Ne==0) {CS2=ERR; continue;} for (int j=0;j for (int j=Ne+1;j if (flag) {CS2=ERR; continue;} for (int i=0;i B.m=mantisa.ToInt(); while(B.m%10==0) {B.m=B.m/10; B.p++;} mantisa=""; for (int i=Ne+1;i B.p+=mantisa.ToInt(); retgc(); CS2=V;} else CS2=ERR; } break; case l4:{ gc(); if(digit()) {B.p--; B.m=B.m*10+atoi(&CH); CS2=l2; S.push(CH);} else if (ogran.find(CH)>=0 || CH=='\n') {CS2=V; retgc(); } else CS2=ERR; } break; case l5: { gc(); if(digit()) {CS2=l7; S.push(CH); por=atoi(&CH);} else if(CH=='+') {CS2=l6; S.push(CH);} else if (CH=='-') {znak=false; CS2=l6; S.push(CH);} else CS2=ERR; } break; case l6: { gc(); if(digit()) {CS2=l7; S.push(CH); por=atoi(&CH);} else CS2=ERR; } break; case l7: { gc(); if(digit()) {por=por*10+atoi(&CH); S.push(CH);} else if (ogran.find(CH)>=0 || CH=='\n') {if(znak) B.p+=por; else B.p-=por; CS2=V; retgc();} else CS2=ERR; } break; case ERR: { Form1->Memo1->Lines->Add("Ошибка вo втором автомате"); return 1; } break; case V: { AnsiString a="",b=""; int i; for(int i=0;i b+=B.m; b+=" "; b+=B.p; for (i=0;i if (NUM.gsize()==i) NUM.push(B); S.erase(); for(int i=0;i int nomer=chisla.find(b); if (nomer>=0) outlec(3,nomer+1); else { outlec(3,chisla.gsize()+1); AddTab(3);} return 0; } break; } while (CS1!=lEND); } //--------------------------------------------------------------------------- void LAnalize() { CS1=lA; do switch (CS1) { case lA:{ S.erase(); if(gc()) {CS1=lEND; continue;} if(digit()||CH=='.') CS1=lCHISLO ; else if (let()) CS1=lB; else CS1=lE; S.push(CH); break; } case lB:{ gc(); if(digit()||let()) S.push(CH); else {CS1=lC; retgc(); }; } break; case lC:{ AnsiString slovo=""; for (int i=0;i int nomer=slova.find(slovo); int fl; if (slovo=="end") {outlec(1,nomer+1); fl=gc(); if(CH=='.'&& fl==0) {S.erase(); S.push('.'); outlec(2,ogran.find(".")+1); CS1=lEND;} else CS1=lERR; } else if (nomer>=0) {outlec(1,nomer+1); CS1=lA; } else CS1=lD; } break; case lD:{ AnsiString id=""; for (int i=0;i id+=S[i]; int nomer=ident.find(id); if (nomer>=0) {outlec(4,nomer+1); CS1=lA; } else { outlec(4,ident.gsize()+1); AddTab(4); CS1=lA; } } break; case lE:{ AnsiString o=""; o+=CH; if (CH==' ' || CH=='\t') {CS1=lA; continue;} else if(CH=='>'||CH=='<') { gc(); if(CH=='>'||CH=='=') {o+=CH; if(ogran.find(o)>=0) {S.push(CH); outlec(2,ogran.find(o)+1); CS1=lA;} else CS1=lERR; } else { retgc(); if(ogran.find(o)>=0) {outlec(2,ogran.find(o)+1); CS1=lA;} else CS1=lERR; } } else if (CH=='{') { CS1=lERR; while (CH!='}'&& gc()==0); if(CH=='}') CS1=lA; } else if (CH=='}'){CS1=lERR;} else {if (CH=='\n') o="13"; if(ogran.find(o)>=0) {outlec(2,ogran.find(o)+1); CS1=lA;} else {CS1=lERR;}} } break; case lCHISLO: {if(AnalizeChislo()) CS1=lEND; else CS1=lA;} break; case lERR: { CS1=lEND; Form1->Memo1->Lines->Add("Ошибка в первом автомате"); } break; } while (CS1!=lEND); } //=================================3.1======================================= //---------------структура для хранения расширенной таблицы идентификаторов-- struct Identificator { AnsiString id; AnsiString type; strB zn; }; //---------------таблица идентификаторов расширенная ------------------------ array |