Created
December 12, 2013 22:26
-
-
Save edalorzo/7936667 to your computer and use it in GitHub Desktop.
Branfuck Interpreter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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