#include<stdio.h>
#include<conio.h>
#include<string.h>
int j,start;
char re[50];
int fn(int I,int end,int one)
{
if(re[i]=='*')
{
start=end;
printf("%d->%d:%c\n",one,start+1,'^');
printf("%d->%d:%c\n",one,start+3,'^');
one++;
if(isalpha(re[i-1]) || isdigit(re[i-1]))
{
printf("%d->%d:%c\n",one++,start+2,re[i-1]);
}
printf("%d->%d:%c\n",one,start+1,'^');
printf("%d->%d:%c\n",one,start+3,'^');
one++;
end=start+3;
return(end);
}
else if(re[i]=='+')
{
start=end;
printf("%d->%d:%c\n",one++,start+1,'^');
if(isalpha(re[i-1]) || isdigit(re[i-1]))
printf("%d->%d:%c\n",one++,start+2,re[i-1]);
printf("%d->%d:%c\n",one,start+1,re[i-1]);
printf("%d->%d:%c\n",one++,start+3,'^');
end=start+3;
return(end);
}
else if(re[i]=='?')
{
start=end;
printf("%d->%d:%c\n",one,start+1,'^');
printf("%d->%d:%c\n",one++,start+3,'^');
if(isalpha(re[i-1]) || isdigit(re[i=1]))
printf("%d->%d:%c\n",one++,start+2,re[i-1]);
printf("%d->%d:%c\n",one++,start+3,'^');
end=start+3;
return(end);
}
else if(re[i]=='|')
{
start=end;
printf("%d->%d:%c\n",one,start+1,'^');
printf("%d->%d;%c\n",one,start+3,'^');
one++;
if(isalpha(re[i-1]) || isdigit(re[i-1]))
printf("%d->%d:%c\n",one++,start+2,re[i-1]);
printf("%d->%d:%c\n",one++,start+5,'^');
if(isalpha(re[i+1]) || isdigit(re[i+1]))
printf("%d->%d:%c\n",one++,start+4,re[i+1]);
printf("%d->%d:%c\n",one++,start+5,'^');
end=start+5;
return(end);
}
else if(re[i+1]!='|' && re[i-1]!='|' && re[i+1]!='*' && re[i+1]!='+' && re[i+1]!='?' )
{
start=end;
if(isalpha(re[i]) || isdigit(re[i]))
printf("%d->%d:%c\n",one++,start+1,re[i]);
end=start+1;
return(end);
}
else
{
return(end);
}
}
void main()
{
FILE *fp,*fp1;
int I,c=0,k,start=0,end=0,one=0;
char name[20];
clrscr();
printf("\nEnter the file name:");
scanf("%s",name);
fp=fopen(name,"r");
//fp1=fopen("nfa.txt","w");
if(fp==NULL)
{
printf("\nCannot open file");
exit();
}
//printf("\nopen the file nfa to verify the output");
while(!feof(fp))
{
end=start=one=0;
if(fgets(re,50,fp)!=NULL)
{
printf("\nRE:%s\n",re);
for(I=0;re[i]!=NULL;i++)
{
if(re[i]=='(')
{
j=i;
for(re[j]='(';re[j]!=')';j++)
c++;
if(re[j]==')')
{
if(re[j+1]=='*')
{
start=end;
k=one;
printf("%d->%d:%c\n",one++,start+1,'^');
end=start+1;
I++;
for(;re[i]!=')';i++)
{
end=fn(I,end,one);
}
start=end;
printf("%d->%d:%c\n",k,start+1,'^');
printf("%d->%d:%c\n",end,start+1,'^');
printf("%d->%d:%c\n",end,k+1,'^');
end=start+1;
one=end;
}
}
I=c+1;
}
else
{
end=fn(I,end,one);
one=end;
}
}
}
}
getch();
}
|