diff --git a/transition_machine/src/ActionBank.cpp b/transition_machine/src/ActionBank.cpp index d68d017de9de645b65d6129c5660044cb5742099..51466c1df16da3ede636405bbec8f84478b55788 100644 --- a/transition_machine/src/ActionBank.cpp +++ b/transition_machine/src/ActionBank.cpp @@ -184,7 +184,7 @@ Action::BasicAction ActionBank::stackPop(bool checkGov) if (!checkGov) return true; - return split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1 || (!c.getTape("GOV").getHyp(c.stackTop()-c.getHead()).empty() && c.stackTop() != c.getHead()); + return split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '.').size() > 1 || split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1 || (!c.getTape("GOV").getHyp(c.stackTop()-c.getHead()).empty() && c.stackTop() != c.getHead()); }; Action::BasicAction basicAction = {Action::BasicAction::Type::Pop, "", apply, undo, appliable}; @@ -433,6 +433,10 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na return false; if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1) return false; + if (split(c.getTape("ID").getRef(0), '.').size() > 1) + return false; + if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '.').size() > 1) + return false; return simpleBufferWriteAppliable(c, "GOV", s0-b0); }; @@ -491,6 +495,10 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na return false; if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '-').size() > 1) return false; + if (split(c.getTape("ID").getRef(0), '.').size() > 1) + return false; + if (split(c.getTape("ID").getRef(c.stackTop()-c.getHead()), '.').size() > 1) + return false; return simpleBufferWriteAppliable(c, "GOV", 0); }; Action::BasicAction basicAction = @@ -557,6 +565,8 @@ std::vector<Action::BasicAction> ActionBank::str2sequence(const std::string & na auto s = c.stackGetElem(i); if (split(ids.getRef(s-b0), '-').size() > 1) continue; + if (split(ids.getRef(s-b0), '.').size() > 1) + continue; if (govs.getHyp(s-b0).empty() || govs.getHyp(s-b0) == "0") { if (rootIndex == -1) diff --git a/transition_machine/src/Config.cpp b/transition_machine/src/Config.cpp index 5bcfc8daddbdf5774788520c33db186ede7106fa..e38b6b2d3ada7d6bac2290200ee5f3b43206d15a 100644 --- a/transition_machine/src/Config.cpp +++ b/transition_machine/src/Config.cpp @@ -187,6 +187,8 @@ void Config::fillTapesWithInput() { if (split(ids.getRef(word), '-').size() > 1) continue; + if (split(ids.getRef(word), '.').size() > 1) + continue; if (govs.getRef(word) == "0") continue; diff --git a/transition_machine/src/Oracle.cpp b/transition_machine/src/Oracle.cpp index 2242fc190e0efd7987b5f41d3105d6f7e4388377..20bf53ccba3ced9f83f10efdc29a409e3ab63eba 100644 --- a/transition_machine/src/Oracle.cpp +++ b/transition_machine/src/Oracle.cpp @@ -597,12 +597,14 @@ void Oracle::createDatabase() int head = c.getHead(); bool headIsMultiword = split(ids.getRef(0), '-').size() > 1; + bool headIsEmptyNode = split(ids.getRef(0), '.').size() > 1; int headGov = -1; try {headGov = head + std::stoi(govs.getRef(0));} catch (std::exception &) {headGov = -1;} int stackHead = c.stackEmpty() ? 0 : c.stackTop(); bool stackHeadIsMultiword = split(ids.getRef(stackHead-head), '-').size() > 1; + bool stackHeadIsEmptyNode = split(ids.getRef(stackHead-head), '.').size() > 1; int stackGov = -1; try {stackGov = stackHead + std::stoi(govs.getRef(stackHead-head));} catch (std::exception &) {stackGov = -1;} @@ -625,7 +627,7 @@ void Oracle::createDatabase() if (parts[0] == "SHIFT") { - if (headIsMultiword) + if (headIsMultiword || headIsEmptyNode) return 0; for (int j = 0; j < c.stackSize(); j++) @@ -668,7 +670,7 @@ void Oracle::createDatabase() } else if (parts[0] == "REDUCE") { - if (stackHeadIsMultiword) + if (stackHeadIsMultiword || stackHeadIsEmptyNode) return 0; for (int i = head; i <= sentenceEnd; i++) @@ -689,7 +691,7 @@ void Oracle::createDatabase() } else if (parts[0] == "LEFT") { - if (stackHeadIsMultiword || headIsMultiword) + if (stackHeadIsMultiword || headIsMultiword || headIsEmptyNode || stackHeadIsEmptyNode) return 1; if (eos.getRef(stackHead-head) == ProgramParameters::sequenceDelimiter) @@ -719,7 +721,7 @@ void Oracle::createDatabase() } else if (parts[0] == "RIGHT") { - if (stackHeadIsMultiword || headIsMultiword) + if (stackHeadIsMultiword || headIsMultiword || headIsEmptyNode || stackHeadIsEmptyNode) return 1; for (int j = 0; j < c.stackSize(); j++)