2 releases
0.2.1 | Apr 2, 2020 |
---|---|
0.2.0 | Dec 27, 2015 |
#825 in Programming languages
Used in hohoho
750KB
817 lines
brainfuck
A simple brainfuck interpreter in Rust.
Usage
This project follows a very standard Rust setup.
cargo run # Runs the executable.
cargo test # Runs the tests.
lib.rs
:
Simple brainfuck interpreter in Rust.
The brainfuck language was created with the purpose of being a
very minimal language which is very easy to write an interpreter
for. This is one such interpreter. For more information on the
brainfuck language start with the documentation of each
instruction in the language, or
some material online. Brainfuck itself is syntactically
challenging for humans, but is really not all that complicated. +.
for example increments the value in the first cell and outputs that
value. The instructions that trip people up the most are the control
flow contructs [
and ]
. +++>,<[>+.<-]
for example prints the 3
values after the input value. For more about control flow in brainfuck
read the section on control flow.
Examples
Basic usage.
use brainfuck;
// Evaluate a simple brainfuck program from a string.
brainfuck::eval_string("+>.");
// Evaluate a brainfuck program from a file.
brainfuck::eval_file("fixtures/helloworld.rs");
Advanced usage, with specified tape type.
use std::io;
use brainfuck::Interpreter;
use brainfuck::program::Program;
use brainfuck::tape::ArrayTape;
let mut stdin = io::stdin();
let mut stdout = io::stdout();
let program = Program::parse("++>+.").unwrap();
let mut interp = Interpreter::<ArrayTape>::new(program, &mut stdin, &mut stdout);
Semantics and Portability
The brainfuck language has a few areas that are undefined behavior. All of the undefined behaviors in brainfuck are listed below:
- The tape's length.
- Moving the tape's pointer above or below the range of the tape.
- The type of the values of the tape.
- Incrementing or decrementing the value out of range.
- Attempting to read input when there is no more input.
- Programs containing unmatching brackets.
For 1-4 see the tape's documentation. New tape's can be created to give arbitrary semantics for these points. For 5 and 6, attempts to read when there are no more input values are ignored. Programs with unmatched brackets are invalid.
Dependencies
~4MB
~85K SLoC