COMPILER DESIGN : FINDING LEFT RECURSION

/*Include Header files*/
/*This programs is implemented using file I/O*/
int i,j,k,flag1=0,flag2=0;
char a,non[50],non1[50],non2[50],rem[50][50];
char epn=238;
FILE *fp;
void add_non()
{
for(k=-1;k
{
k++;
if(non[k]==a)break;
}
if(k==strlen(non)){non[k]=a;non[k+1]='\0';}
}
void lr_elimination(int nop)
{flag2=1;
for(k=0;k
{
if((non[j]==non1[k])&(non1[k]!=non2[k]))
{fprintf(fp,"\n%c->%c%s%c'",non[j],non2[k],rem[k],non[j]);flag1=1;}
}
if(flag1==0)fprintf(fp,"\n%c->%c'",non[j],non[j]);flag1=0;
for(k=0;k
{
if((non[j]==non1[k])&(non1[k]==non2[k]))
fprintf(fp,"\n%c'->%s%c'|%c",non[j],rem[k],non[j],epn);
}
}
void check_lr(int nop)
{
for(j=0;j
{
for(i=0;i
{
if((non1[i]==non2[i])&(non[j]!=32)&(non[j]==non1[i]))
{
printf("\nThe non-terminal %c is left recursive:",non1[i]);
fprintf(fp,"\nThe non-terminal %c is left recursive:",non1[i]);
lr_elimination(nop);break;
}}}
if(flag2==0)
{
fprintf(fp,"\nThere is no left recursion found in the given grammar");
printf("\nThere is no left recursion found in the given grammar");
}
}
void main()
{
clrscr();i=0;
fp=fopen("lre.txt","w");
printf("\nType the grammar productions:\n");
printf("Note:-To get output press Escape button\n\n");
while(1)
{
if(a!='|'){ printf("\n");
if(((a=getche())>=65)&(a<=90))
{non1[i]=a;add_non();}else {printf("\b \b\b");continue;}
printf("->");}else non1[i]=non1[i-1];
for(j=0,k=-1;((a=getche())!=13)&(a!=124)&(a!=27);k++)
{
if(j==0){non2[i]=a;j++;}
else
rem[i][k]=a;
}rem[i][k]='\0';i++;if(a==27){printf("\b ");break;}
}
check_lr(i);
printf("\n\nNote:-Output is return in the file lre.txt");
getch();
}

Comments

Popular Posts