Esempio n. 1
0
 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])
Esempio n. 2
0
 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))
Esempio n. 3
0
 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)
Esempio n. 4
0
 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))