Let us consider the productions of grammer G, that may contain any number of productions then the code is,
PROGRAM:
#include<iostream>
#include<string.h>
using namespace std;
class production
{
private:
char left;
char right[10][10];
int noa,i,j;
public:
void setproduction(char str[15])
{
j=0;noa=0;
left=str[0];
for(i=3;str[i]!='\0';i++){
if(str[i]!='/'){
right[noa][j++]=str[i];
right[noa][j]='\0';
}
else{
right[noa][j]='\0';noa++;j=0;
}
}
}
void printproduction()
{
cout<<left<<"->";
for(i=0;i<=noa;i++)
{
cout<<right[i];
if(i!=noa){cout<<"/";}
}
}
friend class CFG;
};
class CFG
{
private:
production p[10];
char t[10],nt[10],str[15];
int i,j,k,l,nop,note,nont;
public:
void process()
{
note=0;nont=0;
cout<<"Enter number of productions:\n";
cin>>nop;
cout<<"Enter productions:\n";
for(i=0;i<nop;i++)
{
cin>>str;
p[i].setproduction(str);
}
for(i=0;i<nop;i++){
for(j=0;j<=p[i].noa;j++){
for(k=0;p[i].right[j][k]!='\0';k++){
if(isupper(p[i].right[j][k])){
for(l=0;l<=nont;l++)
if(nt[l]==p[i].right[j][k])
goto x;
nt[nont++]=p[i].right[j][k];
}
else{
for(l=0;l<=nont;l++)
if(t[l]==p[i].right[j][k])
goto x;
t[note++]=p[i].right[j][k];
}
x:cout<<"";
}
}
}
cout<<"\n{{";
for(i=0;i<note;i++){
cout<<t[i];
if(i!=note-1){cout<<",";}}
cout<<"},{";
for(i=0;i<nont;i++){
cout<<nt[i];
if(i!=nont-1){cout<<",";}}
cout<<"},{";
for(i=0;i<nop;i++){
p[i].printproduction();
if(i!=nop-1){cout<<",";}}
cout<<"},{"<<p[0].left<<"}}\n";
}
};
int main()
{
CFG g;
g.process();
return 0;
}
PROGRAM:
#include<iostream>
#include<string.h>
using namespace std;
class production
{
private:
char left;
char right[10][10];
int noa,i,j;
public:
void setproduction(char str[15])
{
j=0;noa=0;
left=str[0];
for(i=3;str[i]!='\0';i++){
if(str[i]!='/'){
right[noa][j++]=str[i];
right[noa][j]='\0';
}
else{
right[noa][j]='\0';noa++;j=0;
}
}
}
void printproduction()
{
cout<<left<<"->";
for(i=0;i<=noa;i++)
{
cout<<right[i];
if(i!=noa){cout<<"/";}
}
}
friend class CFG;
};
class CFG
{
private:
production p[10];
char t[10],nt[10],str[15];
int i,j,k,l,nop,note,nont;
public:
void process()
{
note=0;nont=0;
cout<<"Enter number of productions:\n";
cin>>nop;
cout<<"Enter productions:\n";
for(i=0;i<nop;i++)
{
cin>>str;
p[i].setproduction(str);
}
for(i=0;i<nop;i++){
for(j=0;j<=p[i].noa;j++){
for(k=0;p[i].right[j][k]!='\0';k++){
if(isupper(p[i].right[j][k])){
for(l=0;l<=nont;l++)
if(nt[l]==p[i].right[j][k])
goto x;
nt[nont++]=p[i].right[j][k];
}
else{
for(l=0;l<=nont;l++)
if(t[l]==p[i].right[j][k])
goto x;
t[note++]=p[i].right[j][k];
}
x:cout<<"";
}
}
}
cout<<"\n{{";
for(i=0;i<note;i++){
cout<<t[i];
if(i!=note-1){cout<<",";}}
cout<<"},{";
for(i=0;i<nont;i++){
cout<<nt[i];
if(i!=nont-1){cout<<",";}}
cout<<"},{";
for(i=0;i<nop;i++){
p[i].printproduction();
if(i!=nop-1){cout<<",";}}
cout<<"},{"<<p[0].left<<"}}\n";
}
};
int main()
{
CFG g;
g.process();
return 0;
}
Sample Output:
Enter number of productions: 2
Enter Productions:
E->E+T/E*F/(E)
T->a/b
{{+,*,(,),a,b},{E,T},{E->E+T/E*T/(E),T->a/b},{E}}
No comments:
Post a Comment