3 #include <machine/machine.h>
4 #include <transition/PDM/pushdownMachineTransition.h>
26 typename TransitionType_,
29 template <
typename...>
class TransitionContainer_ = std::vector,
30 template <
typename...>
class InitialStateContainer_ = std::vector
48 typename TransitionType_,
50 template <
typename...>
class TransitionContainer_,
51 template <
typename...>
class InitialStateContainer_
53 class PushdownMachine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
54 public Machine<TransitionType_, true, acceptingStyle, TransitionContainer_, InitialStateContainer_>{
58 using typename Machine_::IsAccepting;
60 using typename Machine_::IsAlternating;
71 typedef typename TransitionType::WordType
WordType;
76 typedef typename TransitionType::StackType
StackType;
88 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
89 static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
90 static_assert(std::is_same_v<TransitionType, TransitionType_>);
91 static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
92 static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
93 static_assert(std::is_same_v<IsDeterministic, std::true_type>);
94 static_assert(std::is_same_v<
TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
96 static_assert(std::is_same_v<
OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
99 "StorageType should be a word and a stack.");
101 "TransitionType must be a derived class of PushdownMachineTransition");
135 return this->getMatchingTransitionFromCurrentLetter(state, std::get<WordType>(storage).front_opt(), std::get<StackType>(storage));
169 typename TransitionType_,
171 template <
typename...>
class TransitionContainer_,
172 template <
typename...>
class InitialStateContainer_
174 class PushdownMachine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> :
175 public Machine<TransitionType_, false, acceptingStyle, TransitionContainer_, InitialStateContainer_> {
179 using typename Machine_::IsAccepting;
181 using typename Machine_::IsAlternating;
192 typedef typename TransitionType::WordType
WordType;
209 static_assert(std::is_same_v<StateType, typename TransitionType::StateType>);
210 static_assert(std::is_same_v<StorageType, typename TransitionType::StorageType>);
211 static_assert(std::is_same_v<TransitionType, TransitionType_>);
212 static_assert(std::is_same_v<ApplyHelperType, typename TransitionType::ApplyHelperType>);
213 static_assert(std::is_same_v<ApplyHelperType, std::monostate>);
214 static_assert(std::is_same_v<IsDeterministic, std::false_type>);
215 static_assert(std::is_same_v<
TransitionContainer, TransitionContainer_<std::pair<const TransitionType&, ApplyHelperType>>>);
217 static_assert(std::is_same_v<
OptionalHelpedTransition, std::optional<std::pair<const TransitionType&, ApplyHelperType>>>);
220 "StorageType should be a word and a stack.");
222 "TransitionType must be a derived class of PushdownMachineTransition");
255 return this->getMatchingTransitionsFromCurrentLetter(state, std::get<WordType>(storage).front_opt(), std::get<StackType>(storage));