Exemplo n.º 1
0
    def test_trivial_case(self):
        grammar = 'rulename = abc "def"\nabc = "abc"'

        rulename = 'rulename'
        edge = Edge('abc', 'abc')
        edge2 = Edge('def', 'def')
        final_edge = Edge('', FINAL_STATE)
        state = State('abc', edge2, is_automata=True)
        state2 = State('def', final_edge)
        start_state = State(START_STATE, edge)
        final_state = State(FINAL_STATE)
        states = [start_state, state, state2, final_state]
        expected = StateMachine(rulename, states)

        rulename = 'abc'
        sub_edge = Edge('abc', 'abc')
        sub_final_edge = Edge('', FINAL_STATE)
        sub_state = State('abc', sub_final_edge)
        sub_start_state = State(START_STATE, sub_edge)
        sub_final_state = State(FINAL_STATE)
        states = [sub_start_state, sub_state, sub_final_state]
        submachine = StateMachine(rulename, states)

        expected.register_automata(submachine)

        actual = choices_parser.parse_from_string(grammar)

        logger.debug(f'Actual: {actual}')
        logger.debug(f'Expected: {expected}')
        assert_state_machines_equal(actual, expected)
Exemplo n.º 2
0
    def test_sub_machines(self):
        machine = StateMachine(id_='a',
                               states=[
                                   State(START_STATE, Edge('', 'b')),
                                   State('b',
                                         Edge('a', FINAL_STATE),
                                         is_automata=True),
                                   State(FINAL_STATE, Edge('', START_STATE))
                               ])
        submachine_b = StateMachine(id_='b',
                                    states=[
                                        State(START_STATE,
                                              Edge('b', FINAL_STATE)),
                                        State(FINAL_STATE,
                                              Edge('', START_STATE))
                                    ])
        machine.register_automata(submachine_b)

        start_record = StateRecord('a', START_STATE, 0, 0)
        nested_start_record = StateRecord('b', START_STATE, 0, 1)
        submachine_record = StateRecord('a', 'b_internal', 0, 1,
                                        [nested_start_record])
        b_record = StateRecord('a', 'b', 1, 2)
        state_records = [start_record, submachine_record, b_record]
        result = (True, state_records, 2)
        self.assertEqual(machine.accepts_partial('ba'), result)
Exemplo n.º 3
0
    def test_double_nested_sub_machines(self):
        machine = StateMachine(id_='c',
                               states=[
                                   State(START_STATE, Edge('', 'b')),
                                   State('b',
                                         Edge('c', FINAL_STATE),
                                         is_automata=True),
                                   State(FINAL_STATE)
                               ])
        submachine_b = StateMachine(id_='b',
                                    states=[
                                        State(START_STATE, Edge('', 'a')),
                                        State('a',
                                              Edge('b', FINAL_STATE),
                                              is_automata=True),
                                        State(FINAL_STATE)
                                    ])
        submachine_a = StateMachine(id_='a',
                                    states=[
                                        State(START_STATE,
                                              Edge('a', FINAL_STATE)),
                                        State(FINAL_STATE)
                                    ])

        submachine_b.register_automata(submachine_a)
        machine.register_automata(submachine_b)

        start_record = StateRecord('c', START_STATE, 0, 0)
        b_start_record = StateRecord('b', START_STATE, 0, 0)
        a_record = StateRecord('a', START_STATE, 0, 1)
        b_machine_record = StateRecord('b', 'a_internal', 0, 1, [a_record])
        b_record = StateRecord('b', 'a', 1, 2)
        c_machine_record = StateRecord(
            'c', 'b_internal', 0, 2,
            [b_start_record, b_machine_record, b_record])
        c_record = StateRecord('c', 'b', 2, 3)
        state_records = [start_record, c_machine_record, c_record]
        result = (True, state_records, 3)
        self.assertEqual(machine.accepts_partial('abc'), result)