CS 3723
 Programming Languages 
Simulating DFAs:
(a|b)*abb


DFA for (a|b)abb

The programs below (two in C and one in Java) recognize the language described by the regular expression (a|b)abb.

Java Program C Program, no gotos C Program, with gotos
// Abb0.java: recognize (a|b)*abb
import java.io.*;
public class Abb0 {
  public static void main(String[]
       args){
    GetChar getChar = new GetChar();
    char ch;
    int state = 0;
  
    while (true) {
      ch = getChar.getNextChar();
      if (ch == '$') break; // while
      switch (state) {
      case 0: if (ch == 'a') state = 1;
         else if (ch == 'b') state = 0;
         break;
      case 1: if (ch == 'a') state = 1;
         else if (ch == 'b') state = 2;
         break;
      case 2: if (ch == 'a') state = 1;
         else if (ch == 'b') state = 3;
         break;
      case 3: if (ch == 'a') state = 1;
         else if (ch == 'b') state = 0;
         break;
      }
      System.out.print("ch: " + ch + ",
         next state: " + state);
      if (state == 3)
         System.out.print(" Terminal");
      System.out.print("\n");
    }
    if (state == 3)
      System.out.print("Accept\n");
    else System.out.print("Reject\n");
  }
}
// Version without everything in main
// abb.c: recognize (a|b)*abb
#include <stdio.h>

int main() {

  char ch;
  int state = 0;


  while (1) {
    ch = getchar();
    if (ch == '$') break; // while
    switch (state) {
    case 0: if (ch == 'a') state = 1;
       else if (ch == 'b') state = 0;
       break;
    case 1: if (ch == 'a') state = 1;
       else if (ch == 'b') state = 2;
       break;
    case 2: if (ch == 'a') state = 1;
       else if (ch == 'b') state = 3;
       break;
    case 3: if (ch == 'a') state = 1;
       else if (ch == 'b') state = 0;
       break;
    }
    printf("ch: %c, next state: %i",
       ch, state);
    if (state == 3)
       printf(" Terminal");
    printf("\n");
  }
  if (state == 3) printf("Accept\n");
  else printf("Reject\n");
}
// abb1.c: recognize (a|b)*abb
#include <stdio.h>
void printit(int state, char ch);
int main() {
   char ch;
   L0: ch = getchar();
     printit(0, ch);
     if (ch == '$') goto L4;
     if (ch == 'a') goto L1;
     else if (ch == 'b') goto L0;
   L1: ch = getchar();
     printit(1, ch);
     if (ch == '$') goto L4;
     if (ch == 'a') goto L1;
     else if (ch == 'b') goto L2;
   L2: ch = getchar();
     printit(2, ch);
     if (ch == '$') goto L4;
     if (ch == 'a') goto L1;
     else if (ch == 'b') goto L3;
   L3: ch = getchar();
     printit(3, ch);
     if (ch == '$') goto L5;
     if (ch == 'a') goto L1;
     else if (ch == 'b') goto L0;
   L4: printf("Reject\n");
     return;
   L5: printf("Accept\n");
}

void printit(int state,char ch){
   printf("In state: %i,
      char=%c", state, ch);
   if (state == 3)
      printf(" Terminal");
   printf("\n");
}
Java Input Class Output of Java and
1st C (no gotos)
Output of 2st C
(with gotos)
// GetChar: fetch next char 
import java.io.*;
public class GetChar { 
   private Reader in; // input
  
   // GetChar: constructor  
   public GetChar () { 
      in = new
         InputStreamReader(System.in);
   }

   // getNextChar: next char
   public char getNextChar() {
      char ch = ' ';
      try {
         ch = (char)in.read();
      } catch (IOException e) {
         System.out.println("Excpt");
      }
      return ch;
   }
}
% cc -o abb -Wall abb.c
% ./abb
abaababb$
ch: a, next state: 1
ch: b, next state: 2
ch: a, next state: 1
ch: a, next state: 1
ch: b, next state: 2
ch: a, next state: 1
ch: b, next state: 2
ch: b, next state: 3 Terminal
Accept

% ./abb abaababbab$ ch: a, next state: 1 ch: b, next state: 2 ch: a, next state: 1 ch: a, next state: 1 ch: b, next state: 2 ch: a, next state: 1 ch: b, next state: 2 ch: b, next state: 3 Terminal ch: a, next state: 1 ch: b, next state: 2 Reject
% ./abb1
abaababb$
In state: 0, char =  a
In state: 1, char =  b
In state: 2, char =  a
In state: 1, char =  a
In state: 1, char =  b
In state: 2, char =  a
In state: 1, char =  b
In state: 2, char =  b
In state: 3, char =  $ Terminal
Accept

./abb1 abaababbab$ In state: 0, char = In state: 1, char = In state: 2, char = a In state: 1, char = b In state: 2, char = a In state: 1, char = a In state: 1, char = b In state: 2, char = a In state: 1, char = b In state: 2, char = b In state: 3, char = a Terminal In state: 1, char = b In state: 2, char = $ Reject

[See Computer Simulation of the DFA for the abb example. This includes a simulation of the DFA as if it were an NFA.]


Revision date: 2014-03-17. (Please use ISO 8601, the International Standard Date and Time Notation.)