Thursday, February 3, 2022

First and Follow code using flex in C language System Programming and Compilers

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