Ministerul Educaţiei şi Ştiinţei
al Republicii Moldova
Universitatea Tehnică a Moldovei
Facultatea Calculatoare Informatică şi Microelectronică
Tehnologii Informationale
LUCRARE DE LABORATOR Nr.1
la Limbaje Formale şi Proiectarea Compilatoarelor
Tema:
Limbajele regulate
A efectuat: [Link] TI-113
Florin Rosca
A verificat: lector superior
Duca Ludmila .
Chişinău 2018
Scopul lucrării:
1. Pentru gramatica formală G=(VN, VT, P, S) construiţi 5 şiruri care aparţin limbajului
L(G) generat de această gramatică. Lungimea şirului trebuie să fie nu mai mică decît
numărul de caractere din alfabetul V n+2
2. Pentru fiecare şir să se construiască arborele de derivare.
3. Desenaţi automatul finit echivalent acestei gramatici.
4. La ce clasă a gramaticilor dacă Chomsky aparţine gramatica dată.
Datele iniţiale :
VN ={A, B,C}
VT ={ a , 1 , b , + }
P={ 1. M→aA
2. M→1B
3. C→b
4. C→+A
5. C→aB
6. B→aC
7. C→1A
8. C→1C
9. A→b
10. A→bB
11. A→+B
12. A→+C
13. B→bA
14. B→a }
1.M→aA→abB→abbA→abb+C→abb+b;
M
a A
A
b B
b A
+ C
b
2. M→1B→1aC→1a1A→1a1bB→1a1bb;
2
M
1
B
a
C
1 A
b B
3. M→aA→a+B→a+bA→a+b+B→a+b+a;
a A
+ B
b A
+ B
5. M→1B→1bA→1b+C→1b+1A→1b+1bB →1b+1ba;
M
B
3
1 A
b C
+
A
1
B
b
a
5. M→aA→a+B→a+bA→a+b+B→a+b+aC→a+b+ab;
M
A
a B
+ A
b
B
+
C
a
b
Listingul programului:
#include<vector>
#include<string>
#include<map>
#include<conio.h>
#include<cstdlib>
#include<time.h>
#include<iostream>
4
#include<windows.h>
#include<cmath>
#pragma warning(disable:4786)
using namespace std;
typedef vector<string> sir;
class Grammer
{ public:
Grammer(){};
void InitializeData();
void CreateGramm(int len);
void FindTerminal(string &str);
private:
void DivStr(string &s,vector<string> &v);
private:
map<char,sir> prod;
string Vn;
};
void Grammer::InitializeData()
{
string Vt;
cout<<"Introduceti vocabularul Vn:"<<endl;
cout<<"Vn=";
cin>>Vn;
int pos=0;
while((pos=[Link](','))!=string::npos)
{
[Link](pos,1);
}
cout<<endl<<"Introduceti vocabularul Vt:"<<endl;
cout<<"Vt=";
cin>>Vt;
string s;
vector<string> v;
cout<<endl<<"Introduceti productiile separindu-le prin virgula (s->aB,cD...):"<<endl;
for(int i=0; i<[Link](); i++)
{
cout<<Vn[i]<<"->";
cin>>s;
DivStr(s,v);
for(int j=0; j<[Link](); j++)
prod[Vn[i]].push_back(v[j]);
[Link]();
}
}
void Grammer::DivStr(string &s,vector<string> &v)
{
int pos=0;
char *str=0;
while((pos=[Link](','))!=string::npos)
{
str=new char[pos];
str[pos]=0;
5
[Link](str,pos,0);
[Link](0,pos+1);
v.push_back(str);
str=0;
}
v.push_back(s);
}
void Grammer::CreateGramm(int len)
{
static int cont=0;
LARGE_INTEGER n;
cont++;
string res,aux;
int index=0,temp=0;
time_t t;
aux=prod['S'][cont%prod['S'].size()];
res="S->"+aux;
cout<<"S";
while(true)
{
temp=prod[res[[Link]()-1]].size();
Sleep(1);
QueryPerformanceCounter(&n);
index=[Link]%temp;
if ([Link]()>=len)
{
string str=aux;
FindTerminal(aux);
if(str!=aux)
{
res+="->"+aux;
break;
}
}
if ((prod[res[[Link]()-1]][index].size()==1)) continue;
cout<<" - "<<aux[[Link]()-1];
[Link]([Link]()-1,1);
aux+=prod[res[[Link]()-1]][index];
res+="->"+aux;
}
cout<<endl;
for(int i=0;i<len;i++)
cout<<"| ";
cout<<endl;
for(int i=0;i<[Link]();i++)
cout<<aux[i]<<" ";
cout<<endl;
cout<<endl<<res<<endl;
}
6
void Grammer::FindTerminal(string &str)
{
char term=str[[Link]()-1];
for(int i=0; i<prod[term].size(); i++)
{
if(prod[term][i].size()==1 && prod[term][i][0]>='a')
{
cout<<" - "<<str[[Link]()-1];
[Link]([Link]()-1,1);
str+=prod[term][i];
break;
}
}
}
main()
{ Grammer g;
[Link]();
LARGE_INTEGER n;
cout<<endl;
cout<<"Rezultatele: \n"<<endl;
while(1)
{
for(int i=0; i<5; i++)
{
QueryPerformanceCounter(&n);
[Link]([Link]%7+7+i);
cout<<endl;
}
getch();
}
}
Rezultatele executiei programului:
7
8
Schema automatului finit echivalent gramaticii:
AF=(Q, , , q0, F), unde
Q – mulţimea de stări
- vocabular
- funcţia de tranziţie
q0 – starea iniţială
F – mulţimea stărilor finale
Algoritmul de construire AF:
1. Q = VN{X}={ S, P,Q}
2. =VT={ a, b, c, d, e, f }
3. q0=S
4. F={X}
1. (S,a)=P
2. (S,b)=Q
3. (P,b)=P
4. (P,c)=P
5. (P,d)=Q
6. (P,e)=X
7. (Q,e)=Q
8. (Q,f)=Q
9. (Q,a)=X
9
Concluzii:În urma efectuării date de laborator am obţinut experienţă în
domeniul limbajelor şi anume a limbajelor regulate care sunt foarte importante în
proiectarea compilatoarelor. Astfel am perceput în practică lucrul cu acest tip de
limbaje, adică construirea şirurilor, a arborelor de derivare precum şi desenarea
automatelor finite echivalente, etc.
10