Thanks to visit codestin.com
Credit goes to www.scribd.com

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

Exp 11

Uploaded by

amandeep s
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 views5 pages

Exp 11

Uploaded by

amandeep s
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/ 5

#include <stdio.

h>
#include <stdlib.h>
#include <string.h>

#define MAX 10

int n;
char states[MAX][MAX];
int eclosure[MAX][MAX];
char symbols[] = "0123456789abcdefghijklmnopqrstuvwxyz";
int numSymbols;

void closure(int state, int visited[]) {


visited[state] = 1;
for (int j = 0; j < n; j++) {
if ((states[state][j] == 'e' || states[state][j] == 'E') &&
!visited[j]) {
closure(j, visited);
}
}
}

int main() {
int finalStates[MAX] = {0};
int startState;

printf("Enter number of states: ");


scanf("%d", &n);

printf("Enter start state (0 to %d): ", n - 1);


scanf("%d", &startState);

int numFinal;
printf("Enter number of final states: ");
scanf("%d", &numFinal);
printf("Enter final states: ");
for (int i = 0; i < numFinal; i++) {
int f;
scanf("%d", &f);
finalStates[f] = 1;
}

printf("\nEnter the transition table:\n");


printf("(use 'e' for epsilon, '-' for no transition, other chars for
symbols like 0/1)\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("From q%d to q%d: ", i, j);
scanf(" %c", &states[i][j]);
}
}

printf("\nOriginal Transition Table:\n");


for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%c ", states[i][j]);
}
printf("\n");
}

memset(eclosure, 0, sizeof(eclosure));
for (int start = 0; start < n; start++) {
int visited[MAX] = {0};
closure(start, visited);
for (int i = 0; i < n; i++) {
eclosure[start][i] = visited[i];
}
}

printf("\nEpsilon-closures:\n");
for (int i = 0; i < n; i++) {
printf("E-closure(q%d): { ", i);
for (int j = 0; j < n; j++) {
if (eclosure[i][j]) printf("q%d ", j);
}
printf("}\n");
}

numSymbols = strlen(symbols);
int newTrans[MAX][numSymbols][MAX];
memset(newTrans, 0, sizeof(newTrans));

for (int s = 0; s < n; s++) {


for (int si = 0; si < numSymbols; si++) {
char sym = symbols[si];

int reach[MAX] = {0};


for (int c = 0; c < n; c++) {
if (eclosure[s][c]) {
for (int t = 0; t < n; t++) {
if (states[c][t] == sym) {
for (int z = 0; z < n; z++) {
if (eclosure[t][z]) reach[z] = 1;
}
}
}
}
}
for (int r = 0; r < n; r++) {
if (reach[r]) newTrans[s][si][r] = 1;
}
}
}

printf("\nCorrected NFA Transition Table (without epsilon):\n");


printf(" |");
for (int si = 0; si < numSymbols; si++) {
int hasTransition = 0;
for(int s = 0; s < n; s++){
for(int d = 0; d < n; d++){
if(newTrans[s][si][d]){
hasTransition = 1;
break;
}
}
if(hasTransition) break;
}
if(hasTransition) printf(" %c |", symbols[si]);
}
printf("\n--------+");
for (int si = 0; si < numSymbols; si++) {
int hasTransition = 0;
for(int s = 0; s < n; s++){
for(int d = 0; d < n; d++){
if(newTrans[s][si][d]){
hasTransition = 1;
break;
}
}
if(hasTransition) break;
}
if(hasTransition) printf("--------+");
}
printf("\n");

for (int s = 0; s < n; s++) {


if (s == startState) printf("->");
else printf(" ");

int isFinal = 0;
for(int i=0; i<n; ++i){
if(eclosure[s][i] && finalStates[i]){
isFinal = 1;
break;
}
}
if (isFinal) printf("*");
else printf(" ");

printf("q%-3d |", s);

for (int si = 0; si < numSymbols; si++) {


int hasTransition = 0;
for(int s_check = 0; s_check < n; s_check++){
for(int d = 0; d < n; d++){
if(newTrans[s_check][si][d]){
hasTransition = 1;
break;
}
}
if(hasTransition) break;
}
if(!hasTransition) continue;

printf(" {");
int empty = 1;
int first = 1;
for (int dest = 0; dest < n; dest++) {
if (newTrans[s][si][dest]) {
if(!first) printf(",");
printf("q%d", dest);
empty = 0;
first = 0;
}
}
if (empty) printf("- ");
printf("} |",-7);
}
printf("\n");
}

return 0;
}

You might also like