Skip to content
Snippets Groups Projects
ReadingMachine.cpp 1.77 KiB
Newer Older
#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;
}