From a867c8d6e98e042052dfa5a44a065176f3ad13de Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 15 Dec 2018 13:30:39 +0000 Subject: [PATCH] Brainfuck emulator --- C++/brainfuckemulator/.vscode/settings.json | 37 +++++++++ C++/brainfuckemulator/a.out | Bin 0 -> 22128 bytes C++/brainfuckemulator/fml.bf | 2 + C++/brainfuckemulator/main.cpp | 87 ++++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 C++/brainfuckemulator/.vscode/settings.json create mode 100755 C++/brainfuckemulator/a.out create mode 100644 C++/brainfuckemulator/fml.bf create mode 100644 C++/brainfuckemulator/main.cpp diff --git a/C++/brainfuckemulator/.vscode/settings.json b/C++/brainfuckemulator/.vscode/settings.json new file mode 100644 index 0000000..def3d8b --- /dev/null +++ b/C++/brainfuckemulator/.vscode/settings.json @@ -0,0 +1,37 @@ +{ + "files.associations": { + "fstream": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "array": "cpp", + "*.tcc": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "optional": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "type_traits": "cpp", + "tuple": "cpp", + "typeinfo": "cpp", + "utility": "cpp" + } +} \ No newline at end of file diff --git a/C++/brainfuckemulator/a.out b/C++/brainfuckemulator/a.out new file mode 100755 index 0000000000000000000000000000000000000000..3c9937436edecac2fb8abd8481f574888e7214c6 GIT binary patch literal 22128 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 literal 0 HcmV?d00001 diff --git a/C++/brainfuckemulator/fml.bf b/C++/brainfuckemulator/fml.bf new file mode 100644 index 0000000..f767b69 --- /dev/null +++ b/C++/brainfuckemulator/fml.bf @@ -0,0 +1,2 @@ +>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>> +++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+. diff --git a/C++/brainfuckemulator/main.cpp b/C++/brainfuckemulator/main.cpp new file mode 100644 index 0000000..4a08e79 --- /dev/null +++ b/C++/brainfuckemulator/main.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include + +// > Increment the pointer. +// < Decrement the pointer. +// + Increment the byte at the pointer. +// - Decrement the byte at the pointer. +// . Output the byte at the pointer. +// , Input a byte and store it in the byte at the pointer. +// [ Jump forward past the matching ] if the byte at the pointer is zero. +// ] Jump backward to the matching [ unless the byte at the pointer is zero. + +class BrainFuck { +public: + char stack[30000]; + int programCounter = 0; + char* ptr; + std::string program; + + BrainFuck(std::string program) { + this->program = program; + this->ptr = (char*)this->program.c_str(); + } + + bool tick() { + if (programCounter >= 30000) return false; + int bal; + switch((char)program[programCounter]) { + case '>': ++ptr; break; + case '<': --ptr; break; + case '+': ++*ptr; break; + case '-': --*ptr; break; + case '.': programPrint(*ptr); break; + case ',': break; // TODO GETS(); + case '[': + bal = 1; + if (*ptr == '\0') { + do { + programCounter++; + if (program[programCounter] == '[') bal++; + else if (program[programCounter] == ']') bal--; + } while (bal != 0); + } + break; + case ']': + bal = 0; + do { + if (program[programCounter] == '[') bal++; + else if (program[programCounter] == ']') bal--; + programCounter--; + } while (bal != 0); + break; + } + programCounter++; + return true; + } + + void programPrint(char toPrint) { + std::cout << "OUTPUT AT POSITION " << programCounter << ": "; + putchar(toPrint); + putchar('\n'); + } +}; + +int main(int argc, char** argv) { + if (argc < 2) {std::cout << "No input file specified" << std::endl; exit(0); } + + std::ifstream input(*(argv + 1)); + std::string programStream; + + for (std::string line; std::getline(input, line); ) + programStream += line; + + programStream.erase(std::remove(programStream.begin(), programStream.end(), '\n'), programStream.end()); + + BrainFuck CPU(programStream); + + while (1) { + if (!CPU.tick()) { + exit(0); + } + } + + std::cout << programStream << std::endl; +}