#include #include #define STATES99#define SYMBOLS20int N_symbols;/* number of input symbols */int N_NFA_states;/* number of NFA states */char *NFAtab[STATES][SYMBOLS];char *NFA_finals;/* NFA final states */int N_DFA_states;/* number of DFA states */int DFAtab[STATES][SYMBOLS];char DFA_finals[STATES+1];/* NFA final states */char StateName[STATES][STATES+1];/* state name table */char Eclosure[STATES][STATES+1];/* epsilon closure for each state *//*Print state-transition table.State names: 'A', 'B', 'C', ...*/void print_nfa_table(char *tab[][SYMBOLS],/* DFA table */int nstates,/* number of states */int nsymbols,/* number of input symbols */char *finals)/* final states */{int i, j;puts("nNFA: STATE TRANSITION TABLE");/* input symbols: '0', '1', ... */printf(" | ");for (i = 0; i < nsymbols; i++) printf(" %-6c", '0'+i);printf(" en");/* epsilon */printf("-----+--");for (i = 0; i < nsymbols+1; i++) printf("-------");printf("n");for (i = 0; i < nstates; i++) {printf(" %c | ", '0'+i);/* statehar *finals)/* final states */{int i, j;puts("nDFA: STATE TRANSITION TABLE");/* input symbols: '0', '1', ... */printf(" | ");for (i = 0; i < nsymbols; i++) printf(" %c ", '0'+i);printf("n-----+--");for (i = 0; i < nsymbols; i++) printf("-----");printf("n");for (i = 0; i < nstates; i++) {printf(" %c | ", 'A'+i);/* state */for (j = 0; j < nsymbols; j++)printf(" %c ", tab[i][j]);printf("n");}printf("Final states = %sn", finals);}/*Initialize NFA table.*/void load_NFA_table(){/*epsilon-NFA table for ex.24 at p.82Last input symbol is an epsilon.Input symbols : 0(a), 1(b), 2(epsilon)NFAtab[0][0] = "0";NFAtab[0][1] = "";NFAtab[0][2] = "13";NFAtab[1][0] = "2";NFAtab[1][1] = "";NFAtab[1][2] = "";NFAtab[2][0] = "";NFAtab[2][1] = "2";NFAtab[2][2] = "3";NFAtab[3][0] = "3";NFAtab[3][1] = "";NFAtab[3][2] = "";N_symbols = 2;N_NFA_states = 4;NFA_finals = "3";N_DFA_states = 0;*//*epsilon-NFA table for ex.25 at p.82-83Last input symbol is an epsilon.Input symbols : 0(a), 1(b), 2(epsilon)*/NFAtab[0]= 4;NFA_finals = "3";N_DFA_states = 0;}/*String 't' is merged into 's' in an alphabetical order.Return value: number of items that are added to 's'.*/int string_merge(char *s, char *t){int n=0;char temp[STATES+1], *r=temp, *p=s;while (*p && *t) {if (*p == *t) {*r++ = *p++; t++;} else if (*p < *t) {*r++ = *p++;} else {*r++ = *t++;n++;/* an item is added to 's' */}}*r = '