Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit8e84b639815b291d4c4e4041e4c5611202e012c1 (patch)
Author
 Bilyal Mestanov <bmestanov@gmail.com>
2018-11-28 12:43:19 +0200
Committer
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-28 12:43:19 +0200
Filesc4ab2a5bc325eabe1e70214e3966c0c6802852ef
IPL-8e84b639815b291d4c4e4041e4c5611202e012c1.tar
IPL-8e84b639815b291d4c4e4041e4c5611202e012c1.tar.gz
IPL-8e84b639815b291d4c4e4041e4c5611202e012c1.zip
Parentb98a9799f15c8ad0275175a1d8d013c4f6e0176f (diff)
Add brainf interpreter (#58)
diff --git a/homework/81270/.gitignore b/homework/81270/.gitignore
new file mode 100644
index 0000000..102b938
--- /dev/null
+++ b/homework/81270/.gitignore
@@ -0,0 +1,2 @@
+cmake-build-*
+.idea \ No newline at end of file
diff --git a/homework/81270/CMakeLists.txt b/homework/81270/CMakeLists.txt
new file mode 100644
index 0000000..24c1d1d
--- /dev/null
+++ b/homework/81270/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.9)
+project(81270)
+
+set(CMAKE_CXX_STANDARD 11)
+
+add_subdirectory(js2html)
+
+add_subdirectory(brainf-interpret) \ No newline at end of file
diff --git a/homework/81270/brainf-interpret/CMakeLists.txt b/homework/81270/brainf-interpret/CMakeLists.txt
new file mode 100644
index 0000000..7407ada
--- /dev/null
+++ b/homework/81270/brainf-interpret/CMakeLists.txt
@@ -0,0 +1,4 @@
+cmake_minimum_required(VERSION 3.9)
+project(brainf-interpret)
+
+add_executable(brainf-interpret Interpreter.cpp) \ No newline at end of file
diff --git a/homework/81270/brainf-interpret/Interpreter.cpp b/homework/81270/brainf-interpret/Interpreter.cpp
new file mode 100644
index 0000000..ebca77b
--- /dev/null
+++ b/homework/81270/brainf-interpret/Interpreter.cpp
@@ -0,0 +1,90 @@
+//
+// Created by bmestanov on 15.11.18.
+//
+
+#define TAPE_SIZE 65536
+#define STACK_SIZE 8192
+
+#include <fstream>
+#include <iostream>
+
+void failIf(bool condition, const char *message) {
+ if (condition) {
+ std::cerr << message;
+ exit(1);
+ }
+}
+
+int main(int argc, char **argv) {
+ argc--;
+ argv++;
+ char memory[TAPE_SIZE] = {0};
+ char *pp = memory; // program pointer
+ long stack[STACK_SIZE];
+ int sp = 0; // stack pointer
+
+ failIf(!argv[0], "No file provided");
+
+ std::ifstream file;
+ file.open(argv[0]);
+
+ failIf(!file, "Error opening file");
+
+ while (!file.eof()) {
+ auto symbol = static_cast<char>(file.get());
+ switch (symbol) {
+ case '>': {
+ // Allow memory wrap
+ pp = memory + (pp - memory + 1) % TAPE_SIZE;
+ break;
+ }
+ case '<': {
+ pp = memory + (pp - memory - 1) % TAPE_SIZE;
+ break;
+ }
+ case '+': {
+ (*pp)++;
+ break;
+ }
+ case '-': {
+ (*pp)--;
+ break;
+ }
+ case '.': {
+ std::putchar(*pp);
+ break;
+ }
+ case ',': {
+ *pp = static_cast<char>(std::getchar());
+ break;
+ }
+ case '[': {
+ if (*pp) {
+ failIf(sp == STACK_SIZE, "Stack overflow");
+ stack[sp++] = file.tellg();
+ } else {
+ long move = 1;
+ while (move > 0) {
+ auto next = static_cast<char>(file.get());
+ if (next == '[') move++;
+ if (next == ']') move--;
+ if (file.eof()) failIf(true, "Invalid syntax");
+ }
+ }
+ break;
+ }
+ case ']': {
+ failIf(sp == 0, "Invalid syntax");
+ if (*pp) {
+ long top = stack[sp - 1];
+ file.seekg(top);
+ } else {
+ sp--;
+ }
+ }
+ default:;
+ }
+ }
+
+ return 0;
+} \ No newline at end of file
diff --git a/homework/81270/brainf-interpret/hello.b b/homework/81270/brainf-interpret/hello.b
new file mode 100644
index 0000000..a2de5df
--- /dev/null
+++ b/homework/81270/brainf-interpret/hello.b
@@ -0,0 +1,3 @@
+>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]
+<.#>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[
+<++++>-]<+.[-]++++++++++.
diff --git a/homework/81270/brainf-interpret/primes.b b/homework/81270/brainf-interpret/primes.b
new file mode 100644
index 0000000..294fc6b
--- /dev/null
+++ b/homework/81270/brainf-interpret/primes.b
@@ -0,0 +1,221 @@
+===================================================================
+======================== OUTPUT STRING ============================
+===================================================================
+>++++++++[<++++++++>-]<++++++++++++++++.[-]
+>++++++++++[<++++++++++>-]<++++++++++++++.[-]
+>++++++++++[<++++++++++>-]<+++++.[-]
+>++++++++++[<++++++++++>-]<+++++++++.[-]
+>++++++++++[<++++++++++>-]<+.[-]
+>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
+>+++++[<+++++>-]<+++++++.[-]
+>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
+>++++++++++[<++++++++++>-]<++++++++++++.[-]
+>+++++[<+++++>-]<+++++++.[-]
+>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
+>++++++++++[<++++++++++>-]<+++++++++++.[-]
+>+++++++[<+++++++>-]<+++++++++.[-]
+>+++++[<+++++>-]<+++++++.[-]
+
+===================================================================
+======================== INPUT NUMBER ============================
+===================================================================
++ cont=1
+[
+ - cont=0
+ >,
+ ======SUB10======
+ ----------
+
+ [ not 10
+ <+> cont=1
+ =====SUB38======
+ ----------
+ ----------
+ ----------
+ --------
+
+ >
+ =====MUL10=======
+ [>+>+<<-]>>[<<+>>-]< dup
+
+ >>>+++++++++
+ [
+ <<<
+ [>+>+<<-]>>[<<+>>-]< dup
+ [<<+>>-]
+ >>-
+ ]
+ <<<[-]<
+ ======RMOVE1======
+ <
+ [>+<-]
+ ]
+ <
+]
+>>[<<+>>-]<<
+
+===================================================================
+======================= PROCESS NUMBER ===========================
+===================================================================
+
+==== ==== ==== ====
+numd numu teid teiu
+==== ==== ==== ====
+
+>+<-
+[
+ >+
+ ======DUP======
+ [>+>+<<-]>>[<<+>>-]<
+
+ >+<--
+
+ >>>>>>>>+<<<<<<<< isprime=1
+
+ [
+ >+
+
+ <-
+
+ =====DUP3=====
+ <[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
+
+ =====DUP2=====
+ >[>>+>+<<<-]>>>[<<<+>>>-]<<< <
+
+
+ >>>
+
+
+ ====DIVIDES=======
+ [>+>+<<-]>>[<<+>>-]< DUP i=div
+
+ <<
+ [
+ >>>>>+ bool=1
+ <<<
+ [>+>+<<-]>>[<<+>>-]< DUP
+ [>>[-]<<-] IF i THEN bool=0
+ >>
+ [ IF i=0
+ <<<<
+ [>+>+<<-]>>[<<+>>-]< i=div
+ >>>
+ - bool=0
+ ]
+ <<<
+ - DEC i
+ <<
+ -
+ ]
+
+ +>>[<<[-]>>-]<<
+ >[-]< CLR div
+ =====END DIVIDES====
+
+
+ [>>>>>>[-]<<<<<<-] if divides then isprime=0
+
+
+ <<
+
+ >>[-]>[-]<<<
+ ]
+
+ >>>>>>>>
+ [
+ -
+ <<<<<<<[-]<<
+
+ [>>+>+<<<-]>>>[<<<+>>>-]<<<
+
+ >>
+
+
+
+
+ ===================================================================
+ ======================== OUTPUT NUMBER ===========================
+ ===================================================================
+ [>+<-]>
+
+ [
+ ======DUP======
+ [>+>+<<-]>>[<<+>>-]<
+
+
+ ======MOD10====
+ >+++++++++<
+ [
+ >>>+<< bool= 1
+ [>+>[-]<<-] bool= ten==0
+ >[<+>-] ten = tmp
+ >[<<++++++++++>>-] if ten=0 ten=10
+ <<- dec ten
+ <- dec num
+ ]
+ +++++++++ num=9
+ >[<->-]< dec num by ten
+
+ =======RROT======
+ [>+<-]
+ < [>+<-]
+ < [>+<-]
+ >>>[<<<+>>>-]
+ <
+
+ =======DIV10========
+ >+++++++++<
+ [
+ >>>+<< bool= 1
+ [>+>[-]<<-] bool= ten==0
+ >[<+>-] ten = tmp
+ >[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
+ <<- dec ten
+ <- dec num
+ ]
+ >>>>[<<<<+>>>>-]<<<< copy div to num
+ >[-]< clear ten
+
+ =======INC1=========
+ <+>
+ ]
+
+ <
+ [
+ =======MOVER=========
+ [>+<-]
+
+ =======ADD48========
+ +++++++[<+++++++>-]<->
+
+ =======PUTC=======
+ <.[-]>
+
+ ======MOVEL2========
+ >[<<+>>-]<
+
+ <-
+ ]
+
+ >++++[<++++++++>-]<.[-]
+
+ ===================================================================
+ =========================== END FOR ===============================
+ ===================================================================
+
+
+ >>>>>>>
+ ]
+ <<<<<<<<
+
+
+
+ >[-]<
+ [-]
+ <<-
+]
+
+======LF========
+
+++++++++++.[-] \ No newline at end of file