def test_intersection_regex(self): """ Tests the intersection with a regex """ # pylint: disable=too-many-locals state_p = State("p") state_q = State("q") state_r = State("r") state_i = Symbol("i") state_e = Symbol("e") state_z = StackSymbol("Z") state_x0 = StackSymbol("X0") pda = PDA(states={state_p, state_q, state_r}, input_symbols={state_i, state_e}, stack_alphabet={state_z, state_x0}, start_state=state_p, start_stack_symbol=state_x0, final_states={state_r}) pda.add_transition(state_p, Epsilon(), state_x0, state_q, [state_z, state_x0]) pda.add_transition(state_q, state_i, state_z, state_q, [state_z, state_z]) pda.add_transition(state_q, state_e, state_z, state_q, []) pda.add_transition(state_q, Epsilon(), state_x0, state_r, []) state_s = finite_automaton.State("s") state_t = finite_automaton.State("t") i_dfa = finite_automaton.Symbol("i") e_dfa = finite_automaton.Symbol("e") dfa = finite_automaton.DeterministicFiniteAutomaton( states={state_s, state_t}, input_symbols={i_dfa, e_dfa}, start_state=state_s, final_states={state_s, state_t}) dfa.add_transition(state_s, i_dfa, state_s) dfa.add_transition(state_s, e_dfa, state_t) dfa.add_transition(state_t, e_dfa, state_t) new_pda = pda.intersection(dfa) pda_es = new_pda.to_empty_stack() cfg = pda_es.to_cfg() self.assertEqual(new_pda.get_number_transitions(), 6) self.assertEqual(len(new_pda.states), 5) self.assertEqual(len(new_pda.final_states), 2) self.assertEqual(len(new_pda.input_symbols), 2) self.assertEqual(len(new_pda.stack_symbols), 2) i_cfg = Terminal("i") e_cfg = Terminal("e") self.assertTrue(cfg.contains([i_cfg, i_cfg, e_cfg, e_cfg, e_cfg])) new_pda = pda.intersection( finite_automaton.DeterministicFiniteAutomaton()) self.assertEqual(new_pda.get_number_transitions(), 0)
def _get_next_state_enfa(self): s_final = finite_automaton.State(self._counter) self._counter += 1 return s_final