Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
al Republicii Moldova
Tema:
Limbajele regulate
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)
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);
}
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();
}
}
7
8
Schema automatului finit echivalent gramaticii:
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