-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_thompson.py
87 lines (61 loc) · 1.93 KB
/
test_thompson.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import unittest
from reparser import REParser
from thompson import Thompson
class TestThompson(unittest.TestCase):
def setUp(self):
self.parser = REParser(Thompson())
def test_Empty(self):
nfa = self.parser.parse('')
self.assert_(set(nfa.states[nfa.initial]['']) &set(nfa.finals))
def test_a(self):
nfa = self.parser.parse('a')
self.assert_(set(nfa.states[nfa.initial]['a']) & set(nfa.finals))
def test_a_cat_b(self):
nfa = self.parser.parse('ab')
before_b = nfa.states[nfa.initial]['a']
self.assert_(before_b)
self.assertEqual(len(before_b), 1)
b = before_b[0]
print nfa.finals
self.assert_(set(nfa.states[b]['b']) & set(nfa.finals))
def test_a_or_b(self):
nfa = self.parser.parse('a|b')
for s in nfa.states[nfa.initial]['']:
if 'a' in nfa.states[s]:
an = nfa.states[s]['a']
if 'b' in nfa.states[s]:
bn = nfa.states[s]['b']
ax = set()
print nfa.states
for x in an:
print nfa.states[x]
ax |= set(nfa.states[x][''])
bx = set()
for x in bn:
bx |= set(nfa.states[x][''])
self.assert_(set(ax) & set(nfa.finals))
self.assert_(set(bx) & set(nfa.finals))
def test_a_zom(self):
nfa = self.parser.parse('a*')
self.assert_(set(nfa.states[nfa.initial]['']) & set(nfa.finals))
for s in nfa.states[nfa.initial]['']:
if s not in nfa.finals:
break
Nsi = s
xs = nfa.states[Nsi]['a']
self.assertEqual(len(xs), 1)
Nsf = xs[0]
for s in nfa.states[Nsf]['']:
self.assert_(s in nfa.finals or Nsi == s)
def test_LP_a_or_b_RP_c(self):
nfa = self.parser.parse('(a|b)c')
print 'b -> '
self.assertFalse(nfa.feed('b'))
print 'bc -> '
self.assert_(nfa.feed('bc'))
def test_LP_a_or_b_RP_c_2(self):
nfa = self.parser.parse('(a|b)c')
print 'a -> '
self.assertFalse(nfa.feed('a'))
print 'ac -> '
self.assert_(nfa.feed('ac'))