Автор работы: Пользователь скрыл имя, 17 Апреля 2013 в 10:55, курсовая работа
Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования. Смысл появления такого языка – оснащенный набор вычислительных формул дополнительной информации, превращает данный набор в алгоритм. Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько "близок к машине", что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. Второй цели идеально отвечает язык, который настолько "близок к решаемой задаче", чтобы концепции ее решения можно было выражать прямо и коротко.
Введение. 2
Особенности языков программирования. 4
Понятие грамматики и формальное определение. Формула Бэкуса-Наура. 6
Общая схема распознавателя. 9
Основные компоненты распознавателя. 11
Классификация распознавателей по виду их компонентов. 12
Задача разбора 16
Теоретическая справка. 17
Составление формальной грамматики. 18
Построение конечного распознавателя. 19
Программное моделирование работы конечного распознавателя 20
Реализация алгоритма средствами ООП. 23
Список используемой литературы 38
case '4': slsost=tabl[tsost][4]; break;
case '5': slsost=tabl[tsost][5]; break;
case '6': slsost=tabl[tsost][6]; break;
case '7': slsost=tabl[tsost][7]; break;
case '8': slsost=tabl[tsost][8]; break;
case '9': slsost=tabl[tsost][9]; break;
case '/': slsost=tabl[tsost][10]; break;
case '.': slsost=tabl[tsost][11]; break;
case 'e': slsost=tabl[tsost][12]; break;
case '+': slsost=tabl[tsost][13]; break;
case '-': slsost=tabl[tsost][14]; break;
case '#': slsost=tabl[tsost][15]; break;
default: slsost=1;}
printf("%5d",slsost);
tsost=slsost;
};
switch (slsost)
{ case 1:cout<<"\n STRING is WRONG \n"; break;
case 0:cout<<"\n STRING is RIGHT \n";break;
case 2:cout << "\n STRING is WRONG \n";break;
}
return 0;
};
результат выполнения программы:
Реализация алгоритма средствами ООП.
Входной текстовый файл matr.txt
9 количество состояний
40 количество символов алфавита
9
40
0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z _ . / #
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1
5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 2 1
7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 5 2 1
7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 5 1 1
7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 5 2 0
7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 5 2 0
7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 5 2 0
2
3
0
0
0
Заголовочный файл konavt.h
class konavt {int kolsost;// число состояний автомата
int kolsimv;// число символов входного алфавита
char *alfavit; // входной алфавит
int nachstate; //начальное состояние
int kolkon;//число заключительных состояний
int *fin; //заключительные состояния
int **per;//матрица переходов
int dlina;// текущая длина входной цепочки
int dlina0;// начальная длина входной цепочки
char *vxod;// входная цепочка
int avtstate; //текущее состояние
int nomstep;// номер шага автомата
int *protokol;// протокол работы автомата
public: bool error; //признак ошибки
konavt();//конструктор без параметров
void show_sost();//проверка заполнения матрицы
void sled();//срабатывание переходов
void show();//показ текущего состояния;
void init();//инициализация новой строкой
bool konec();// проверка финальности состояния
bool zaversh(); //проверка исчерпания строки
bool proverka();// проверка принадлежности символов алфавиту
};
Реализация класса konavt.cpp
# include "konavt.h"
# include <iostream.h>
# include <fstream.h>
# include <string.h>
# include <stdlib.h>
//конструктор
konavt::konavt()
{int i,j,vyb;
// возможен ввод исходных данных как из файла, так и с клавиатуры
cout<<"constructor working..."<<endl;
cout <<"Istochnik dannyx(0-klaviatura,1-file)"<<
cin>>vyb;
// ввод с клавиатуры
if (vyb==0)
{ cout<<"\n Enter kolvo sostoianiy\t";
cin>>kolsost;
cout<<endl<<"enter kolvo simvolov alfavita\t";
cin>>kolsimv;
alfavit=new char [kolsimv];
per=new int*[kolsost];
for (i=0;i<kolsost;i++){
per[i]=new int [kolsimv];
};
cout<<endl<<"enter alfavit"<<endl;
for (j=0;j<kolsimv;j++){
cin>>alfavit[j];
};
cout<<endl<<"enter matrica"<<endl;
for (i=0;i<kolsost;i++){
for (j=0;j<kolsimv;j++){
cin>>per[i][j];
};
cout<<endl;
};
cout<<"enter nachalnoe sostoianie"<<endl;
cin>>nachstate;
cout<<endl;
cout<<"enter kolvo konechnyh sostoianiy"<<endl;
cin>>kolkon;
cout<<endl;
fin=new int[kolkon];
cout<<"enter konechnye sostoiania"<<endl;
for (i=0;i<kolkon;i++){
cin>>fin[i];
}
cout<<endl;
// запись исходных данных в файл
int otv;
cout<<"save to file?(1-yes,0-no)";
cin>>otv;
cout<<endl;
if (otv==1)
{char fname[30];
cout<<"enter filename ";
cin>>fname;
cout<<endl;
ofstream out_stream;
out_stream.open(fname);
if (out_stream.fail())
{cout<<"Error output file"<<endl; return;}
out_stream<<kolsost<<' ';
out_stream<<kolsimv<<' ';
for (i=0;i<kolsimv;i++) out_stream<<alfavit[i]<<' ';
for (i=0;i<kolsost;i++){
for (j=0;j<kolsimv;j++){
out_stream<<per[i][j]<<' ';}}
out_stream<<nachstate<<' ';
out_stream<<kolkon<<' ';
for (i=0;i<kolkon;i++)out_stream<<
out_stream.close();
cout<<"End of output file..."<<endl;
};
} else
// ввод исходных данных из файла
{ char filename[30];
cout<<"Enter Filename ";
cin>>filename;
cout<<endl<<"vvedeno "<<filename<<endl;
ifstream in_stream;
in_stream.open(filename);
if (in_stream.fail())
{cout<<"net faila "<<filename<<endl; return;
};
in_stream>>kolsost;
cout<<"kolsost="<<kolsost<<
in_stream>>kolsimv;
cout<<"kolsimv="<<kolsimv<<
alfavit=new char[kolsimv];
for (i=0;i<kolsimv;i++){ in_stream>>alfavit[i];};
for (i=0;i<kolsimv;i++) cout<<alfavit[i]<<" ";
cout<<endl;
per=new int*[kolsost];
for (i=0;i<kolsost;i++) per[i]=new int [kolsimv];
for (i=0;i<kolsost;i++){
for (j=0;j<kolsimv;j++){
in_stream>>per[i][j];}}
for (i=0;i<kolsost;i++){
for (j=0;j<kolsimv;j++){
cout<<per[i][j];}cout<<endl;}
in_stream>>nachstate;
cout<<"begin state "<<nachstate<<endl;
in_stream>>kolkon;
cout<<"Number of end states "<<kolkon<<endl;
fin=new int[kolkon];
for (i=0;i<kolkon;i++)in_stream>>
for (i=0;i<kolkon;i++)cout<<fin[i]
cout<<endl;
in_stream.close();
cout<<"End of output file..."<<endl;
}
return;};
//показ текущего состояния
void konavt::show_sost()
{int i;
cout<<"sostoyanie "<<avtstate<<endl;
cout<<dlina<<endl;
//cout<<"ostatok vxoda "<<vxod<<endl;
cout<<"ostatok vxoda ";
//for (i=0; i<dlina;i++) cout<<vxod[i]<<"\t"; // *(vxod+i)
//cout<<endl;
for (i=0; i<dlina;i++) cout<<*(vxod+i)<<"\t";
cout<<endl<<"protokol ";
for (i=0;i<dlina0+1;i++) cout<<protokol[i]<<"\t";
cout<<endl;
};
//переход к следующему состоянию
void konavt::sled()
{int slsost,i,num;
num=-1;
char teksimv;
teksimv=vxod[0];
cout<<"symbol "<<teksimv<<endl;
for (i=0;i<kolsimv;i++) if (teksimv==alfavit[i]) {num=i;break;};
if (num==-1){cout<<"illegal symbol "<<teksimv<<endl;error=true;}
else {slsost=per[avtstate][num];
avtstate=slsost;
protokol[nomstep]=slsost;
nomstep++;
for (i=0;i<dlina;i++)vxod[i]=vxod[
vxod[dlina-1]=' ';
dlina=dlina-1;
};
return;};
//проверка допустимости входной строки
bool konavt::proverka()
{int i,j;
bool prizn;
for (i=0;i<dlina;i++)
{prizn=false;
for (j=0;j<kolsimv;j++) if (vxod[i]==alfavit[j]) {prizn=true;break;};
if (!prizn) {cout<<"illegal symbol "<<endl;break;};
};
return prizn;
};
//ввод новой входной строки
void konavt::init()
{int i;
cout<<"enter dlina"<<endl;
cin>>dlina;
dlina0=dlina;
vxod=new char[dlina+1];
protokol=new int [dlina+1];
for (i=0;i<dlina+1;i++)protokol[i]
cout<<endl<<"enter vhodnaya stroka"<<endl;
for (i=0;i<dlina;i++)cin>>vxod[i];
//vxod[dlina]='\0';
cout<<endl;
//cout<<"ostatok vxoda "<<vxod<<endl;
cout<<"ostatok vxoda ";
for (i=0; i<dlina;i++) cout<<vxod[i]<<"\t";
cout<<endl;
if (proverka()) {avtstate=nachstate;
protokol[0]=nachstate;
nomstep=1;
error=false;}
else error=true;
return;};
//показ параметров автомата
void konavt::show()
{int i,j;
cout<<"parametry avtomata"<<endl;
cout<<"kolvo sostoianiy "<<kolsost<<endl;
cout<<"kolvo simvolov alfavita "<<kolsimv<<endl;
cout<<"simvoly alfavita"<<endl;
for (j=0;j<kolsimv;j++){
cout<<alfavit[j]<<"\t";
};
cout<<endl<<"matrica perehodov"<<endl;
for (i=0;i<kolsost;i++){
for (j=0;j<kolsimv;j++){
cout<<per[i][j]<<"\t";
};
cout<<endl;
};
cout<<"nachalnoe sostoianie "<<nachstate<<endl;
cout<<"konechnye sostoiania "<<endl;
for (i=0;i<kolkon;i++){
cout<<fin[i]<<"\t";
};cout<<endl;
return;};
//проверка завершающего состояния
bool konavt::konec()
{int i;
bool kon;
kon=false;
i=-1;
for (i=0;i<kolkon;i++) if(avtstate==fin[i]){kon=true;
return kon;
};
//проверка исчерпания входной строки
bool konavt::zaversh()
{bool prizn;
if(dlina==0) prizn=true; else prizn=false;
return prizn;
};
Основная программа main.cpp
# include "konavt.h"
# include <iostream.h>
int main()
{
konavt tavt;
tavt.show();
int povt;
povt=1;
while (povt==1)
{ tavt.init();
tavt.show_sost();
if (!tavt.error)
{do
{ tavt.sled();
tavt.show_sost();
} while (!((tavt.error)&&(tavt.
if ((tavt.zaversh()) && (tavt.konec()))
cout<<"\n !!!stroka prinimaetsa"<<endl;else
cout<<"\n !!!stroka ne prinimaetsa"<<endl;}
cout<<"repeat?(1,0)\n";
cin>>povt;
cout<<endl;
};
return 0;}
Результат выполнения программы при введении той же строки – q.ad/_1.a#:
Список используемой литературы.