Website Summary Files Commits Branches @commit @diff @stats
path: root / homework / 81568 / BF_Interpreter / main.cpp
diff options
context:
space:
mode:
Commit3e5cf5941db07bcd3527a73b62077d5277d57f2d (patch)
Author
 Mincho Paskalev <minchopaskal@gmail.com>
2018-11-28 09:42:47 +0200
Committer
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-28 09:42:47 +0200
Files1d3d4a9cecfd9d314905abc3af3dd54ac99a94aa /homework/81568/BF_Interpreter/main.cpp
IPL-3e5cf5941db07bcd3527a73b62077d5277d57f2d.tar
IPL-3e5cf5941db07bcd3527a73b62077d5277d57f2d.tar.gz
IPL-3e5cf5941db07bcd3527a73b62077d5277d57f2d.zip
Parent5288b0429fcdac891be3bced8e21787bd452d44a (diff)
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
1 files changed, 68 insertions, 0 deletions
-rw-r--r--homework/81568/BF_Interpreter/main.cpp68
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 <fstream>
+#include <iostream>
+#include <iterator>
+#include <sstream>
+#include <string>
+
+#define USAGE_MSG \
+ "Usage %s [-f <code file> | -c <code>] (-i <input file>) (-o <output file>)\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<char>(file)),
+ std::istreambuf_iterator<char>());
+ }
+ } 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;
+}