From 5c114f0c704e5a574c9e1b0b518cab60fe677092 Mon Sep 17 00:00:00 2001 From: Franck Dary <franck.dary@lis-lab.fr> Date: Mon, 30 Mar 2020 19:05:26 +0200 Subject: [PATCH] Made it impossible to do a splitword on splitedwords or to modify splitedwords --- reading_machine/include/Action.hpp | 3 ++- reading_machine/src/Action.cpp | 26 ++++++++++++++++++++++++-- reading_machine/src/Transition.cpp | 4 +++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/reading_machine/include/Action.hpp b/reading_machine/include/Action.hpp index 7900c7b..17e7114 100644 --- a/reading_machine/include/Action.hpp +++ b/reading_machine/include/Action.hpp @@ -58,11 +58,12 @@ class Action static Action setRoot(); static Action updateIds(); static Action endWord(); + static Action assertIdIsEmpty(); static Action attach(Object governorObject, int governorIndex, Object dependentObject, int dependentIndex); static Action addCurCharToCurWord(); static Action ignoreCurrentCharacter(); static Action consumeCharacterIndex(std::string consumed); - static Action setMultiwordId(int multiwordSize); + static Action setMultiwordIds(int multiwordSize); }; #endif diff --git a/reading_machine/src/Action.cpp b/reading_machine/src/Action.cpp index 5c68d39..dbe4c12 100644 --- a/reading_machine/src/Action.cpp +++ b/reading_machine/src/Action.cpp @@ -48,16 +48,20 @@ Action Action::moveWordIndex(int movement) return {Type::MoveWord, apply, undo, appliable}; } -Action Action::setMultiwordId(int multiwordSize) +Action Action::setMultiwordIds(int multiwordSize) { auto apply = [multiwordSize](Config & config, Action & a) { addHypothesisRelative(Config::idColName, Object::Buffer, 0, fmt::format("{}-{}", config.getCurrentWordId()+1, config.getCurrentWordId()+multiwordSize)).apply(config, a); + for (int i = 0; i < multiwordSize; i++) + addHypothesisRelative(Config::idColName, Object::Buffer, i+1, fmt::format("{}", config.getCurrentWordId()+1+i)).apply(config, a); }; - auto undo = [](Config & config, Action &) + auto undo = [multiwordSize](Config & config, Action &) { config.getLastNotEmpty(Config::idColName, config.getWordIndex()) = ""; + for (int i = 0; i < multiwordSize; i++) + config.getLastNotEmpty(Config::idColName, config.getWordIndex()+1+i) = ""; }; auto appliable = [](const Config &, const Action &) @@ -366,6 +370,24 @@ Action Action::ignoreCurrentCharacter() return {Type::MoveChar, apply, undo, appliable}; } +Action Action::assertIdIsEmpty() +{ + auto apply = [](Config &, Action &) + { + }; + + auto undo = [](Config &, Action &) + { + }; + + auto appliable = [](const Config & config, const Action &) + { + return util::isEmpty(config.getAsFeature(Config::idColName, config.getWordIndex())); + }; + + return {Type::Check, apply, undo, appliable}; +} + Action Action::addCurCharToCurWord() { auto apply = [](Config & config, Action & a) diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp index 61681fc..11ad8e9 100644 --- a/reading_machine/src/Transition.cpp +++ b/reading_machine/src/Transition.cpp @@ -164,6 +164,7 @@ void Transition::initEndWord() void Transition::initAddCharToWord() { + sequence.emplace_back(Action::assertIdIsEmpty()); sequence.emplace_back(Action::addLinesIfNeeded(0)); sequence.emplace_back(Action::addCurCharToCurWord()); sequence.emplace_back(Action::moveCharacterIndex(1)); @@ -190,11 +191,12 @@ void Transition::initAddCharToWord() void Transition::initSplitWord(std::vector<std::string> words) { auto & consumedWord = words[0]; + sequence.emplace_back(Action::assertIdIsEmpty()); sequence.emplace_back(Action::addLinesIfNeeded(words.size())); sequence.emplace_back(Action::consumeCharacterIndex(consumedWord)); for (unsigned int i = 0; i < words.size(); i++) sequence.emplace_back(Action::addHypothesisRelative("FORM", Action::Object::Buffer, i, words[i])); - sequence.emplace_back(Action::setMultiwordId(words.size()-1)); + sequence.emplace_back(Action::setMultiwordIds(words.size()-1)); cost = [words](const Config & config) { -- GitLab