101
{ USER }
posts: 55
last: 09-Apr-2008
TITLE: Regular exp to nfa
DESCRIPTION: Regular exp to nfa
Submitted: 09-Apr-2008 10:10:22 ( 38w 5d 20h ago ) Language: C++ (*.cpp *.h)
Views: 82 Lines of Code: 82 LINES
Rating:
rate: star1
star2
star3
star4
star5
dstar1
dstar2
dstar3
dstar4
dstar5  ( rated! )
  { 0.00 / 5 }
Difficulty: Intermediate
Bookmark
/* Author: 
   Date: 09-04-2008
   Filename: 
   Description: 
   History: 
*/


# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <ctype.h>
// regular expression to nfa by g.ram kumar
// works for everything but produces excessive epsilon transitions
int ret[100];
static int pos=0;
static int sc=0;
void nfa(int st,int p,char *s)
{    int i,sp,fs[15],fsc=0;
	sp=st;pos=p;sc=st;
	while(*s!=NULL)
	{if(isalpha(*s))
	    {ret[pos++]=sp;
		ret[pos++]=*s;
		ret[pos++]=++sc;}
	if(*s=='.')
		{sp=sc;
		 ret[pos++]=sc;
		 ret[pos++]=238;
		 ret[pos++]=++sc;
		 sp=sc;}
	if(*s=='|')
		{sp=st;
		 fs[fsc++]=sc;}
	if(*s=='*')
		{ret[pos++]=sc;
		 ret[pos++]=238;
		 ret[pos++]=sp;
		 ret[pos++]=sp;
		 ret[pos++]=238;
		 ret[pos++]=sc;
		 }
	 if (*s=='(')
		{char ps[50];
		 int i=0,flag=1;
		 s++;
		   while(flag!=0)
			{ps[i++]=*s;
			 if (*s=='(')
				flag++;
			 if (*s==')')
				flag--;
			 s++;}
			 ps[--i]='\0';
			 nfa(sc,pos,ps);
			 s--;
		}
	 s++;
	}
	sc++;
	  for(i=0;i<fsc;i++)
		 {ret[pos++]=fs[i];
		  ret[pos++]=238;
		  ret[pos++]=sc;
		 }
		  ret[pos++]=sc-1;
		  ret[pos++]=238;
		  ret[pos++]=sc;
}
void main()
{    int i;
	char *inp;
	clrscr();
	printf("enter the regular expression :");
	gets(inp);
	nfa(1,0,inp);
	printf("\nstate  input  state\n");
	for(i=0;i<pos;i=i+3)
		 printf("%d     --%c-->      %d\n",ret[i],ret[i+1],ret[i+2]);
	printf("\n");
	getch();
}