-
Notifications
You must be signed in to change notification settings - Fork 0
/
thompson.py
72 lines (53 loc) · 1.24 KB
/
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
from retoken import *
from nfa import NFA
from emit import Emitter
class Thompson(Emitter):
def __init__(self):
self._result = []
def reset(self):
self._result = []
def result(self):
if len(self._result) == 1:
return self._result[0]
elif len(self._result) == 0:
return NFA.build_empty()
else:
print 'got multiple nfas?!'
for n in self._result:
print n, n.states
assert False
def push(self, x):
self._result.append(x)
def pop(self):
return self._result.pop()
def alpha(self, t):
nfa = NFA.build_a(t.raw) #ugh! t.value?
self.push(nfa)
def Or(self, t):
b = self.pop()
a = self.pop()
ab = NFA.build_or(a, b)
self.push(ab)
def Cat(self, t):
b = self.pop()
a = self.pop()
ab = NFA.build_cat(a, b)
self.push(ab)
def ZOM(self, Ns):
a = self.pop()
azom = NFA.build_zom(a)
self.push(azom)
def LP(self, t):
pass
def RP(self, t):
pass
if __name__ == "__main__":
from reparser import REParser
parser = REParser(Thompson())
nfa = parser.parse('(a|b)*abb')
print nfa.states
print 'abb ==>', nfa.feed('abb')
print '--'
print 'babb ==>', nfa.feed('babb')
print '--'
print 'bbabb ==>', nfa.feed('bbabb')