Untitled
unknown
plain_text
2 years ago
3.5 kB
0
Indexable
Never
#include<stdio.h> #include<conio.h> #define max 10 #define MAX 15 void ffun(int,int); void fun(int,int[]); void follow(int i); char array[max][MAX],temp[max][MAX]; int c,n,t; int fun2(int i,int j,int p[],int key) { int k; if(!key) { for(k=0; k<n; k++) if(array[i][j]==array[k][0]) break; p[0]=i; p[1]=j+1; fun(k,p); return 0; } else { for(k=0; k<=c; k++) { if(array[i][j]==temp[t][k]) break; } if(k>c)return 1; else return 0; } } void fun(int i,int p[]) { int j,k,key; for(j=2; array[i][j]!=NULL; j++) { if(array[i][j-1]=='/') { if(array[i][j]>='A'&&array[i][j]<='Z') { key=0; fun2(i,j,p,key); } else { key=1; if(fun2(i,j,p,key)) temp[t][++c]=array[i][j]; if(array[i][j]=='@'&&p[0]!=-1) //taking ,@, as null symbol. { if(array[p[0]][p[1]]>='A'&&array[p[0]][p[1]]<='Z') { key=0; fun2(p[0],p[1],p,key); } else if(array[p[0]][p[1]]!='/'&&array[p[0]][p[1]]!=NULL) { if(fun2(p[0],p[1],p,key)) temp[t][++c]=array[p[0]][p[1]]; } } } } } } char fol[max][MAX],ff[max]; int f,l,ff0; void follow(int i) { int j,k; for(j=0; j<=ff0; j++) if(array[i][0]==ff[j]) return; if(j>ff0)ff[++ff0]=array[i][0]; if(i==0)fol[l][++f]='$'; for(j=0; j<n; j++) for(k=2; array[j][k]!=NULL; k++) if(array[j][k]==array[i][0]) ffun(j,k); } void ffun(int j,int k) { int ii,null=0,tt,cc; if(array[j][k+1]=='/'||array[j][k+1]==NULL) null=1; for(ii=k+1; array[j][ii]!='/'&&array[j][ii]!=NULL; ii++) { if(array[j][ii]<='Z'&&array[j][ii]>='A') { for(tt=0; tt<n; tt++) if(temp[tt][0]==array[j][ii])break; for(cc=1; temp[tt][cc]!=NULL; cc++) { if(temp[tt][cc]=='@')null=1; else fol[l][++f]=temp[tt][cc]; } } else fol[l][++f]=array[j][ii]; } if(null)follow(j); } int main() { int p[2],i,j; //clrscr(); printf("Enter the no. of productions :"); scanf("%d",&n); printf("Enter the productions :\n"); for(i=0; i<n; i++) scanf("%s",array[i]); for(i=0,t=0; i<n; i++,t++) { c=0,p[0]=-1,p[1]=-1; temp[t][0]=array[i][0]; fun(i,p); temp[t][++c]=NULL; printf("First(%c) : [ ",temp[t][0]); for(j=1; j<c; j++) printf("%c,",temp[t][j]); printf("\b ].\n"); } /* Follow Finding */ for(i=0,l=0; i<n; i++,l++) { f=-1; ff0=-1; fol[l][++f]=array[i][0]; follow(i); fol[l][++f]=NULL; } for(i=0; i<n; i++) { printf("\nFollow[%c] : [ ",fol[i][0]); for(j=1; fol[i][j]!=NULL; j++) printf("%c,",fol[i][j]); printf("\b ]"); } getch(); return 0; }