Skip to content
Snippets Groups Projects
ReadingMachine.cpp 1.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "ReadingMachine.hpp"
    #include "util.hpp"
    
    ReadingMachine::ReadingMachine(const std::string & filename)
    {
      std::FILE * file = std::fopen(filename.c_str(), "r");
    
      char buffer[1024];
    
    Franck Dary's avatar
    Franck Dary committed
      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);
    
    Franck Dary's avatar
    Franck Dary committed
    
      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());
    
    
    Franck Dary's avatar
    Franck Dary committed
        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;
    }