This subroutine takes a nfa_state_set_t
type argument as input and register
the set as a DFA state node in the DFA graph.
Note
The processing here should reflect the semantic change of dfa_top
.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(automaton_t), | intent(inout) | :: | self | |||
type(nfa_state_set_t), | intent(in) | :: | state_set | |||
integer(kind=int32), | intent(inout) | :: | res |
pure subroutine automaton__register_state(self, state_set, res) implicit none class(automaton_t), intent(inout) :: self type(nfa_state_set_t), intent(in) :: state_set integer(int32), intent(inout) :: res ! resulting the new dfa index integer(int32) :: i ! If the set is already registered, returns the index of the corresponding DFA state. i = self%dfa%registered(state_set) if ( i /= DFA_INVALID_INDEX) then res = i return end if ! Execute an error stop statement if the counter exceeds a limit. if (self%dfa%dfa_top >= self%dfa%dfa_limit) then ! Reallocate call self%dfa%reallocate() end if !> @note The processing here should reflect the semantic change of `dfa_top`. i = self%dfa%dfa_top self%dfa%dfa_top = i + 1 ! increment dfa_top self%dfa%nodes(i)%nfa_set = state_set self%dfa%nodes(i)%accepted = check_nfa_state(state_set, self%nfa_exit) self%dfa%nodes(i)%registered = .true. call self%dfa%nodes(i)%increment_tra_top() ! Somehow this is necessary! res = i end subroutine automaton__register_state