Question

In: Computer Science

Write a program to convert an NFA to an equivalent DFA. The NFA may contain ε...

Write a program to convert an NFA to an equivalent DFA. The NFA may contain ε transitions.

Solutions

Expert Solution

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX_LEN 100

char NFA_FILE[MAX_LEN];

char buffer[MAX_LEN];

int zz = 0;

// Structure to store DFA states and their

// status ( i.e new entry or already present)

struct DFA {

  char *states;

  int count;

} dfa;

int last_index = 0;

FILE *fp;

int symbols;

/* reset the hash map*/

void reset(int ar[], int size) {

  int i;

  // reset all the values of

  // the mapping array to zero

  for (i = 0; i < size; i++) {

    ar[i] = 0;

  }

}

// Check which States are present in the e-closure

/* map the states of NFA to a hash set*/

void check(int ar[], char S[]) {

  int i, j;

  // To parse the individual states of NFA

  int len = strlen(S);

  for (i = 0; i < len; i++) {

    // Set hash map for the position

    // of the states which is found

    j = ((int)(S[i]) - 65);

    ar[j]++;

  }

}

// To find new Closure States

void state(int ar[], int size, char S[]) {

  int j, k = 0;

  // Combine multiple states of NFA

  // to create new states of DFA

  for (j = 0; j < size; j++) {

    if (ar[j] != 0)

      S[k++] = (char)(65 + j);

  }

  // mark the end of the state

  S[k] = '\0';

}

// To pick the next closure from closure set

int closure(int ar[], int size) {

  int i;

  // check new closure is present or not

  for (i = 0; i < size; i++) {

    if (ar[i] == 1)

      return i;

  }

  return (100);

}

// Check new DFA states can be

// entered in DFA table or not

int indexing(struct DFA *dfa) {

  int i;

  for (i = 0; i < last_index; i++) {

    if (dfa[i].count == 0)

      return 1;

  }

  return -1;

}

/* To Display epsilon closure*/

void Display_closure(int states, int closure_ar[],

                     char *closure_table[],

                     char *NFA_TABLE[][symbols + 1],

                     char *DFA_TABLE[][symbols]) {

  int i;

  for (i = 0; i < states; i++) {

    reset(closure_ar, states);

    closure_ar[i] = 2;

    // to neglect blank entry

    if (strcmp(&NFA_TABLE[i][symbols], "-") != 0) {

      // copy the NFA transition state to buffer

      strcpy(buffer, &NFA_TABLE[i][symbols]);

      check(closure_ar, buffer);

      int z = closure(closure_ar, states);

      // till closure get completely saturated

      while (z != 100)

      {

        if (strcmp(&NFA_TABLE[z][symbols], "-") != 0) {

          strcpy(buffer, &NFA_TABLE[z][symbols]);

          // call the check function

          check(closure_ar, buffer);

        }

        closure_ar[z]++;

        z = closure(closure_ar, states);

      }

    }

    // print the e closure for every states of NFA

    printf("\n e-Closure (%c) :\t", (char)(65 + i));

    bzero((void *)buffer, MAX_LEN);

    state(closure_ar, states, buffer);

    strcpy(&closure_table[i], buffer);

    printf("%s\n", &closure_table[i]);

  }

}

/* To check New States in DFA */

int new_states(struct DFA *dfa, char S[]) {

  int i;

  // To check the current state is already

  // being used as a DFA state or not in

  // DFA transition table

  for (i = 0; i < last_index; i++) {

    if (strcmp(&dfa[i].states, S) == 0)

      return 0;

  }

  // push the new

  strcpy(&dfa[last_index++].states, S);

  // set the count for new states entered

  // to zero

  dfa[last_index - 1].count = 0;

  return 1;

}

// Transition function from NFA to DFA

// (generally union of closure operation )

void trans(char S[], int M, char *clsr_t[], int st,

               char *NFT[][symbols + 1], char TB[]) {

  int len = strlen(S);

  int i, j, k, g;

  int arr[st];

  int sz;

  reset(arr, st);

  char temp[MAX_LEN], temp2[MAX_LEN];

  char *buff;

  // Transition function from NFA to DFA

  for (i = 0; i < len; i++) {

    j = ((int)(S[i] - 65));

    strcpy(temp, &NFT[j][M]);

    if (strcmp(temp, "-") != 0) {

      sz = strlen(temp);

      g = 0;

      while (g < sz) {

        k = ((int)(temp[g] - 65));

        strcpy(temp2, &clsr_t[k]);

        check(arr, temp2);

        g++;

      }

    }

  }

  bzero((void *)temp, MAX_LEN);

  state(arr, st, temp);

  if (temp[0] != '\0') {

    strcpy(TB, temp);

  } else

    strcpy(TB, "-");

}

/* Display DFA transition state table*/

void Display_DFA(int last_index, struct DFA *dfa_states,

                 char *DFA_TABLE[][symbols]) {

  int i, j;

  printf("\n\n********************************************************\n\n");

  printf("\t\t DFA TRANSITION STATE TABLE \t\t \n\n");

  printf("\n STATES OF DFA :\t\t");

  for (i = 1; i < last_index; i++)

    printf("%s, ", &dfa_states[i].states);

  printf("\n");

  printf("\n GIVEN SYMBOLS FOR DFA: \t");

  for (i = 0; i < symbols; i++)

    printf("%d, ", i);

  printf("\n\n");

  printf("STATES\t");

  for (i = 0; i < symbols; i++)

    printf("|%d\t", i);

  printf("\n");

  // display the DFA transition state table

  printf("--------+-----------------------\n");

  for (i = 0; i < zz; i++) {

    printf("%s\t", &dfa_states[i + 1].states);

    for (j = 0; j < symbols; j++) {

      printf("|%s \t", &DFA_TABLE[i][j]);

    }

    printf("\n");

  }

}

// Driver Code

int main() {

  int i, j, states;

  char T_buf[MAX_LEN];

  // creating an array dfa structures

  struct DFA *dfa_states = malloc(MAX_LEN * (sizeof(dfa)));

  states = 6, symbols = 2;

  printf("\n STATES OF NFA :\t\t");

  for (i = 0; i < states; i++)

    printf("%c, ", (char)(65 + i));

  printf("\n");

  printf("\n GIVEN SYMBOLS FOR NFA: \t");

  for (i = 0; i < symbols; i++)

    printf("%d, ", i);

  printf("eps");

  printf("\n\n");

  char *NFA_TABLE[states][symbols + 1];

  // Hard coded input for NFA table

  char *DFA_TABLE[MAX_LEN][symbols];

  strcpy(&NFA_TABLE[0][0], "FC");

  strcpy(&NFA_TABLE[0][1], "-");

  strcpy(&NFA_TABLE[0][2], "BF");

  strcpy(&NFA_TABLE[1][0], "-");

  strcpy(&NFA_TABLE[1][1], "C");

  strcpy(&NFA_TABLE[1][2], "-");

  strcpy(&NFA_TABLE[2][0], "-");

  strcpy(&NFA_TABLE[2][1], "-");

  strcpy(&NFA_TABLE[2][2], "D");

  strcpy(&NFA_TABLE[3][0], "E");

  strcpy(&NFA_TABLE[3][1], "A");

  strcpy(&NFA_TABLE[3][2], "-");

  strcpy(&NFA_TABLE[4][0], "A");

  strcpy(&NFA_TABLE[4][1], "-");

  strcpy(&NFA_TABLE[4][2], "BF");

  strcpy(&NFA_TABLE[5][0], "-");

  strcpy(&NFA_TABLE[5][1], "-");

  strcpy(&NFA_TABLE[5][2], "-");

  printf("\n NFA STATE TRANSITION TABLE \n\n\n");

  printf("STATES\t");

  for (i = 0; i < symbols; i++)

    printf("|%d\t", i);

  printf("eps\n");

  // Displaying the matrix of NFA transition table

  printf("--------+------------------------------------\n");

  for (i = 0; i < states; i++) {

    printf("%c\t", (char)(65 + i));

    for (j = 0; j <= symbols; j++) {

      printf("|%s \t", &NFA_TABLE[i][j]);

    }

    printf("\n");

  }

  int closure_ar[states];

  char *closure_table[states];

  Display_closure(states, closure_ar, closure_table, NFA_TABLE, DFA_TABLE);

  strcpy(&dfa_states[last_index++].states, "-");

  dfa_states[last_index - 1].count = 1;

  bzero((void *)buffer, MAX_LEN);

  strcpy(buffer, &closure_table[0]);

  strcpy(&dfa_states[last_index++].states, buffer);

  int Sm = 1, ind = 1;

  int start_index = 1;

  // Filling up the DFA table with transition values

  // Till new states can be entered in DFA table

  while (ind != -1) {

    dfa_states[start_index].count = 1;

    Sm = 0;

    for (i = 0; i < symbols; i++) {

      trans(buffer, i, closure_table, states, NFA_TABLE, T_buf);

      // storing the new DFA state in buffer

      strcpy(&DFA_TABLE[zz][i], T_buf);

      // parameter to control new states

      Sm = Sm + new_states(dfa_states, T_buf);

    }

    ind = indexing(dfa_states);

    if (ind != -1)

      strcpy(buffer, &dfa_states[++start_index].states);

    zz++;

  }

  // display the DFA TABLE

  Display_DFA(last_index, dfa_states, DFA_TABLE);

  return 0;

}


Related Solutions

Construct NFA of following languages and convert it to equivalent DFA. The set of all binary...
Construct NFA of following languages and convert it to equivalent DFA. The set of all binary strings such that 3th symbol from right end is 0.
Draw an NFA for the following language then convert to a DFA: L = {w :...
Draw an NFA for the following language then convert to a DFA: L = {w : |w| is odd or |w| is a multiple of 4} where Σ = {0, 1}
Q5 [15 pts] a) Convert the following NFA to a DFA: 0 1 ---------------------- -> a...
Q5 [15 pts] a) Convert the following NFA to a DFA: 0 1 ---------------------- -> a || {a} | {a,b} b || {c} | {c} c || {d} | {d} d || {e} | {e} * e || {} | {} b) Informally describe the language that it accepts.
Convert the following NFA given by M to a DFA. Show your work which includes both...
Convert the following NFA given by M to a DFA. Show your work which includes both state diagrams. M = ( {q0, q1, q2} , {a, b} , δ, q0, {q1}) with the state table given a b q0 {q1, q1} q1 null {q2} q2 null {q2}
For the following lexical specification: Give NFA and DFA Using your DFA, Implement a lexical analyzer...
For the following lexical specification: Give NFA and DFA Using your DFA, Implement a lexical analyzer using the state table approach shown in class • keywords: if wh pr • Identifiers. An identifier is a sequence of one or more letters • Integer literals. An integer literal is a sequence of one or more decimal digits. • Any of the following one- or two-character symbols: = ( ) { } / * - + < <= == != • Note...
Take the Java program Pretty.java and convert it to the equivalent C program. You can use...
Take the Java program Pretty.java and convert it to the equivalent C program. You can use the file in.txt as sample input for your program. v import java.io.*; import java.util.*; public class Pretty { public static final int LINE_SIZE = 50; public static void main(String[] parms) { String inputLine; int position = 1; Scanner fileIn = new Scanner(System.in); while (fileIn.hasNextLine()) { inputLine = fileIn.nextLine(); if (inputLine.equals("")) { if (position > 1) { System.out.println(); } System.out.println(); position = 1; } else...
specifications for Tasks: 1. Write a program which accepts a list of integers which may contain...
specifications for Tasks: 1. Write a program which accepts a list of integers which may contain duplicated integers, and which outputs the input list as a sorted list in ascending order without duplication You can use either Ruby, C, C++, C# or Java to implement your program (referred to as P). 2. Design a test suite of 10 test cases (referred to as TC). Each test case has not more than 20 integers. 3. Test P against TC to make...
L= {x^a y^b z^c | c=a+b(mod 2)} .Create a DFA and NFA for the language L....
L= {x^a y^b z^c | c=a+b(mod 2)} .Create a DFA and NFA for the language L. Solution and explanation please..
In C program. Read and convert a sequence of digits to its equivalent integer. Any leading...
In C program. Read and convert a sequence of digits to its equivalent integer. Any leading white space should be skipped. The conversion should include digit characters until a non-digit character is encountered. Modify the program so it can read and convert a sequence of digit characters preceded by a sign, + or -.
Write a program that uses an array for time and temperature. The program should contain an...
Write a program that uses an array for time and temperature. The program should contain an array with 24 elements, each of which is holding a temperature for a single hour. Your program should have a function that lists all of the temperatures that are held in the array. Temperatures should be listed to console with one entry per line. Your program should have a function that lists a single temperature entry. You should ask the user for a number...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT