The concept of First and Follow is widely used in the System Programming and Compiler Design. This concept is quite important for all the students learning the subject.
Code below....
For other Subjects program code do visit below links:-
Below is the code for first and Follow program using C.
First Program Source Code
#include<stdio.h>
#include<ctype.h>
void FIRST(char[],char );
void addToResultSet(char[],char);
int numOfProductions;
char productionSet[10][10];
void main()
{ int
i;
char choice;
char c;
char result[20];
printf("How many
number of productions ? :");
scanf("
%d",&numOfProductions);
for(i=0;i<numOfProductions;i++)
{ printf("Enter productions Number %d : ",i+1);
scanf(" %s",productionSet[i]); }
do
{ printf("\n Find the FIRST of :");
scanf(" %c",&c);
FIRST(result,c);
printf("\n FIRST(%c)= { ",c);
for(i=0;result[i]!='\0';i++)
printf(" %c ",result[i]);
printf("}\n");
printf("press 'y' to continue : ");
scanf("
%c",&choice); }
while(choice=='y'||choice =='Y'); }
void FIRST(char* Result,char c)
{
int i,j,k;
char subResult[20];
int foundEpsilon;
subResult[0]='\0';
Result[0]='\0';
if(!(isupper(c)))
{ addToResultSet(Result,c);
return ; }
for(i=0;i<numOfProductions;i++)
{ if(productionSet[i][0]==c)
{ if(productionSet[i][2]=='#')
addToResultSet(Result,'#');
else
{ j=2;
while(productionSet[i][j]!='\0')
{ foundEpsilon=0;
FIRST(subResult,productionSet[i][j]);
for(k=0;subResult[k]!='\0';k++)
addToResultSet(Result,subResult[k]);
for(k=0;subResult[k]!='\0';k++)
if(subResult[k]=='#')
{ foundEpsilon=1;
break; }
if(!foundEpsilon)
break;
j++; } } } }
return ; }
void addToResultSet(char Result[],char
val)
{ int
k;
for(k=0
;Result[k]!='\0';k++)
if(Result[k]==val)
return;
Result[k]=val;
Result[k+1]='\0'; }
Follow Program Source Code:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int n,m=0,p,i=0,j=0;
char a[10][10],followResult[10];
void follow(char c);
void first(char c);
void addToResult(char);
int main()
{ int i;
int choice;
char c,ch;
clrscr();
printf("Enter the no.of productions: ");
scanf("%d", &n);
printf(" Enter %d productions\nProduction with multiple terms should
be give as separate productions \n", n);
for(i=0;i<n;i++)
scanf("%s%c",a[i],&ch);
do
{ m=0;
printf("Find FOLLOW of -->");
scanf(" %c",&c);
follow(c);
printf("FOLLOW(%c) = { ",c);
for(i=0;i<m;i++)
printf("%c ",followResult[i]);
printf(" }\n");
printf("Do you want to continue(Press 1 to continue....)?");
scanf("%d",&choice);
} while(choice==1); }
void follow(char c)
{ if(a[0][0]==c)addToResult('$');
for(i=0;i<n;i++)
{ for(j=2;j<strlen(a[i]);j++)
{ if(a[i][j]==c)
{ if(a[i][j+1]!='\0')first(a[i][j+1]);
if(a[i][j+1]=='\0'&&c!=a[i][0])
follow(a[i][0]); } } } }
void first(char c)
{ int k;
if(!(isupper(c)))
addToResult(c);
for(k=0;k<n;k++)
{ if(a[k][0]==c)
{ if(a[k][2]=='#') follow(a[i][0]);
else
if(islower(a[k][2]))
addToResult(a[k][2]);
else
first(a[k][2]); } } }
void addToResult(char c)
{ int i;
for( i=0;i<=m;i++)
if(followResult[i]==c)
return;
followResult[m++]=c; }
No comments:
Post a Comment