3 #include <machine/FSM/stateAcceptingFiniteStateMachine.h>
4 #include <transition/FSM/maybeEpsilonFiniteStateMachineTransition.h>
23 typename AcceptingConstructorArgs =
typename impl_details_::StateAcceptingMachineArgs<StateType, acceptingStyle>::AcceptingConstructorArgs
45 :
public StateAcceptingFiniteStateMachine<Transition::FSM::MaybeEpsilonFiniteStateMachineTransition<StateType_, SymbolType_>, false, acceptingStyle, std::set, std::set>{
49 using typename StateAcceptingFiniteStateMachine_::StateType;
50 using typename StateAcceptingFiniteStateMachine_::SymbolType;
51 using typename StateAcceptingFiniteStateMachine_::IsAccepting;
52 using typename StateAcceptingFiniteStateMachine_::StorageType;
53 using typename StateAcceptingFiniteStateMachine_::IsAlternating;
54 using typename StateAcceptingFiniteStateMachine_::TransitionType;
55 using typename StateAcceptingFiniteStateMachine_::ApplyHelperType;
56 using typename StateAcceptingFiniteStateMachine_::IsDeterministic;
57 using typename StateAcceptingFiniteStateMachine_::TransitionContainer;
58 using typename StateAcceptingFiniteStateMachine_::InitialStateContainer;
59 using typename StateAcceptingFiniteStateMachine_::OptionalHelpedTransition;
61 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
62 static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
63 static_assert(std::is_same_v<TransitionType, TransitionType_>);
64 static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
65 static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
66 static_assert(std::is_same_v<IsDeterministic, std::false_type>);
67 static_assert(std::is_same_v<TransitionContainer, std::set<std::pair<const TransitionType&, ApplyHelperType>>>);
68 static_assert(std::is_same_v<InitialStateContainer, std::set<StateType>>);
69 static_assert(std::is_same_v<OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
72 "StorageType should be a word.");
73 static_assert(std::is_same_v<TransitionType_, TransitionType>,
74 "TransitionType must be MaybeEpsilonFiniteStateMachineTransition");
76 "The only valid value for AcceptingConstructorArgs is the default parameter.");
87 const std::set<StateType>& initialStates,
88 const std::vector<TransitionType>& transitions,
92 initialStates(initialStates),
93 nonEpsilonTransitions(),
96 for(
const TransitionType& transition: transitions) {
97 if(transition.getPreLetter()) {
98 this->nonEpsilonTransitions[transition.getPreState()][*transition.getPreLetter()].insert(transition);
101 this->epsilonTransitions[transition.getPreState()].insert(transition);
129 return initialStates;
147 return nonEpsilonTransitions.at(state).at(symbol);
164 return epsilonTransitions.at(state);
178 std::set<std::pair<const TransitionType&, ApplyHelperType>> r;
180 for(
const TransitionType& transition : getMatchingNonEpsilonTransitionsWithoutHelper(state, symbol.value())) {
181 r.insert({transition, std::monostate()});
184 catch (std::out_of_range) {
186 catch (std::bad_optional_access) {
189 for(
const TransitionType& transition : getMatchingEpsilonTransitionsWithoutHelper(state)) {
190 r.insert({transition, std::monostate()});
193 catch (std::out_of_range) {
198 #pragma clang diagnostic push
199 #pragma clang diagnostic ignored "-Wunused-parameter"
221 if constexpr (acceptingStyle == AcceptingStyle::NonAccepting) {
222 }
else if constexpr (acceptingStyle == AcceptingStyle::Accepting) {
223 if(StateAcceptingFiniteStateMachine_::isAcceptingState(state) && storage.isEndOfWord()) {
227 std::optional<bool> acceptance = Acceptance::toBool(StateAcceptingFiniteStateMachine_::isAcceptingState(state));
228 if (acceptance && *acceptance && storage.isEndOfWord()) {
232 typename std::map<StateType, std::set<TransitionType>>::const_iterator it = epsilonTransitions.find(state);
233 if (it != epsilonTransitions.end() && !it->second.empty()) {
236 return storage.isEndOfWord();
238 #pragma clang diagnostic pop