Skip to content

Instantly share code, notes, and snippets.

@edalorzo
Created December 12, 2013 22:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edalorzo/7936667 to your computer and use it in GitHub Desktop.
Save edalorzo/7936667 to your computer and use it in GitHub Desktop.
Branfuck Interpreter
function brainfuck(code,input){
var pc = 0;
var sysout = [];
var sysin = input.split('').reverse();
var ptr = 0;
var data = [0];
var size = code.length;
var program = code.split('')
var loops = [];
function interpret(){
while(pc < code.length){
var opcode = program[pc];
switch(opcode){
case '<': left(); break;
case '>': right(); break;
case '+': inc(); break;
case '-': dec(); break;
case '.': write(); break;
case ',': read(); break;
case '[': loop(); break;
case ']': check(); break;
default: pc++;
}
}
return sysout.join('');
}
function inc(){ data[ptr] = (data[ptr]+1) % 256; pc++; }
function dec(){ data[ptr] = data[ptr]-1 >= 0 ? data[ptr]-1 : 255; pc++; }
function write(){ sysout.push(String.fromCharCode(data[ptr])); pc++; }
function read(){ data[ptr] = (sysin.pop() || '\u0000').charCodeAt(0) ; pc++; }
function isfalse(){ return data[ptr] === 0; }
function istrue(){ return !isfalse(); }
function left(){ ptr = (ptr-1 >= 0) ? ptr-1 : 0; pc++; }
function right(){
if(++ptr >= data.length){
data.push(0);
}
pc++;
}
function loop(){ istrue() ? loops.push(++pc) : skip(); }
function skip(){
var pending = 1;
pc++;
while(pc < code.length && pending > 0){
if(program[pc] == '['){
pending++;
} else if(program[pc] == ']'){
pending--;
}
pc++;
}
}
function check(){
if(istrue()){
pc = loops.pop();
loops.push(pc);
} else {
loops.pop();
pc++;
}
}
return interpret();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment