diff --git a/transition_machine/src/ActionBank.cpp b/transition_machine/src/ActionBank.cpp index 5db8a67f5fdbe73e73c0cb749ff1846001759d77..8493896c5c7d396341f83883d4b2e6a0f4665c0f 100644 --- a/transition_machine/src/ActionBank.cpp +++ b/transition_machine/src/ActionBank.cpp @@ -351,7 +351,7 @@ Action::BasicAction ActionBank::pushHead() auto undo = [](Config & c, Action::BasicAction &) {c.stackPop();}; auto appliable = [](Config & c, Action::BasicAction &) - {return !(c.stackSize() >= ProgramParameters::maxStackSize || (!c.stackEmpty() && c.stackTop() == c.getHead()));}; + {return !(c.stackSize() >= ProgramParameters::maxStackSize || (!c.stackEmpty() && c.stackTop() == c.getHead()) || c.getHead() >= c.getTape(ProgramParameters::sequenceDelimiterTape).size());}; Action::BasicAction basicAction = {Action::BasicAction::Type::Push, "", apply, undo, appliable}; @@ -663,6 +663,8 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na }; auto appliable = [](Config & c, Action::BasicAction &) { + if (c.getHead() >= c.getTape(ProgramParameters::sequenceDelimiterTape).size()) + return false; if (c.stackEmpty() || c.endOfTapes()) return false; int b0 = c.getHead(); @@ -728,6 +730,8 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na }; auto appliable = [](Config & c, Action::BasicAction &) { + if (c.getHead() >= c.getTape(ProgramParameters::sequenceDelimiterTape).size()) + return false; if (c.stackEmpty()) return false; if (util::split(c.getTape("ID").getRef(0), '-').size() > 1) @@ -786,7 +790,7 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na }; auto appliable = [](Config & c, Action::BasicAction &) { - return !c.isFinal() && !c.stackEmpty(); + return !c.isFinal() && !c.stackEmpty() && c.getTape(ProgramParameters::sequenceDelimiterTape).getHyp(c.stackTop()-c.getHead()) != ProgramParameters::sequenceDelimiter; }; Action::BasicAction basicAction = {Action::BasicAction::Type::Write, "", apply, undo, appliable}; diff --git a/transition_machine/src/Config.cpp b/transition_machine/src/Config.cpp index 63f1c0c65d9f8acc0bd352eeba856e2443507c53..fbee3ee31fe0c21ff2520d18388c69e23b079882 100644 --- a/transition_machine/src/Config.cpp +++ b/transition_machine/src/Config.cpp @@ -943,6 +943,10 @@ void Config::updateIdsInSequence() auto & ids = getTape("ID"); while (sentenceEnd >= 0 && eos.getHyp(sentenceEnd-getHead()) != ProgramParameters::sequenceDelimiter) sentenceEnd--; + + while (sentenceEnd >= ids.size()) + sentenceEnd--; + int sentenceStart = std::max(0,sentenceEnd-1); while (sentenceStart >= 0 && eos.getHyp(sentenceStart-getHead()) != ProgramParameters::sequenceDelimiter) sentenceStart--; @@ -964,6 +968,7 @@ void Config::updateIdsInSequence() for (int i = sentenceStart; i <= sentenceEnd; i++) { auto splited = util::split(ids.getRef(i-getHead()), '-'); + if (splited.size() == 1) { auto splited2 = util::split(ids.getRef(i-getHead()), '.'); diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp index 2438740cb5800347e328b9d82b1a1c9f43f13bdb..5ebb7694d36b242e2cf3315c0ddf6e6f45476bda 100644 --- a/transition_machine/src/Oracle.cpp +++ b/transition_machine/src/Oracle.cpp @@ -584,6 +584,8 @@ void Oracle::createDatabase() if (util::split(previousAction, ' ')[0] == "shift" || util::split(previousAction, ' ')[0] == "right") { newState = "signature"; + if (c.endOfTapes()) + newState = "parser"; movement = 1; } else @@ -772,6 +774,10 @@ void Oracle::createDatabase() auto & eos = c.getTape(ProgramParameters::sequenceDelimiterTape); int head = c.getHead(); + + if (head >= eos.size()) + return action == "EOS" ? 0 : 1; + bool headIsMultiword = util::split(ids.getRef(0), '-').size() > 1; bool headIsEmptyNode = util::split(ids.getRef(0), '.').size() > 1; int headGov = -1;