diff --git a/reading_machine/include/Config.hpp b/reading_machine/include/Config.hpp index daaeae1187c76b2db6e492e48001b0283ad3b84e..b18bc88bbc5d03e1f99f0ef425c7e25886c41bb9 100644 --- a/reading_machine/include/Config.hpp +++ b/reading_machine/include/Config.hpp @@ -32,6 +32,7 @@ class Config std::vector<String> lines; std::set<std::string> predicted; + int lastPoppedStack{-1}; protected : @@ -109,6 +110,7 @@ class Config std::vector<long> extractContext(int leftBorder, int rightBorder, Dict & dict) const; void addPredicted(const std::set<std::string> & predicted); bool isPredicted(const std::string & colName) const; + int getLastPoppedStack() const; }; #endif diff --git a/reading_machine/include/TransitionSet.hpp b/reading_machine/include/TransitionSet.hpp index 4263ba47434f8114952d13abb9bac955db6a6b8e..2daaa2ea986d619994fce97e61bcd37131445ccd 100644 --- a/reading_machine/include/TransitionSet.hpp +++ b/reading_machine/include/TransitionSet.hpp @@ -11,7 +11,6 @@ class TransitionSet private : std::vector<Transition> transitions; - std::optional<std::size_t> defaultAction; public : diff --git a/reading_machine/src/Action.cpp b/reading_machine/src/Action.cpp index 427ec98be9017d9d12e13015c0a93e4f494072ff..b24d547362765b7c4ec2f8e0927ff7050da9d750 100644 --- a/reading_machine/src/Action.cpp +++ b/reading_machine/src/Action.cpp @@ -139,9 +139,12 @@ Action Action::pushWordIndexOnStack() config.popStack(); }; - auto appliable = [](const Config &, const Action &) + auto appliable = [](const Config & config, const Action &) { - return true; + if (config.hasStack(0) and config.getStack(0) == config.getWordIndex()) + return false; + + return (int)config.getWordIndex() != config.getLastPoppedStack(); }; return {Type::Push, apply, undo, appliable}; diff --git a/reading_machine/src/Config.cpp b/reading_machine/src/Config.cpp index 49ad5095402d4d3f1b488a26be578224c04a911e..286386a0e1496c329ec1b9697124d9ef097a13b0 100644 --- a/reading_machine/src/Config.cpp +++ b/reading_machine/src/Config.cpp @@ -309,6 +309,7 @@ void Config::addToStack(std::size_t index) void Config::popStack() { + lastPoppedStack = getStack(0); stack.pop_back(); } @@ -491,3 +492,8 @@ bool Config::isPredicted(const std::string & colName) const return predicted.count(colName); } +int Config::getLastPoppedStack() const +{ + return lastPoppedStack; +} +