def test_to_CFG(self): states = [PDAState("q0"), PDAState("q1"), PDAState("q2")] input_symbols = [0, 1] stack_alphabet = [0, 1, "end"] transition_function = [] transition_function.append( PDATransitionFunction(states[0], 0, "end", states[0], [0, "end"])) transition_function.append( PDATransitionFunction(states[0], 1, "end", states[0], [1, "end"])) transition_function.append( PDATransitionFunction(states[0], 0, 0, states[0], [0, 0])) transition_function.append( PDATransitionFunction(states[0], 0, 1, states[0], [0, 1])) transition_function.append( PDATransitionFunction(states[0], 1, 1, states[0], [1, 1])) transition_function.append( PDATransitionFunction(states[0], 1, 0, states[0], [1, 0])) transition_function.append( PDATransitionFunction(states[0], "epsilon", "end", states[1], ["end"])) transition_function.append( PDATransitionFunction(states[0], "epsilon", 0, states[1], [0])) transition_function.append( PDATransitionFunction(states[0], "epsilon", 1, states[1], [1])) transition_function.append( PDATransitionFunction(states[1], 0, 0, states[1], [])) transition_function.append( PDATransitionFunction(states[1], 1, 1, states[1], [])) transition_function.append( PDATransitionFunction(states[1], "epsilon", "end", states[2], [])) start_state = states[0] start_symbol = "end" final_states = [states[2]] pda = PDA(states, input_symbols, stack_alphabet, transition_function, start_state, start_symbol, final_states) cfg = pda.to_CFG() self.assertIsInstance(cfg, CFG) self.assertFalse(cfg.is_empty()) it = iter(cfg) for _ in range(50): temp = next(it) self.assertGreaterEqual(len(temp), 0) self.assertEqual(temp, temp[::-1])
def test_stack_to_end(self): states = [PDAState("q0"), PDAState("q1"), PDAState("q2")] input_symbols = [0, 1] stack_alphabet = [0, 1, "end"] transition_function = [] transition_function.append( PDATransitionFunction(states[0], 0, "end", states[0], [0, "end"])) transition_function.append( PDATransitionFunction(states[0], 1, "end", states[0], [1, "end"])) transition_function.append( PDATransitionFunction(states[0], 0, 0, states[0], [0, 0])) transition_function.append( PDATransitionFunction(states[0], 0, 1, states[0], [0, 1])) transition_function.append( PDATransitionFunction(states[0], 1, 1, states[0], [1, 1])) transition_function.append( PDATransitionFunction(states[0], 1, 0, states[0], [1, 0])) transition_function.append( PDATransitionFunction(states[0], "epsilon", "end", states[1], ["end"])) transition_function.append( PDATransitionFunction(states[0], "epsilon", 0, states[1], [0])) transition_function.append( PDATransitionFunction(states[0], "epsilon", 1, states[1], [1])) transition_function.append( PDATransitionFunction(states[1], 0, 0, states[1], [])) transition_function.append( PDATransitionFunction(states[1], 1, 1, states[1], [])) transition_function.append( PDATransitionFunction(states[1], "epsilon", "end", states[2], [])) start_state = states[0] start_symbol = "end" final_states = [states[2]] pda = PDA(states, input_symbols, stack_alphabet, transition_function, start_state, start_symbol, final_states) pda = pda.from_empty_stack_to_final_state() self.assertIsInstance(pda, PDA) self.assertTrue(pda.accepts_by_final_state([0, 0, 1, 1, 0, 0], 100)) self.assertTrue(pda.accepts_by_final_state([0, 1, 1, 0], 100)) self.assertTrue(pda.accepts_by_final_state([1, 1], 100)) self.assertTrue(pda.accepts_by_final_state([], 100)) self.assertFalse(pda.accepts_by_final_state([0, 1, 0, 0], 1000)) self.assertFalse(pda.accepts_by_final_state([0, 0, 1, 0], 1000))
def from_empty_stack_to_final_state(self): states = self.states[:] start_state = PDAState("p_start_e_to_f") final_states = [PDAState("p_final_e_to_f")] states.append(start_state) states.append(final_states[0]) stack_alphabet = self.stack_alphabet[:] input_symbols = self.input_symbols[:] start_symbol = Terminal("X_start_end_e_to_f") stack_alphabet.append(start_symbol) transition_function = self.transition_function[:] transition_function.append( PDATransitionFunction(start_state, "epsilon", start_symbol, self.start_state, [self.start_symbol, start_symbol])) for q in self.states: transition_function.append( PDATransitionFunction(q, "epsilon", start_symbol, final_states[0], [])) return PDA(states, input_symbols, stack_alphabet, transition_function, start_state, start_symbol, final_states)
def test_to_pda(self): cfg = CFG([Variable("E"), Variable("I")], [ Terminal("a"), Terminal("b"), Terminal("0"), Terminal("1"), Terminal("+"), Terminal("*"), Terminal("("), Terminal(")") ], [ CFGRule(Variable("I"), [Terminal("a")]), CFGRule(Variable("I"), [Terminal("b")]), CFGRule(Variable("I"), [Variable("I"), Terminal("a")]), CFGRule(Variable("I"), [Variable("I"), Terminal("b")]), CFGRule(Variable("I"), [Variable("I"), Terminal("0")]), CFGRule(Variable("I"), [Variable("I"), Terminal("1")]), CFGRule(Variable("E"), [Variable("I")]), CFGRule( Variable("E"), [Variable("E"), Terminal("*"), Variable("E")]), CFGRule( Variable("E"), [Variable("E"), Terminal("+"), Variable("E")]), CFGRule( Variable("E"), [Terminal("("), Variable("E"), Terminal(")")]) ], Variable("E")) pda = cfg.to_PDA() self.assertIsInstance(pda, PDA) self.assertIn( PDATransitionFunction(PDAState("q"), "epsilon", Variable("I"), PDAState("q"), [Terminal("a")]), pda.transition_function) self.assertIn( PDATransitionFunction(PDAState("q"), "epsilon", Variable("I"), PDAState("q"), [Variable("I"), Terminal("0")]), pda.transition_function) self.assertIn( PDATransitionFunction(PDAState("q"), "epsilon", Variable("E"), PDAState("q"), [Variable("I")]), pda.transition_function) self.assertEqual(18, len(pda.transition_function)) self.assertTrue(pda.accepts_by_empty_stack([Terminal("a")], 100)) self.assertTrue(pda.accepts_by_empty_stack([Terminal("b")], 100)) self.assertFalse( pda.accepts_by_empty_stack([Terminal(x) for x in "b0"], 100)) self.assertTrue( pda.accepts_by_empty_stack([Terminal(x) for x in "b0"], 1000)) self.assertTrue( pda.accepts_by_empty_stack([Terminal(x) for x in "b00"], 10000))