From 3e5cf5941db07bcd3527a73b62077d5277d57f2d Mon Sep 17 00:00:00 2001 From: Mincho Paskalev Date: Wed, 28 Nov 2018 09:42:47 +0200 Subject: Adding 3rd homework - Brainfuck Interpreter (#44) * Add 1st hw * --amend * moving readme for 1st hw to designated folder * renamed TokenType enum to TokenClass * fixed character constant lexing. added sampe output file * add new line at end-of-file. added gitignore * a bit of refactoring * Add BF interpreter --- homework/81568/BF_Interpreter/main.cpp | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 homework/81568/BF_Interpreter/main.cpp (limited to 'homework/81568/BF_Interpreter/main.cpp') diff --git a/homework/81568/BF_Interpreter/main.cpp b/homework/81568/BF_Interpreter/main.cpp new file mode 100644 index 0000000..ccde7a5 --- /dev/null +++ b/homework/81568/BF_Interpreter/main.cpp @@ -0,0 +1,68 @@ +#include "bf_interpreter.h" +#include "CLI11.hpp" + +#include +#include +#include +#include +#include + +#define USAGE_MSG \ + "Usage %s [-f | -c ] (-i ) (-o )\n" \ + "If no input/output file is provided standart input/output is used instead.\n" + + +// TODO: implement proper CLI parsing +// TODO: https://github.com/CLIUtils/CLI11 +int main(int argc, char **argv) { + CLI::App app {"Simple Brainfuck interpreter written for " + "IPL course homework from FMI, SU, 2018." }; + + std::string srcFile; + CLI::Option *srcFileOpt = app.add_option("-f,--file", srcFile, "Brainfuck source file"); + + srcFileOpt->check(CLI::ExistingFile); + + std::string srcCode; + CLI::Option *srcCodeOpt = app.add_option("-c,--code", srcCode, "Brainfuck source code"); + + srcFileOpt->excludes(srcCodeOpt); + srcCodeOpt->excludes(srcFileOpt); + + std::string output; + CLI::Option *outputOpt = app.add_option("-o,--output", output, "File to write the Brainfuck output to. Optional."); + + std::string input; + CLI::Option *inputOpt = app.add_option("-i,--input", input, "File to take the Brainfuck input from. Optional."); + + inputOpt->check(CLI::ExistingFile); + + CLI11_PARSE(app, argc, argv); + + std::string source; + if (*srcFileOpt) { + std::ifstream file {srcFile}; + if (file.is_open()) { + source.assign((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + } + } else { + source = srcCode; + } + + std::ifstream inputFile; + if (*inputOpt) + inputFile.open(input); + + std::ofstream outputFile; + if (*outputOpt) + outputFile.open(output); + + std::istream &is = *inputOpt ? inputFile : std::cin; + std::ostream &os = *outputOpt ? outputFile : std::cout; + + BFInterpreter bfi{source.c_str(), is, os}; + bfi.compile(); + + return 0; +} -- cgit v1.3.1-23-gd82d