0% found this document useful (0 votes)
13 views3 pages

CD File

This document contains a program to convert a non-deterministic finite automaton (NFA) to a deterministic finite automaton (DFA) using bitmasking. It includes theory on the differences between NFAs and DFAs, as well as code to define the NFA transitions, generate the DFA states, and test strings using the resulting DFA. The program takes in the NFA configuration and outputs the corresponding DFA states and whether input strings are accepted or rejected by the DFA.

Uploaded by

Raj Maddhesia
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views3 pages

CD File

This document contains a program to convert a non-deterministic finite automaton (NFA) to a deterministic finite automaton (DFA) using bitmasking. It includes theory on the differences between NFAs and DFAs, as well as code to define the NFA transitions, generate the DFA states, and test strings using the resulting DFA. The program takes in the NFA configuration and outputs the corresponding DFA states and whether input strings are accepted or rejected by the DFA.

Uploaded by

Raj Maddhesia
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 3

Name:Raj Bhushan Roll.

No : Sec: CSE-B
2100320100130
AIM: A Program to convert NFA to DFA using bitmasking.

Theory : An NFA can have zero, one or more than one move from a given state on a given input
symbol. An NFA can also have NULL moves (moves without input symbol). On the other hand,
DFA has one and only one move from a given state on a given input symbol.

Code:
#include<stdio.h>
#include<string.h>
#include<math.h>
int ninputs;
int dfa[100][2][100] = {0};
int state[10000] = {0};
char ch[10],
str[1000]; int
go[10000][2] = {0};
int arr[10000] = {0};
int main()
{
int st, fin, in;
int f[10];
int i,j=3,s=0,final=0,flag=0,curr1,curr2,k,l;
int c;
printf("\nFollow the one based indexing\n"); printf("\
nEnter the number of states::"); scanf("%d",&st);
printf("\nGive state numbers from 0 to %d",st-1);
for(i=0;i<st;i++)
state[(int)(pow(2,i))] = 1; printf("\
nEnter number of final states\t"); scanf("%d",&fin);
printf("\nEnter final states::");
for(i=0;i<fin;i++){
scanf("%d",&f[i]);
}
int p,q,r,rel;
printf("\nEnter the number of rules according to NFA::");
scanf("%d",&rel);
printf("\n\nDefine transition rule as \"initial state input symbol final state\"\n");
for(i=0; i<rel; i++){
scanf("%d%d%d",&p,&q,&r);
if (q==0)
dfa[p][0][r] = 1;
else
dfa[p][1][r] = 1;
}
printf("\nEnter initial state::");
scanf("%d",&in);
in = pow(2,in);
i=0;
printf("\nSolving according to DFA");
int x=0;
for(i=0;i<st;i++){
for(j=0;j<2;j++){
int stf=0;
Name:Raj Bhushan Roll.No : Sec: CSE-B
2100320100130

for(k=0;k<st;k++){
if(dfa[i][j][k]==1)
stf = stf + pow(2,k);
}
go[(int)(pow(2,i))][j] = stf;
printf("%d-%d-->%d\n",(int)(pow(2,i)),j,stf);
if(state[stf]==0)
arr[x++] = stf;
state[stf] = 1;
}}
for(i=0;i<x;i++){
printf("for %d-----",arr[x]);
for(j=0;j<2;j++){
int new=0;
for(k=0;k<st;k++){
if(arr[i] & (1<<k)){
int h = pow(2,k);
if(new==0)
new = go[h][j];
new = new | (go[h][j]);

}
}
if(state[new]==0){
arr[x++] = new;
state[new] = 1;
}
}
}
printf("\nThe total number of distinct states are::\n");
printf("STATE 0 1\n");
for(i=0;i<10000;i++){
if(state[i]==1){
int y=0;
if(i==0)
printf("q0 ");

else
for(j=0;j<st;j++){
int x =
1<<j;
if(x&i){
printf("q%d ",j);
y = y+pow(2,j);
}
}
printf(" %d %d",go[y][0],go[y][1]);
printf("\n");
}
}
j=3;
while(j--){
printf("\nEnter string");
scanf("%s",str);
l = strlen(str);
Name:Raj Bhushan Roll.No : Sec: CSE-B
2100320100130

curr1 =
in; flag =
0;
printf("\nString takes the following path-->\n");
printf("%d-",curr1);
for(i=0;i<l;i++)
{
curr1 = go[curr1][str[i]-'0'];
printf("%d-",curr1);
}
printf("\nFinal state - %d\n",curr1);
for(i=0;i<fin;i++){
if(curr1 & (1<<f[i])){
flag = 1;
break;
}
}
if(flag)
printf("\nString Accepted"); printf("\
else
nString Rejected");

}
return 0;
}
OUTPUT:

You might also like