Sunteți pe pagina 1din 11

Ministerul Educaiei i tiinei

al Republicii Moldova

Universitatea Tehnic a Moldovei

Lucrare de laborator
nr.3
la Limbaje Formale i Proiectarea Compilatoarelor

Tema:

Forma Chomsky

Varianta 9
A efectuat:

st.grupei FAF-131
Chele Natalia

A verificat:

Irina Cojocaru

Sarcina lucrrii:
1. Eliminai producii

2. Eliminai redenumirile
3. Eliminai simbolurile inaccesibile
4. Eliminai simbolurile neproductive
5. Aducei la Forma Normal Chomsky
Varianta 9
G=(VN, VT, P, S) VN=S, A, B, C, D VT=a, b
P=1. SbA
2. SBC
3. A->a
4. AaS
5. A bAaAb
6. BA
7. BbS
8. BaAa
9. C->
10. CAB
11. DAB
1. Eliminm producii:
pentru producia C

P'=1. SbA
2. SBC
3.S
4. A->a
5. AaS
6. A bAaAb
7. BA
8. BbS
9. BaAa
10. CAB
11. DAB
}
2. Eliminm redenumirile:
O producie de forma XY, X i Y neterminale, se numete redenumire.
Redenumirile din P' sunt: SB, BA
P''={ 1SbbS;
2.S->BC
4.B->aAa;
5.B->a;
6.B->aS;
7.B->bAaAb;

8.A->a;
9.A->aS;
10.A->bAaAb;

11.C->AB;

12.D->AB;

3. Eliminm simbolurile inaccesibile:


Iniial
''
P ={ 1SbbS;
2.S->BC
4.B->aAa;
5.B->a;
6.B->aS;
7.B->bAaAb;

8.A->a;
9.A->aS;
10.A->bAaAb;

11.C->AB;

12.D->AB;

8.A->a;
9.A->aS;
10.A->bAaAb;

11.C->AB;

12.D->AB;

4. Eliminm simbolurile neproductive:


P''={ 1SbbS;
2.S->BC
4.B->aAa;
5.B->a;
6.B->aS;
7.B->bAaAb;

5.Aducem la Forma Normal Chomsky


O gramatic n forma normal Chomsky este o gramatic cu
reguli de forma
PV= {
S->bA;
S->YA;
Y->b;
S->BC;
S->YS;
S->aAa;
S->XZ;
X->a;
Z->AX;
S->a;
S->XS;
S->bAaAb;
S->XZ1;
Z1->AZ2;
Z2->XZ3;
Z3->AY;
B->YS;
B->XZ;
B->a;
B->XS;
B->YZ1;
A->a;
A->XS;
A->YZ1;

C->AB;
}

Listingul programului:
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <iostream>
#include<iomanip>
using namespace std;

void constr(char (*l)[10], int *nr);


void constr1(char (*l)[10], int *nr, int i, int j);
void inter(char *s, char *z,int &c);
//Defines gotoxy() for ANSI C compilers.
void gotoxy(short x, short y) {
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
main()
{
int i,j,h,g,nr,n,c,c1,k,ies1;
char l[255][10],R[20]
[10],Ne[125],Vt[20],Vn[20],PR[50],NPR[50],AC[50],NAC[50],f;
system("cls");
cout << "Dati numarul de productii nr="; cin >> nr;
cout << "Dati productiile posibile Vn->(Vn+Vt)*\n";
i=0;
k=1;
do{
init1:
cout<<k++<<'.';
j=0;
init:
f=getch();
if(f>='A' && f<='Z'){l[i][j++]=f;cout<<f;}
else goto init;
cout<<"->";
do{
f=getch();
if(f=='\b')
{
putchar(8);
cout << ' ';
putchar(8);

j--;
if(j<=0)
{

k--;
goto init1;

}
}
if(f=='e'&&j==1)
{
l[i][j++]=f;
cout<<f;
l[i][j]='\0';
break;
}
if(((f>='A' && f<='Z') || (f>='a' && f<='z')) && f!='e')
{
l[i][j++]=f;
cout<<f;
}
else if(f=='\r' && j!=1)
{
l[i][j]='\0';
break;
}
}while(1);
cout<<'\n';
} while(++i<nr);
/*********eliminarea epsilon productii propriu-zisa********/
//determinarea multimii Ne
k=0;
for(i=0;i<nr;i++)
if(l[i][1]=='e') Ne[k++]=l[i][0];
Ne[k]='\0';
do{
c=0;
for(i=0;i<nr;i++)
{
for(j=1;l[i][j];j++)
{
c1=0;
for(h=0;Ne[h];h++)
if(l[i][j]==Ne[h])c1++;
if(c1==0)break;
}
if(c1!=0)
for(h=0;Ne[h];h++)
if(l[i][0]==Ne[h]) c1=0;
if(c1!=0)
{
Ne[k++]=l[i][0];
Ne[k]='\0';c++;
}
}
}while(c!=0);
//eliminarea epsilon productii propriu-zisa
for(i=0;i<nr;i++)
if(l[i][1]=='e')l[i][1]='\0';
constr(l,&nr);

do{
k=nr;
for(h=0;Ne[h];h++)
for(i=0;i<nr;i++)
for(j=1;l[i][j];j++)
if(l[i][j]==Ne[h]) constr1(l,&nr,i,j);
}while(k!=nr);
constr(l,&nr);
k=0;
for(h=0;Ne[h];h++)
if(Ne[h]=='S')k++;
if(k!=0) strcpy(l[nr++],"Se");
cout<<"\nProductiile obtinute dupa eliminarea \"e productii\"";
k=0;
for(i=0;i<nr;i++)
{
cout<< "\n"<<++k<<'.'<< l[i][0]<< "->"<< (l[i]+1);
}
getch();
/*********eliminarea redenumirilor********/
//determinarea multimii Vt
k=0;
for(i=0;i<nr;i++)
for(j=0;l[i][j];j++)
if(l[i][j]>='A' && l[i][j]<='Z')
{
c=0;
for(h=0;h<k;h++)
if(Vn[h]==l[i][j])c++;
if(c==0)Vn[k++]=l[i][j];
}
Vn[k]='\0';
for(i=0;Vn[i];i++)
{
R[i][0]=Vn[i];
R[i][1]='\0';
}
do{
k=0;
for(i=0;i<nr;i++)
if(l[i][1]>='A' && l[i][1]<='Z' && l[i][2]=='\0')
for(j=0;Vn[j];j++)
if(R[j][0]==l[i][1])
for(h=0;Vn[h];h++)
if(R[h][0]==l[i][0])
{
inter(R[j],R[h],k);
}
}while(k!=0);
for(i=0;i<nr;i++)
if(l[i][1]>='A' && l[i][1]<='Z' && l[i][2]=='\0')
l[i][1]='\0';
constr(l,&nr);
for(i=0;Vn[i];i++)
for(j=0;j<nr;j++)
if(l[j][0]==Vn[i])
for(h=1;R[i][h];h++)
{
l[nr][0]=R[i][h];
strcpy((l[nr++]+1),(l[j]+1));
}

for(i=0;i<nr;i++)
{
c=0;
for(j=0;j<nr;j++)
if(!strcmp(l[i],l[j]))c++;
if(c>1)l[i][1]='\0';}
constr(l,&nr);
cout<<"\nProductiile obtinute dupa eliminarea epsilon productii si
redenumirilor";
k=0;
for(i=0;i<nr;i++)
{
cout<< "\n"<<++k<<'.'<< l[i][0]<< "->"<< (l[i]+1);
}
/*****************Determinarea elementelor inaccesibile***********/
AC[0]=l[0][0];k=1;
do{
c=0;
for(i=0;i<nr;i++)
for(h=0;h<k;h++)
if(l[i][0]==AC[h])
{
for(j=1;l[i][j];j++)
{
c1=0;
for(g=0;AC[g];g++)
if(l[i][j]==AC[g]) c1++;
if(c1==0)
{
AC[k++]=l[i][j];
c++;
}
}break;
}
}while(c!=0);
AC[k]='\0';
//cout<<"\nAC="<<AC;
k=0;
for(i=0;Vn[i];i++)
{
c=0;
for(h=0;AC[h];h++)
if(AC[h]==Vn[i]) c++;
if(c==0)NAC[k++]=Vn[i];
}
for(i=0;Vt[i];i++)
{
c=0;
for(h=0;AC[h];h++)
if(AC[h]==Vt[i]) c++;
if(c==0)NAC[k++]=Vt[i];
}
NAC[k]='\0';
cout<<"\nNAC="<<NAC;
for(i=0;i<nr;i++)
for(j=0;l[i][j];j++)
{
for(h=0;NAC[h];h++)
if(l[i][j]==NAC[h])
{

l[i][1]='\0';
goto ies;
}
ies:break;
}
constr(l,&nr);
cout<<"\nProductiile obtinute dupa eliminarea elementelor inaccesibile";
k=0;
for(i=0;i<nr;i++)
{
cout<< "\n"<<++k<<'.'<< l[i][0]<< "->"<< (l[i]+1);
}
getch();
/*****************Determinarea elementelor neproductive***********/
k=0;
for(i=0;i<nr;i++)
for(j=1;l[i][j];j++)
if(l[i][j]>='a' && l[i][j]<='z' && l[i][j]!='e')
{
c=0;
for(h=0;h<k;h++)
if(Vt[h]==l[i][j])c++;
if(c==0)Vt[k++]=l[i][j];
}
Vt[k]='\0';
getch();
k=0;
do{
c=0;
for(i=0;i<nr;i++)
{
for(j=1;l[i][j];j++)
{
c1=0;
for(h=0;Vt[h];h++) if(l[i][j]==Vt[h])c1++;
for(h=0;h<k;h++) if(l[i][j]==PR[h])c1++;
if(c1!=0) continue;
else {
c1=0;
break;
}
}
if(c1!=0)
for(h=0;h<k;h++) if(l[i][0]==PR[h])c1=0;
if(c1!=0)
{
PR[k++]=l[i][0];
c++;
}
}
}while(c!=0);
PR[k]='\0';
//cout<<"\nPR="<<PR;
k=0;
for(i=0;Vn[i];i++)
{
c=0;
for(h=0;PR[h];h++)
if(PR[h]==Vn[i]) c++;
if(c==0)NPR[k++]=Vn[i];
}
NPR[k]='\0';
//cout<<"\nNPR="<<NPR;
for(i=0;i<nr;i++)

for(j=0;l[i][j];j++)
{
for(h=0;NPR[h];h++)
if(l[i][j]==NPR[h])
{
l[i][1]='\0';
goto ies1;
}
ies1:break;
}
constr(l,&nr);
cout<<"\nProductiile obtinute dupa eliminarea elementelor neproductive";
k=0;
for(i=0;i<nr;i++)
{
cout<< "\n"<<++k<<'.'<< l[i][0]<< "->"<< (l[i]+1);
}
getch();
/*****************FNC***********/
cout<<"\nFNC";
f='A';
for(i=0;Vn[i];i++);k=i;
for(i=0;i<nr;i++)
if(l[i][2]!='\0')
for(j=1;l[i][j];j++)
if(l[i][j]>='a' && l[i][j]<='z')
{
do{
c=0;
for(h=0;Vn[h];h++)
if(f==Vn[h])
{
c++;
f++;
break;
}
}while(c!=0);
if(f>'Z')
{
cout<<"\nInsuficienta de litere";
getch();
exit(0);
}
l[nr][0]=f;
l[nr][1]=l[i][j];
l[nr][2]='\0';
nr++;
for(g=i;g<nr;g++)
if(l[g][2]!='\0')
for(h=1;l[g][h];h++)
if(l[g][h]==l[i][j] && (g!=i || h!=j))l[g][h]=f;
l[i][j]=f;
Vn[k++]=f;
Vn[k]='\0';
}
cout<<"\nPasul 1";
c=0;
for(g=0;g<nr;g++)
{
cout<< "\n"<<++c<<'.'<< l[g][0]<< "->"<< (l[g]+1);
}

getch();
cout<<"\nPasul 2";
do{
n=0;
for(i=0;i<nr;i++)
if(l[i][2]!='\0' && l[i][3]!='\0')
{
n++;
c=0;
do{
c=0;
for(h=0;Vn[h];h++)
if(f==Vn[h])
{
c++;
f++;
break;
}
}while(c!=0);
if(f>'Z')
{
cout<<"\nInsuficienta de litere";
getch();
exit(0);
}
l[nr][0]=f;
for (g=2;l[i][g];g++)
l[nr][g-1]=l[i][g];
l[nr][g-1]='\0';
for (h=i+1;h<nr;h++)
{
c=0;
for (j=2;l[i][j];j++)
if (l[i][j]!=l[h][j])
{
c=1;
break;
}
if (c==0)
{
l[h][2]=f;
l[h][3]='\0';
}
}
l[i][2]=f;
l[i][3]='\0';
nr++;
Vn[k++]=f;
Vn[k]='\0';
}
}while(n!=0);
h=0;
for(g=0;g<nr;g++)
{
cout<< "\n"<<++h<<'.'<< l[g][0]<< "->"<< (l[g]+1);
}
getch();
return 0;
}
void constr(char (*l)[10], int *nr){

int i,j,h;
for(i=0;i<*nr;i++)
if(l[i][1]=='\0'){
h=i;
for(j=h+1;j<*nr;j++,h++)
strcpy(l[h],l[j]);
(*nr)--;
i--;
}

void constr1(char (*l)[10], int *nr, int i, int j){


int h;
strcpy(l[*nr],l[i]);
for(h=j;l[*nr][h];h++)
l[*nr][h]=l[*nr][h+1];
h=0;
for(i=0;i<*nr;i++)
if(strcmp(l[i],l[*nr])==0)h++;
if(h==0)(*nr)++;
}
void inter(char *s, char *z,int &c){
int i,j,h,k,k1;
for(i=0;s[i];i++)
k1=i;
for(j=0;z[j];j++)
{
k=0;
for(h=0;s[h];h++)
if(s[h]==z[j])k++;
if(k==0)
{
s[++k1]=z[j];
c++;
}
}
s[++k1]='\0';
}

Concluzie: Efectuind aceast lucrare practic

am simplificat o gramatic i am adus-o la


forma normal Chomsky. Pentru aceasta am eliminat - produciile, redenumirile , elementele
neproductive i inaccesibile. Apoi conform algoritmului am realizat cei doi pai de transformare
a gramaticii n FNC.

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