#include "ReadingMachine.hpp" #include "util.hpp" ReadingMachine::ReadingMachine(const std::string & filename) { dicts.emplace(std::make_pair("", Dict::State::Open)); std::FILE * file = std::fopen(filename.c_str(), "r"); char buffer[1024]; std::string fileContent; std::vector<std::string> lines; while (!std::feof(file)) { if (buffer != std::fgets(buffer, 1024, file)) break; // If line is blank or commented (# or //), ignore it if (util::doIfNameMatch(std::regex("((\\s|\\t)*)(((#|//).*)|)(\n|)"), buffer, [](auto){})) continue; if (buffer[std::strlen(buffer)-1] == '\n') buffer[std::strlen(buffer)-1] = '\0'; lines.emplace_back(buffer); } std::fclose(file); try { unsigned int curLine = 0; if (!util::doIfNameMatch(std::regex("Name : (.+)"), lines[curLine++], [this](auto sm){name = sm[1];})) util::myThrow("No name specified"); while (util::doIfNameMatch(std::regex("Classifier : (.+) (.+) (.+)"), lines[curLine++], [this](auto sm){classifier.reset(new Classifier(sm[1], sm[2], sm[3]));})); if (!classifier.get()) util::myThrow("No Classifier specified"); --curLine; //std::vector<std::string_view> restOfFile; //while (curLine < lines.size() and !util::doIfNameMatch(std::regex("Strategy(.*)"),lines[curLine], [](auto){})) // restOfFile.emplace_back(lines[curLine++]); //featureFunction.reset(new FeatureFunction(restOfFile)); auto restOfFile = std::vector<std::string_view>(lines.begin()+curLine, lines.end()); strategy.reset(new Strategy(restOfFile)); } catch(std::exception & e) {util::myThrow(fmt::format("during reading of '{}' : {}", filename, e.what()));} } TransitionSet & ReadingMachine::getTransitionSet() { return classifier->getTransitionSet(); } Strategy & ReadingMachine::getStrategy() { return *strategy; } Dict & ReadingMachine::getDict(const std::string & state) { auto found = dicts.find(state); if (found == dicts.end()) return dicts.at(""); return found->second; } Classifier * ReadingMachine::getClassifier() { return classifier.get(); }