2 releases

0.2.1 Apr 2, 2020
0.2.0 Dec 27, 2015

#651 in Programming languages

42 downloads per month
Used in hohoho

MIT license

750KB
817 lines

brainfuck

Build Status

A simple brainfuck interpreter in Rust.

Documentation

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:

  1. The tape's length.
  2. Moving the tape's pointer above or below the range of the tape.
  3. The type of the values of the tape.
  4. Incrementing or decrementing the value out of range.
  5. Attempting to read input when there is no more input.
  6. 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
~83K SLoC