diff --git a/dev/src/dev.cpp b/dev/src/dev.cpp index 12f9f771feee48a94fee0000008e4dd4b76bea1e..3b496902b718df6f4f223b0ec50b6d99153691a3 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 58b2fc8196e38cdfe6590580eeea9ed44f6b84f5..08c273fc45ea78180973c7fb856b24ac7f7a7c47 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 6853e4eea2deae0df10dde3595138ae41873e4c6..9a25963a405fea88d137a9ad4e892750e4b47eea 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 6e84e06531e891490bd1edd17bfde0f73b33efd3..05084c551d207c83563c4d1054c7bd39393b0001 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 118e62bb737f08a4fd9da2d61245add7fdcfe0fc..cbe67ee11ec9243dea4208d3c820ad2a1a07b657 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