Exemplo n.º 1
0
 def _get_next_configuration(self, old_config):
     """Advance to the next configuration."""
     transitions = set()
     if old_config.remaining_input:
         transitions.add(
             self._get_transition(old_config.state,
                                  old_config.remaining_input[0],
                                  old_config.stack.top()))
     transitions.add(
         self._get_transition(old_config.state, '', old_config.stack.top()))
     if None in transitions:
         transitions.remove(None)
     if len(transitions) == 0:
         raise exceptions.RejectionException(
             'The automaton entered a configuration for which no '
             'transition is defined ({}, {}, {})'.format(
                 old_config.state, old_config.remaining_input[0],
                 old_config.stack.top()))
     if len(transitions) > 1:
         raise pda_exceptions.NondeterminismError(
             'The automaton entered a configuration for which more'
             'than one transition is defined ({}, {}'.format(
                 old_config.state, old_config.stack.top()))
     input_symbol, new_state, new_stack_top = transitions.pop()
     remaining_input = old_config.remaining_input
     if input_symbol:
         remaining_input = remaining_input[1:]
     new_config = PDAConfiguration(
         new_state, remaining_input,
         self._replace_stack_top(old_config.stack, new_stack_top))
     return new_config
Exemplo n.º 2
0
 def _validate_transition_lambda_transition_sibling(self, start_state,
                                                    sib_path):
     """Check the given sibling path for adjacent lambda transitions."""
     for other_stack_symbol in sib_path:
         if (other_stack_symbol in self.transitions[start_state]['ε']):
             raise pda_exceptions.NondeterminismError(
                 'A symbol transition is adjacent to a '
                 'lambda transition for this DPDA.')