def test_intersection_with_epsilon(self): state0 = State(0) state1 = State(1) symb_a = Symbol("a") dfa = DeterministicFiniteAutomaton({state0, state1}, {symb_a}, start_state=state0, final_states={state1}) dfa.add_transition(state0, symb_a, state1) self.assertTrue(dfa.accepts([symb_a])) ter_a = Terminal("a") var_s = Variable("S") var_l = Variable("L") var_t = Variable("T") productions = { Production(var_s, [var_l, var_t]), Production(var_l, [Epsilon()]), Production(var_t, [ter_a]) } cfg = CFG(productions=productions, start_symbol=var_s) self.assertFalse(cfg.is_empty()) self.assertTrue(cfg.contains([ter_a])) cfg_temp = cfg.to_pda().to_cfg() self.assertFalse(cfg_temp.is_empty()) self.assertTrue(cfg_temp.contains([ter_a])) cfg_temp = cfg.to_pda().to_final_state().to_empty_stack().to_cfg() self.assertFalse(cfg_temp.is_empty()) self.assertTrue(cfg_temp.contains([ter_a])) cfg_i = cfg.intersection(dfa) self.assertFalse(cfg_i.is_empty())
def _test_profiling_conversions(): """ Tests multiple conversions """ ter_a = Terminal("a") ter_b = Terminal("b") ter_c = Terminal("c") var_s = Variable("S") productions = { Production(var_s, [ter_a, var_s, ter_b]), Production(var_s, [ter_c]) } cfg = CFG(productions=productions, start_symbol=var_s) cfg = cfg.to_pda().to_final_state().to_empty_stack().to_cfg() cfg = cfg.to_pda().to_final_state().to_empty_stack().to_cfg() cfg.to_pda().to_final_state().to_empty_stack().to_cfg()
def test_to_pda(self): """ Tests the conversion to PDA """ var_e = Variable("E") var_i = Variable("I") ter_a = Terminal("a") ter_b = Terminal("b") ter_0 = Terminal("0") ter_1 = Terminal("1") ter_par_open = Terminal("(") ter_par_close = Terminal(")") ter_mult = Terminal("*") ter_plus = Terminal("+") productions = { Production(var_e, [var_i]), Production(var_e, [var_e, ter_plus, var_e]), Production(var_e, [var_e, ter_mult, var_e]), Production(var_e, [ter_par_open, var_e, ter_par_close]), Production(var_i, [ter_a]), Production(var_i, [ter_b]), Production(var_i, [var_i, ter_a]), Production(var_i, [var_i, ter_b]), Production(var_i, [var_i, ter_0]), Production(var_i, [var_i, ter_1]), Production(var_i, [var_i, Epsilon()]) } cfg = CFG({var_e, var_i}, { ter_a, ter_b, ter_0, ter_1, ter_par_open, ter_par_close, ter_mult, ter_plus }, var_e, productions) pda = cfg.to_pda() self.assertEqual(len(pda.states), 1) self.assertEqual(len(pda.final_states), 0) self.assertEqual(len(pda.input_symbols), 8) self.assertEqual(len(pda.stack_symbols), 10) self.assertEqual(pda.get_number_transitions(), 19)
def test_conversions(self): """ Tests multiple conversions """ ter_a = Terminal("a") ter_b = Terminal("b") ter_c = Terminal("c") var_s = Variable("S") productions = { Production(var_s, [ter_a, var_s, ter_b]), Production(var_s, [ter_c]) } cfg = CFG(productions=productions, start_symbol=var_s) cfg = cfg.to_pda().to_final_state().to_empty_stack().to_cfg() self.assertTrue(cfg.contains([ter_c])) self.assertTrue(cfg.contains([ter_a, ter_c, ter_b])) self.assertTrue(cfg.contains([ter_a, ter_a, ter_c, ter_b, ter_b])) self.assertFalse(cfg.contains([ter_b, ter_c, ter_a])) self.assertFalse(cfg.contains([ter_b, ter_b, ter_c, ter_a, ter_a]))