CS 3723
  Programming Languages  
  NFAs Runs   


NFAs in Python: First for reference we give the code again for the module nfa.py

nfa.py: code to simulate NFA
# nfa.py: simulate an nfa
import auto
import sys

def is_term(s):  # s set, contains term?
    if not s:
        return False
    else:
        for x in s:
            if auto.is_terminal(x):
                return True
        return False

def eps_cl(s): # s a set, epsilon closure
    # could use s for b, save one list
    t = list(s) # list t is stack or queue
    b = set(t)  # set of "black" states
    while len(t) != 0:
        u = t.pop() # remove end elt
        # use @ for epsilon
        r = auto.lookup(u,auto.eps_symb)
        if r != None:
            for v in r:
                if not (v in  b):
                    b.add(v) # add
                    t.append(v) # push
    return b
    
auto.read_fa("dfa1.auto")
auto.printfa()
sys.stdout.write("\n")
# OK, let's simulate this sucker
f = open("dfa1.input",'r')
instr = f.readline()
ss = auto.get_start_state()
x = []
x.append(auto.get_start_state())
s1 = set(x)
s1 = eps_cl(s1) # start state
sys.stdout.write("Start:\n   " +
       str(list(s1)) + "\n")
i = 0
while instr[i] != '$':
    s2 = set()
    for y in s1:
        s = auto.lookup(y, instr[i])
        if not s:
            s = set()
        else:
            s = set(s)
        s2 = s2 | s  # as sets, union
    # now got set, need epsilon colsure
    s2 = eps_cl(s2)
    sys.stdout.write(instr[i] + ": " +
          str(list(s2)))
    if is_term(s2):
        sys.stdout.write(" term ")
    sys.stdout.write("\n")
    s1 = s2
    i = i + 1 # next instr


Runs with Example NFAs:

First NFA (files: nfa1.auto , nfa1.input)

NFA: States 4, Symbols: abc

0s :(1, [('a', 0), ('b', 0), ('c', 0), ('a', 1), ('b', 2)])
1  :(0, [('c', 2), ('a', 3)])
2  :(0, [('c', 1), ('b', 3)])
3 t:(2, [])
Input: aacacbccbab$

Start: [0]
a: [0, 1]
a: [0, 1, 3] term 
c: [0, 2]
a: [0, 1]
c: [0, 2]
b: [0, 2, 3] term 
c: [0, 1]
c: [0, 2]
b: [0, 2, 3] term 
a: [0, 1]
b: [0, 2]

Second NFA (files: nfa2.auto , nfa2.input)

NFA: States 5, Symbols: abc

0s :(1, [('a', 0), ('b', 0), ('c', 0), ('a', 3), ('b', 1)])
1  :(0, [('b', 2)])
2 t:(2, [('a', 2), ('b', 2), ('c', 4)])
3  :(0, [('a', 4)])
4 t:(2, [('a', 4), ('b', 4)])
Input: ababababbacaa$

Start: [0]
a: [0, 3]
b: [0, 1]
a: [0, 3]
b: [0, 1]
a: [0, 3]
b: [0, 1]
a: [0, 3]
b: [0, 1]
b: [0, 1, 2] term 
a: [0, 2, 3] term 
c: [0, 4] term 
a: [0, 3, 4] term 
a: [0, 3, 4] term 

Third NFA (files: nfa3.auto, nfa2.input)

NFA for (a|b)*a(a|b)(a|b)(a|b)

DFA for (a|b)*a(a|b)(a|b)(a|b)
Note:
Label on arrow from (03) to ((04)) should be "b".
NFA: States 5, Symbols: ab

0s :(1, [('a', 0), ('a', 1), ('b', 0)])
1  :(0, [('a', 2), ('b', 2)])
2  :(0, [('a', 3), ('b', 3)])
3  :(0, [('a', 4), ('b', 4)])
4 t:(2, [])

Input: aaaabaababbabbbb$

Start: [0]
a: [0, 1]
a: [0, 1, 2]
a: [0, 1, 2, 3]
a: [0, 1, 2, 3, 4] term 
b: [0, 2, 3, 4] term 
a: [0, 1, 3, 4] term 
a: [0, 1, 2, 4] term 
b: [0, 2, 3]
a: [0, 1, 3, 4] term 
b: [0, 2, 4] term 
b: [0, 3]
a: [0, 1, 4] term 
b: [0, 2]
b: [0, 3]
b: [0, 4] term 
b: [0]

Note below: Transition from 0 to 1 is not "." (any) but is (a|b|c).

First NFA with ε-moves (files: nfae1.auto, nfae1.input)

NFA for (a|b|c)*(ab|aac)
DFA: States 16, Symbols: abc

0  :(0, [('a', 1), ('b', 1), ('c', 1)])
1  :(0, [('@', 3), ('@', 0)])
2s :(1, [('@', 0), ('@', 3)])
3  :(0, [('@', 14)])
4  :(0, [('a', 5)])
5  :(0, [('@', 6)])
6  :(0, [('b', 7)])
7  :(0, [('@', 15)])
8  :(0, [('a', 9)])
9  :(0, [('@', 10)])
10  :(0, [('a', 11)])
11  :(0, [('@', 12)])
12  :(0, [('c', 13)])
13  :(0, [('@', 15)])
14  :(0, [('@', 4), ('@', 8)])
15 t:(2, [])
Input: cabcaaacabac$

Start: [0, 2, 3, 4, 8, 14]
c: [0, 1, 3, 4, 8, 14]
a: [0, 1, 3, 4, 5, 6, 8, 9, 10, 14]
b: [0, 1, 3, 4, 7, 8, 14, 15] term 
c: [0, 1, 3, 4, 8, 14]
a: [0, 1, 3, 4, 5, 6, 8, 9, 10, 14]
a: [0, 1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14]
a: [0, 1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14]
c: [0, 1, 3, 4, 8, 13, 14, 15] term 
a: [0, 1, 3, 4, 5, 6, 8, 9, 10, 14]
b: [0, 1, 3, 4, 7, 8, 14, 15] term 
a: [0, 1, 3, 4, 5, 6, 8, 9, 10, 14]
c: [0, 1, 3, 4, 8, 14]

(Revision date: 2014-06-17. Please use ISO 8601, the International Standard.)