Skip to content

Instantly share code, notes, and snippets.

@LucianoPAlmeida
Created July 31, 2023 11:38
Show Gist options
  • Save LucianoPAlmeida/6c66c9aaf04eecad08c8e039f6f9622c to your computer and use it in GitHub Desktop.
Save LucianoPAlmeida/6c66c9aaf04eecad08c8e039f6f9622c to your computer and use it in GitHub Desktop.
#include "FSM.h"
// A finite state machine that contains either ..abc..
static std::unique_ptr<Machine> makeContainsAbc() {
Machine::state_set finalStates = {4};
Machine::state_set q = {1, 2, 3, 4};
auto machine = std::make_unique<Machine>(q, /*startState=*/1, finalStates);
machine->addTransition(1, 'a', 2);
machine->addTransition(1, 'b', 1);
machine->addTransition(1, 'c', 1);
machine->addTransition(2, 'a', 2);
machine->addTransition(2, 'b', 3);
machine->addTransition(2, 'c', 1);
machine->addTransition(3, 'a', 2);
machine->addTransition(3, 'b', 1);
machine->addTransition(3, 'c', 4);
machine->addTransition(4, 'a', 4);
machine->addTransition(4, 'b', 4);
machine->addTransition(4, 'c', 4);
return machine;
}
template <class StateMachine>
inline void assertAccepted(const StateMachine &M, std::string_view str) {
auto result = M.accept(str);
std::cout << std::boolalpha << str << ": " << result << std::endl;
assert(result);
}
template <class StateMachine>
inline void assertNotAccepted(const StateMachine &M, std::string_view str) {
auto result = M.accept(str);
std::cout << std::boolalpha << str << ": " << result << std::endl;
assert(!result);
}
int main(int argc, const char * argv[]) {
std::cout << "Contains abc" << std::endl;
auto M = makeContainsAbc();
assertNotAccepted(*M, "aabac");
assertAccepted(*M, "aacbabca");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment