diff --git a/reading_machine/include/Transition.hpp b/reading_machine/include/Transition.hpp index c4c6e272195788e3f00ba37b2aebced5f8cb813f..c3a4589170208ed897b1eebca731c74edf399dd1 100644 --- a/reading_machine/include/Transition.hpp +++ b/reading_machine/include/Transition.hpp @@ -10,6 +10,7 @@ class Transition private : std::string name; + std::string state; std::vector<Action> sequence; std::function<int(const Config & config)> cost; diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp index ce3cb811d23ebec4875c08cdca1c5f654a30d8a3..f18450c0a0d644fc07402461dcc04d9fd9d7f617 100644 --- a/reading_machine/src/Transition.cpp +++ b/reading_machine/src/Transition.cpp @@ -3,8 +3,7 @@ Transition::Transition(const std::string & name) { - this->name = name; - + std::regex nameRegex("(<(.+)> )?(.+)"); std::regex writeRegex("WRITE ([bs])\\.(.+) (.+) (.+)"); std::regex shiftRegex("SHIFT"); std::regex reduceRegex("REDUCE"); @@ -14,23 +13,29 @@ Transition::Transition(const std::string & name) try { - - if (util::doIfNameMatch(writeRegex, name, [this](auto sm){initWrite(sm[3], sm[1], sm[2], sm[4]);})) + if (!util::doIfNameMatch(nameRegex, name, [this, name](auto sm) + { + this->state = sm[2]; + this->name = sm[3]; + })) + util::myThrow("doesn't match nameRegex"); + + if (util::doIfNameMatch(writeRegex, this->name, [this](auto sm){initWrite(sm[3], sm[1], sm[2], sm[4]);})) return; - if (util::doIfNameMatch(shiftRegex, name, [this](auto){initShift();})) + if (util::doIfNameMatch(shiftRegex, this->name, [this](auto){initShift();})) return; - if (util::doIfNameMatch(reduceRegex, name, [this](auto){initReduce();})) + if (util::doIfNameMatch(reduceRegex, this->name, [this](auto){initReduce();})) return; - if (util::doIfNameMatch(leftRegex, name, [this](auto sm){initLeft(sm[1]);})) + if (util::doIfNameMatch(leftRegex, this->name, [this](auto sm){initLeft(sm[1]);})) return; - if (util::doIfNameMatch(rightRegex, name, [this](auto sm){initRight(sm[1]);})) + if (util::doIfNameMatch(rightRegex, this->name, [this](auto sm){initRight(sm[1]);})) return; - if (util::doIfNameMatch(eosRegex, name, [this](auto){initEOS();})) + if (util::doIfNameMatch(eosRegex, this->name, [this](auto){initEOS();})) return; throw std::invalid_argument("no match"); - } catch (std::exception & e) {util::myThrow(fmt::format("Invalid name '{}' ({})", name, e.what()));} + } catch (std::exception & e) {util::myThrow(fmt::format("Invalid name '{}' ({})", this->name, e.what()));} } @@ -42,6 +47,9 @@ void Transition::apply(Config & config) bool Transition::appliable(const Config & config) const { + if (!state.empty() && state != config.getState()) + return false; + for (const Action & action : sequence) if (!action.appliable(config, action)) return false;