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: