Skip to content

Commit 6025017

Browse files
authored
Fix bug with GNFA-to-regex conversion (#123)
1 parent 5987d5d commit 6025017

File tree

3 files changed

+24
-12
lines changed

3 files changed

+24
-12
lines changed

automata/base/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def refine(self, S):
8181
Not a generator because we need to perform the partition
8282
even if the caller doesn't iterate through the results.
8383
"""
84-
hit = defaultdict(lambda: set())
84+
hit = defaultdict(set)
8585
output = []
8686

8787
for x in S:

automata/fa/gnfa.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def to_regex(self):
228228
if r2 is None:
229229
r2 = ''
230230
elif len(r2) == 1:
231-
r2 = f'{r1}*'
231+
r2 = f'{r2}*'
232232
else:
233233
r2 = f'({r2})*'
234234

tests/test_gnfa.py

+22-10
Original file line numberDiff line numberDiff line change
@@ -345,16 +345,28 @@ def test_to_regex(self):
345345
then generate NFA from regex (already tested method)
346346
and check for equivalence of NFA and previous DFA
347347
"""
348-
349-
nfa = NFA.from_regex('a(aaa*bbcd|abbcd)d*|aa*bb(dcc*|(d|c)b|a?bb(dcc*|(d|c)))ab(c|d)*(ccd)?')
350-
gnfa = GNFA.from_nfa(nfa)
351-
regex = gnfa.to_regex()
352-
nfa = NFA.from_regex(regex)
353-
dfa2 = DFA.from_nfa(nfa)
354-
355-
dfa = DFA.from_nfa(nfa)
356-
357-
self.assertEqual(dfa, dfa2)
348+
regex_strings = [
349+
'a*',
350+
'aa*b|bba*|(cc*)(bb+)',
351+
'a(aaa*bbcd|abbcd)d*|aa*bb(dcc*|(d|c)b|a?bb(dcc*|(d|c)))ab(c|d)*(ccd)?'
352+
]
353+
354+
for regex_str in regex_strings:
355+
nfa_1 = NFA.from_regex(regex_str)
356+
gnfa_1 = GNFA.from_nfa(nfa_1)
357+
regex_1 = gnfa_1.to_regex()
358+
nfa_2 = NFA.from_regex(regex_1)
359+
360+
# Test equality under NFA regex conversion
361+
self.assertEqual(nfa_1, nfa_2)
362+
363+
dfa_1 = DFA.from_nfa(nfa_1)
364+
gnfa_2 = GNFA.from_dfa(dfa_1)
365+
regex_2 = gnfa_2.to_regex()
366+
dfa_2 = DFA.from_nfa(NFA.from_regex(regex_2))
367+
368+
# Test equality through DFA regex conversion
369+
self.assertEqual(dfa_1, dfa_2)
358370

359371
def test_read_input_step_not_implemented(self):
360372
"""Should not implement read_input_stepwise() for GNFA."""

0 commit comments

Comments
 (0)