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

5 Null NFA

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

5 Null NFA

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

PROGRAM NO.

- 5 19-Oct-23

Write a C Program to convert NFA with NULL movement into NFA


without NULL movement:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STATES 10
#define MAX_ALPHABET_SIZE 26
struct NFAState
{
int transitions[MAX_ALPHABET_SIZE][MAX_STATES];
int isFinal;
};
int nfaSize;
struct NFAState nfa[MAX_STATES];
int closure[MAX_STATES];
int closureSize;
int nextState = 0;
int newNfaSize;
struct NFAState newNfa[MAX_STATES];
void epsilonClosure(int state)
{
if (closure[state])
{
return;
}
closure[state] = 1;
for (int i = 0; i < nfaSize; i++)
{
if (nfa[state].transitions[MAX_ALPHABET_SIZE - 1][i])
{
epsilonClosure(i);
}
}
}
void move(int inputSymbol, int fromStates[], int fromSize, int toStates[], int* toSize)
{
for (int i = 0; i < fromSize; i++)
{
int state = fromStates[i];
for (int j = 0; j < nfaSize; j++)
{
if (nfa[state].transitions[inputSymbol][j])
{
toStates[(*toSize)++] = j;
}
}
}
}

int addState(int states[], int size)


{
for (int i = 0; i < newNfaSize; i++)
{
if (memcmp(newNfa[i].transitions, states, sizeof(int) * MAX_ALPHABET_SIZE)
== 0)
{
return i;
}
}
memcpy(newNfa[newNfaSize].transitions, states, sizeof(int) * MAX_ALPHABET_SIZE);
newNfa[newNfaSize].isFinal = 0;
return newNfaSize++;
}

int main()
{
nfaSize = 2;
nfa[0].transitions[MAX_ALPHABET_SIZE - 1][1] = 1;
nfa[0].isFinal = 1;
for (int i = 0; i < nfaSize; i++)
{
closure[i] = 0;
}

newNfaSize = 0;
addState(closure, nfaSize);
for (int state = 0; state < newNfaSize; state++)
{
int newStateSet[MAX_STATES];
int newStateSetSize = 0;
for (int inputSymbol = 0; inputSymbol < MAX_ALPHABET_SIZE;
inputSymbol++)
{
move(inputSymbol, newNfa[state].transitions[MAX_ALPHABET_SIZE -
1], nfaSize, newStateSet, &newStateSetSize);
epsilonClosure(newStateSet[0]);
int newState = addState(closure, nfaSize);
newNfa[state].transitions[inputSymbol][0] = newState;
if (nfa[newStateSet[0]].isFinal)
{
newNfa[newState].isFinal = 1;
}
for (int i = 0; i < nfaSize; i++)
{
closure[i] = 0;
}
}
}
printf("Equivalent NFA without ε-transitions:\n");
for (int state = 0; state < newNfaSize; state++)
{
printf("State q%d: ", state);
for (int inputSymbol = 0; inputSymbol < MAX_ALPHABET_SIZE;
inputSymbol++)
{
printf("q%d ", newNfa[state].transitions[inputSymbol][0]);
}
if (newNfa[state].isFinal)
{
printf("(Final)");
}
printf("\n");
}
return 0;
}

Output:
Number of States: 3

Transitions:
State 0: On input 'a', go to states 0 and 1 (with ε-transition).
State 1: On input 'b', go to state 2.
State 2: On input 'a', go to state 2 (with ε-transition).

State 0 is the start state, and state 2 is the final state.

Equivalent NFA without ε-transitions:

State q0: q0 q1
State q1: q2 (Final)
State q2:

You might also like