Sunteți pe pagina 1din 10

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: st.grupei 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=Vn.find(','))!=string::npos)
{
Vn.erase(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<Vn.size(); i++)
{
cout<<Vn[i]<<"->";
cin>>s;
DivStr(s,v);
for(int j=0; j<v.size(); j++)
prod[Vn[i]].push_back(v[j]);
v.clear();
}
}
void Grammer::DivStr(string &s,vector<string> &v)
{
int pos=0;
char *str=0;
while((pos=s.find(','))!=string::npos)
{
str=new char[pos];
str[pos]=0;

5
s.copy(str,pos,0);
s.erase(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[res.size()-1]].size();
Sleep(1);
QueryPerformanceCounter(&n);
index=n.LowPart%temp;
if (aux.size()>=len)
{
string str=aux;
FindTerminal(aux);
if(str!=aux)
{
res+="->"+aux;
break;
}
}
if ((prod[res[res.size()-1]][index].size()==1)) continue;

cout<<" - "<<aux[aux.size()-1];
aux.erase(aux.size()-1,1);
aux+=prod[res[res.size()-1]][index];
res+="->"+aux;
}
cout<<endl;
for(int i=0;i<len;i++)
cout<<"| ";
cout<<endl;

for(int i=0;i<aux.size();i++)
cout<<aux[i]<<" ";
cout<<endl;

cout<<endl<<res<<endl;
}

6
void Grammer::FindTerminal(string &str)
{
char term=str[str.size()-1];
for(int i=0; i<prod[term].size(); i++)
{
if(prod[term][i].size()==1 && prod[term][i][0]>='a')
{
cout<<" - "<<str[str.size()-1];
str.erase(str.size()-1,1);
str+=prod[term][i];
break;
}
}
}

main()
{ Grammer g;

g.InitializeData();
LARGE_INTEGER n;

cout<<endl;
cout<<"Rezultatele: \n"<<endl;
while(1)
{
for(int i=0; i<5; i++)
{
QueryPerformanceCounter(&n);
g.CreateGramm(n.LowPart%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

S-ar putea să vă placă și