From cfee03e4e410fcf89233c5976ea399db49287ab8 Mon Sep 17 00:00:00 2001
From: Franck Dary <franck.dary@lis-lab.fr>
Date: Tue, 17 Dec 2019 21:44:49 +0100
Subject: [PATCH] Added stack

---
 dev/src/dev.cpp                    | 14 ++-----------
 reading_machine/include/Config.hpp |  5 ++++-
 reading_machine/src/BaseConfig.cpp | 10 +++++++--
 reading_machine/src/Config.cpp     | 33 +++++++++++++++++++++++++++++-
 reading_machine/src/SubConfig.cpp  |  2 +-
 5 files changed, 47 insertions(+), 17 deletions(-)

diff --git a/dev/src/dev.cpp b/dev/src/dev.cpp
index 12f9f77..3b49690 100644
--- a/dev/src/dev.cpp
+++ b/dev/src/dev.cpp
@@ -9,19 +9,9 @@ int main(int argc, char * argv[])
   if (argc != 4)
     util::error("3 arguments expected");
 
-  BaseConfig config(argv[3], argv[1], argv[2]);
+  BaseConfig goldConfig(argv[3], argv[1], argv[2]);
 
-  std::vector<SubConfig> configs;
-
-  for (int i = 0; i < 2; i++)
-    configs.emplace_back(config);
-
-  configs[0].addToHistory("LEFT");
-  configs[0].addToHistory("RIGHT");
-
-  configs[0].wordIndex = 2000;
-  configs[0].update();
-  configs[0].printForDebug(stdout);
+  SubConfig config(goldConfig);
 
   fmt::print(stderr, "ok\n");
   std::scanf("%*c");
diff --git a/reading_machine/include/Config.hpp b/reading_machine/include/Config.hpp
index 58b2fc8..08c273f 100644
--- a/reading_machine/include/Config.hpp
+++ b/reading_machine/include/Config.hpp
@@ -28,13 +28,14 @@ class Config
 
   std::vector<String> lines;
 
-  public : 
+  protected :
 
   const Utf8String & rawInput;
   std::size_t wordIndex{0};
   std::size_t characterIndex{0};
   String state{"NONE"};
   boost::circular_buffer<String> history{10};
+  boost::circular_buffer<std::size_t> stack{50};
 
   protected :
 
@@ -74,6 +75,8 @@ class Config
   bool hasLetter(int letterIndex) const;
   util::utf8char getLetter(int letterIndex) const;
   void addToHistory(const std::string & transition);
+  void addToStack(std::size_t index);
+  bool isComment(std::size_t lineIndex) const;
 };
 
 #endif
diff --git a/reading_machine/src/BaseConfig.cpp b/reading_machine/src/BaseConfig.cpp
index 6853e4e..9a25963 100644
--- a/reading_machine/src/BaseConfig.cpp
+++ b/reading_machine/src/BaseConfig.cpp
@@ -79,12 +79,18 @@ void BaseConfig::readTSVInput(std::string_view tsvFilename)
 
       continue;
     }
-    else if (line[0] == '#')
-      continue;
 
     if (line.back() == '\n')
       line.remove_suffix(1);
 
+    if (line[0] == '#')
+    {
+      addLines(1);
+      get(EOSColName, getNbLines()-1, 0) = EOSSymbol0;
+      get(0, getNbLines()-1, 0) = std::string(line);
+      continue;
+    }
+
     inputHasBeenRead = true;
 
     auto splited = util::split(line, '\t');
diff --git a/reading_machine/src/Config.cpp b/reading_machine/src/Config.cpp
index 6e84e06..05084c5 100644
--- a/reading_machine/src/Config.cpp
+++ b/reading_machine/src/Config.cpp
@@ -65,6 +65,11 @@ void Config::print(FILE * dest) const
 {
   for (unsigned int line = 0; line < getNbLines(); line++)
   {
+    if (isComment(getFirstLineIndex()+line))
+    {
+      fmt::print(dest, "{}\n", getConst(0, getFirstLineIndex()+line, 0));
+      continue;
+    }
     for (unsigned int i = 0; i < getNbColumns()-1; i++)
       fmt::print(dest, "{}{}", getLastNotEmptyConst(i, getFirstLineIndex()+line), i < getNbColumns()-2 ? "\t" : "\n");
     if (getLastNotEmptyConst(EOSColName, getFirstLineIndex()+line) == EOSSymbol1)
@@ -93,6 +98,8 @@ void Config::printForDebug(FILE * dest) const
 
   for (int line = firstLineToPrint; line <= lastLineToPrint; line++)
   {
+    if (isComment(line))
+      continue;
     toPrint.emplace_back();
     toPrint.back().emplace_back(line == (int)wordIndex ? "=>" : "");
     for (unsigned int i = 0; i < getNbColumns(); i++)
@@ -117,11 +124,22 @@ void Config::printForDebug(FILE * dest) const
   }
   if (!historyStr.empty())
     historyStr.pop_back();
+  std::string stackStr = "";
+  for (auto & s : stack)
+  {
+    if (hasColIndex("ID"))
+      stackStr += getLastNotEmptyConst("ID", s);
+    else
+      stackStr += std::to_string(s);
+    stackStr += ",";
+  }
+  if (!stackStr.empty())
+    stackStr.pop_back();
   fmt::print(dest, "{}\n", longLine);
   for (std::size_t index = characterIndex; index < util::getSize(rawInput) and index - characterIndex < lettersWindowSize; index++)
     fmt::print(dest, "{}", getLetter(index));
   fmt::print(dest, "\n{}\n", longLine);
-  fmt::print(dest, "wordIndex={} characterIndex={}\nhistory=({})\n", wordIndex, characterIndex, historyStr);
+  fmt::print(dest, "State={}\nwordIndex={} characterIndex={}\nhistory=({})\nstack=({})\n", state, wordIndex, characterIndex, historyStr, stackStr);
   fmt::print(dest, "{}\n", longLine);
 
   for (unsigned int line = 0; line < toPrint.size(); line++)
@@ -133,6 +151,8 @@ void Config::printForDebug(FILE * dest) const
     if (toPrint[line].back() == EOSSymbol1)
       fmt::print(dest, "\n");
   }
+
+  fmt::print(dest, "\n");
 }
 
 Config::String & Config::getLastNotEmpty(int colIndex, int lineIndex)
@@ -182,6 +202,11 @@ void Config::addToHistory(const std::string & transition)
   history.push_back(String(transition));
 }
 
+void Config::addToStack(std::size_t index)
+{
+  stack.push_back(index);
+}
+
 bool Config::hasLetter(int letterIndex) const
 {
   return letterIndex >= 0 and letterIndex < (int)util::getSize(rawInput);
@@ -192,3 +217,9 @@ util::utf8char Config::getLetter(int letterIndex) const
   return rawInput.get()[letterIndex];
 }
 
+bool Config::isComment(std::size_t lineIndex) const
+{
+  auto iter = getConstIterator(0, lineIndex, 0);
+  return !util::isEmpty(*iter) and iter->get()[0] == '#';
+}
+
diff --git a/reading_machine/src/SubConfig.cpp b/reading_machine/src/SubConfig.cpp
index 118e62b..cbe67ee 100644
--- a/reading_machine/src/SubConfig.cpp
+++ b/reading_machine/src/SubConfig.cpp
@@ -73,7 +73,7 @@ std::size_t SubConfig::getColIndex(const std::string & colName) const
 
 bool SubConfig::hasColIndex(const std::string & colName) const
 {
-  return model.getColIndex(colName);
+  return model.hasColIndex(colName);
 }
 
 const std::string & SubConfig::getColName(int colIndex) const
-- 
GitLab