def test_run_invalid_std(self): nfa = NfaRegex('(a|b)*abb') nfa.build() dfa = DfaNfa(nfa.nfa) dfa.build() dfa.minimize() result = dfa.run('ababaab') self.assertEqual(result, False)
def test_build_basic(self): nfa = NfaRegex('a') sm = nfa._build_basic_sm('a') self.assertEqual(sm.states, [0, 1]) self.assertEqual(sm.init_state, 0) self.assertEqual(sm.finish_states, [1]) self.assertEqual(sm.catch_state, 1) self.assertEqual(sm.language, ['a']) self.assertEqual(sm.transitions, [[0, 1, 'a']])
def check_chain(regex, chain): nfa = NfaRegex(regex) nfa.build() nfa.nfa.draw() dfa = DfaNfa(nfa.nfa) dfa.build() dfa.dfa.draw() dfa.minimize() dfa.run(chain)
def test_build_and(self): nfa = NfaRegex('a&b') sm1 = nfa._build_basic_sm('a') sm2 = nfa._build_basic_sm('b') sm = nfa._build_and_sm(sm1, sm2) self.assertEqual(sm.states, [0, 1, 2]) self.assertEqual(sm.init_state, 0) self.assertEqual(sm.finish_states, [2]) self.assertEqual(sm.catch_state, 2) self.assertEqual(sm.language, ['a', 'b']) self.assertEqual(sm.transitions, [[0, 1, 'a'], [1, 2, 'b']])
def test_build_one_or_more(self): nfa = NfaRegex('a?') sm1 = nfa._build_basic_sm('a') sm = nfa._build_one_or_more_sm(sm1) self.assertEqual(sm.states, [0, 1, 2, 4, 3]) self.assertEqual(sm.init_state, 0) self.assertEqual(sm.finish_states, [4]) self.assertEqual(sm.catch_state, 4) self.assertEqual(sm.language, ['a']) self.assertEqual(sm.transitions, [[0, 1, 'a'], [1, 2, 'ε'], [1, 4, 'ε'], [2, 3, 'a'], [3, 2, 'ε'], [3, 4, 'ε']])
def test_build_correct_std(self): nfa = NfaRegex('(a|b)*abb') nfa.build() dfa = DfaNfa(nfa.nfa) dfa.build() self.assertEqual(dfa.dfa.states, [0, 1, 2, 4, 5]) self.assertEqual(dfa.dfa.init_state, 0) self.assertEqual(dfa.dfa.finish_states, [5]) self.assertEqual(dfa.dfa.language, ['a', 'b']) self.assertEqual( dfa.dfa.transitions, [[0, 1, 'a'], [0, 2, 'b'], [2, 1, 'a'], [2, 2, 'b'], [1, 1, 'a'], [1, 4, 'b'], [4, 1, 'a'], [4, 5, 'b'], [5, 1, 'a'], [5, 2, 'b']])
def test_minimize_correct(self): nfa = NfaRegex('a?b?(abc)*') nfa.build() dfa = DfaNfa(nfa.nfa) dfa.build() dfa.minimize() self.assertEqual(dfa.dfa.states, [0, 1, 2, 3, 4, 5]) self.assertEqual(dfa.dfa.init_state, 0) self.assertEqual(dfa.dfa.finish_states, [2, 5]) self.assertEqual(dfa.dfa.language, ['a', 'b', 'c']) self.assertEqual(dfa.dfa.transitions, [[0, 1, 'a'], [1, 1, 'a'], [1, 2, 'b'], [2, 2, 'b'], [2, 3, 'a'], [3, 4, 'b'], [4, 5, 'c'], [5, 3, 'a']])
def test_minimize_correct_std(self): nfa = NfaRegex('(a|b)*abb') nfa.build() dfa = DfaNfa(nfa.nfa) dfa.build() dfa.minimize() self.assertEqual(dfa.dfa.states, [0, 1, 2, 3]) self.assertEqual(dfa.dfa.init_state, 0) self.assertEqual(dfa.dfa.finish_states, [3]) self.assertEqual(dfa.dfa.language, ['a', 'b']) self.assertEqual(dfa.dfa.transitions, [[0, 0, 'b'], [0, 1, 'a'], [1, 1, 'a'], [1, 2, 'b'], [2, 1, 'a'], [2, 3, 'b'], [3, 0, 'b'], [3, 1, 'a']])
def test_build_or(self): nfa = NfaRegex('a|b') sm1 = nfa._build_basic_sm('a') sm2 = nfa._build_basic_sm('b') sm = nfa._build_or_sm(sm1, sm2) self.assertEqual(sm.states, [0, 1, 2, 3, 4, 5]) self.assertEqual(sm.init_state, 0) self.assertEqual(sm.finish_states, [5]) self.assertEqual(sm.catch_state, 5) self.assertEqual(sm.language, ['a', 'b']) self.assertEqual(sm.transitions, [[0, 1, 'ε'], [0, 3, 'ε'], [1, 2, 'a'], [3, 4, 'b'], [2, 5, 'ε'], [4, 5, 'ε']])