def test_to_regex3(self): """ Tests the transformation to regex """ enfa = EpsilonNFA() state0 = State(0) state1 = State(1) symb_a = Symbol("0") symb_b = Symbol("1") enfa.add_start_state(state0) enfa.add_final_state(state1) enfa.add_transition(state0, symb_a, state0) enfa.add_transition(state1, symb_b, state0) enfa.add_transition(state1, symb_b, state1) regex = enfa.to_regex() enfa2 = regex.to_epsilon_nfa() self.assertFalse(enfa2.accepts([symb_a])) self.assertFalse(enfa2.accepts([symb_a, symb_a])) self.assertFalse(enfa2.accepts([symb_a, symb_a, symb_b])) self.assertFalse( enfa2.accepts([symb_a, symb_a, symb_b, symb_b, symb_a])) self.assertFalse( enfa2.accepts([symb_a, symb_a, symb_b, symb_b, symb_a, symb_b])) self.assertFalse(enfa2.accepts([symb_b])) epsilon = Epsilon() enfa.add_transition(state0, epsilon, state1) regex = enfa.to_regex() enfa2 = regex.to_epsilon_nfa() self.assertTrue(enfa.accepts([])) self.assertTrue(enfa.accepts([symb_a])) self.assertTrue(enfa2.accepts([symb_a])) self.assertTrue(enfa2.accepts([symb_a, symb_a])) self.assertTrue(enfa2.accepts([symb_a, symb_a, symb_b, symb_b])) self.assertTrue( enfa2.accepts([symb_a, symb_a, symb_b, symb_b, symb_a, symb_b])) self.assertTrue(enfa2.accepts([symb_b])) self.assertTrue(enfa2.accepts([])) enfa.remove_transition(state0, symb_a, state0) regex = enfa.to_regex() enfa2 = regex.to_epsilon_nfa() self.assertFalse(enfa2.accepts([symb_a])) self.assertFalse(enfa2.accepts([symb_a, symb_a])) self.assertFalse(enfa2.accepts([symb_a, symb_a, symb_b])) self.assertFalse( enfa2.accepts([symb_a, symb_a, symb_b, symb_b, symb_a])) self.assertFalse( enfa2.accepts([symb_a, symb_a, symb_b, symb_b, symb_a, symb_b])) self.assertTrue(enfa2.accepts([symb_b])) self.assertTrue(enfa2.accepts([])) enfa.remove_transition(state1, symb_b, state1) regex = enfa.to_regex() enfa2 = regex.to_epsilon_nfa() self.assertTrue(enfa2.accepts([symb_b, symb_b])) enfa.add_transition(state0, symb_a, state0) regex = enfa.to_regex() enfa2 = regex.to_epsilon_nfa() self.assertTrue(enfa2.accepts([symb_a, symb_b]))
def test_to_regex(self): """ Tests the transformation to regex """ enfa = EpsilonNFA() state0 = State(0) state1 = State(1) state2 = State(2) symb_e = Symbol("e") symb_f = Symbol("f") symb_g = Symbol("g") enfa.add_start_state(state0) enfa.add_final_state(state2) enfa.add_transition(state0, symb_e, state1) enfa.add_transition(state1, symb_f, state2) enfa.add_transition(state0, symb_g, state2) regex = enfa.to_regex() enfa2 = regex.to_epsilon_nfa() self.assertTrue(enfa2.accepts([symb_e, symb_f])) self.assertTrue(enfa2.accepts([symb_g])) self.assertFalse(enfa2.accepts([])) self.assertFalse(enfa2.accepts([symb_e])) self.assertFalse(enfa2.accepts([symb_f])) enfa.add_final_state(state0) with self.assertRaises(ValueError) as _: enfa.get_regex_simple() regex = enfa.to_regex() enfa3 = regex.to_epsilon_nfa() self.assertTrue(enfa3.accepts([symb_e, symb_f])) self.assertTrue(enfa3.accepts([symb_g])) self.assertTrue(enfa3.accepts([])) self.assertFalse(enfa3.accepts([symb_e])) self.assertFalse(enfa3.accepts([symb_f])) enfa.remove_start_state(state0) regex = enfa.to_regex() enfa3 = regex.to_epsilon_nfa() self.assertFalse(enfa3.accepts([symb_e, symb_f])) self.assertFalse(enfa3.accepts([symb_g])) self.assertFalse(enfa3.accepts([])) self.assertFalse(enfa3.accepts([symb_e])) self.assertFalse(enfa3.accepts([symb_f])) enfa.add_start_state(state0) enfa.add_transition(state0, symb_f, state0) regex = enfa.to_regex() enfa3 = regex.to_epsilon_nfa() self.assertTrue(enfa3.accepts([symb_e, symb_f])) self.assertTrue(enfa3.accepts([symb_f, symb_e, symb_f])) self.assertTrue(enfa3.accepts([symb_g])) self.assertTrue(enfa3.accepts([symb_f, symb_f, symb_g])) self.assertTrue(enfa3.accepts([])) self.assertFalse(enfa3.accepts([symb_e])) self.assertTrue(enfa3.accepts([symb_f]))
def test_example_doc(self): enfa = EpsilonNFA() state0 = State(0) state1 = State(1) symb_a = Symbol("0") symb_b = Symbol("1") enfa.add_start_state(state0) enfa.add_final_state(state1) enfa.add_transition(state0, symb_a, state0) enfa.add_transition(state1, symb_b, state0) enfa.add_transition(state1, symb_b, state1) # Turn a finite automaton into a regex... regex = enfa.to_regex() # And turn it back into an epsilon non deterministic automaton enfa2 = regex.to_epsilon_nfa()