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))