diff options
| Commit | 8e84b639815b291d4c4e4041e4c5611202e012c1 (patch) | |
|---|---|---|
| Author | 2018-11-28 12:43:19 +0200 | |
| Committer | 2018-11-28 12:43:19 +0200 | |
| Files | c4ab2a5bc325eabe1e70214e3966c0c6802852ef | |
| IPL-8e84b639815b291d4c4e4041e4c5611202e012c1.tar IPL-8e84b639815b291d4c4e4041e4c5611202e012c1.tar.gz IPL-8e84b639815b291d4c4e4041e4c5611202e012c1.zip | ||
| Parent | b98a9799f15c8ad0275175a1d8d013c4f6e0176f (diff) | |
Add brainf interpreter (#58)
6 files changed, 328 insertions, 0 deletions
| -rw-r--r-- | homework/81270/.gitignore | 2 | ||||
| -rw-r--r-- | homework/81270/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | homework/81270/brainf-interpret/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | homework/81270/brainf-interpret/Interpreter.cpp | 90 | ||||
| -rw-r--r-- | homework/81270/brainf-interpret/hello.b | 3 | ||||
| -rw-r--r-- | homework/81270/brainf-interpret/primes.b | 221 |
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 |
