Skip to content

Latest commit

 

History

History
74 lines (73 loc) · 1.89 KB

File metadata and controls

74 lines (73 loc) · 1.89 KB

Write a program to construct a Non Deterministic Finite Automata (NFA) from Regular Expression using C/ C++/ Java

#include<stdio.h>
#include<string.h>
int main()
{
	char reg[20]; int q[20][3],i=0,j=1,len,a,b;
	for(a=0;a<20;a++) for(b=0;b<3;b++) q[a][b]=0;
	scanf("%s",reg);
	printf("Given regular expression: %s\n",reg);
	len=strlen(reg);
	while(i<len)
	{
		if(reg[i]=='a'&&reg[i+1]!='|'&&reg[i+1]!='*') { q[j][0]=j+1; j++; }
		if(reg[i]=='b'&&reg[i+1]!='|'&&reg[i+1]!='*') {	q[j][1]=j+1; j++;	}
		if(reg[i]=='e'&&reg[i+1]!='|'&&reg[i+1]!='*') {	q[j][2]=j+1; j++;	}
		if(reg[i]=='a'&&reg[i+1]=='|'&&reg[i+2]=='b') 
		{ 
		  q[j][2]=((j+1)*10)+(j+3); j++; 
		  q[j][0]=j+1; j++;
			q[j][2]=j+3; j++;
			q[j][1]=j+1; j++;
			q[j][2]=j+1; j++;
			i=i+2;
		}
		if(reg[i]=='b'&&reg[i+1]=='|'&&reg[i+2]=='a')
		{
			q[j][2]=((j+1)*10)+(j+3); j++;
			q[j][1]=j+1; j++;
			q[j][2]=j+3; j++;
			q[j][0]=j+1; j++;
			q[j][2]=j+1; j++;
			i=i+2;
		}
		if(reg[i]=='a'&&reg[i+1]=='*')
		{
			q[j][2]=((j+1)*10)+(j+3); j++;
			q[j][0]=j+1; j++;
			q[j][2]=((j+1)*10)+(j-1); j++;
		}
		if(reg[i]=='b'&&reg[i+1]=='*')
		{
			q[j][2]=((j+1)*10)+(j+3); j++;
			q[j][1]=j+1; j++;
			q[j][2]=((j+1)*10)+(j-1); j++;
		}
		if(reg[i]==')'&&reg[i+1]=='*')
		{
			q[0][2]=((j+1)*10)+1;
			q[j][2]=((j+1)*10)+1;
			j++;
		}
		i++;
	}
	printf("\n\tTransition Table \n");
	printf("_____________________________________\n");
	printf("Current State |\tInput |\tNext State");
	printf("\n_____________________________________\n");
	for(i=0;i<=j;i++)
	{
		if(q[i][0]!=0) printf("\n  q[%d]\t      |   a   |  q[%d]",i,q[i][0]);
		if(q[i][1]!=0) printf("\n  q[%d]\t      |   b   |  q[%d]",i,q[i][1]);
		if(q[i][2]!=0) 
		{
			if(q[i][2]<10) printf("\n  q[%d]\t      |   e   |  q[%d]",i,q[i][2]);
			else printf("\n  q[%d]\t      |   e   |  q[%d] , q[%d]",i,q[i][2]/10,q[i][2]%10);
		}
	}
	printf("\n_____________________________________\n");
	return 0;
}

// (a|b)*