===== nfa_closure.c ===== #include #include char result[20][20], copy[3], states[20][20]; void add_state(char a[3], int i) { strcpy(result[i], a); } void display(int n) { int k = 0; printf("\nEpsilon closure of %s = { ", copy); while (k < n) { printf(" %s", result[k]); k++; } printf(" }\n"); } int main() { int n, t; // n = number of states, t = number of transitions int i, k; char state[3], state1[3], input[3], state2[3]; printf("Enter the number of states: "); scanf("%d", &n); printf("Enter the states:\n"); for (k = 0; k < n; k++) { scanf("%s", states[k]); } printf("Enter the number of transitions: "); scanf("%d", &t); char trans_from[20][3], trans_input[20][3], trans_to[20][3]; printf("Enter transitions in the form \n"); printf("(use 'e' for epsilon):\n"); for (i = 0; i < t; i++) { scanf("%s %s %s", trans_from[i], trans_input[i], trans_to[i]); } // compute epsilon closure for each state for (k = 0; k < n; k++) { int count = 0; strcpy(state, states[k]); strcpy(copy, state); add_state(state, count++); int changed = 1; while (changed) { changed = 0; for (i = 0; i < t; i++) { if (strcmp(state, trans_from[i]) == 0 && strcmp(trans_input[i], "e") == 0) { add_state(trans_to[i], count++); strcpy(state, trans_to[i]); changed = 1; } } } display(count); } return 0; } ===== run ===== nano nfa_closure.c gcc nfa_closure.c -o nfa_closure ./nfa_closure