Skip to content

Instantly share code, notes, and snippets.

@vkobel
Last active August 29, 2015 14:07
Show Gist options
  • Save vkobel/ef15e2b969725d0f7edb to your computer and use it in GitHub Desktop.
Save vkobel/ef15e2b969725d0f7edb to your computer and use it in GitHub Desktop.
Brainfuck interpreter [Work in progress]
function brainLuck(code, input){
function matchingBracket(code, instPtr){
var count = 1;
while(count > 0){
var c = code[++instPtr];
if(c === '[') count++;
else if(c === ']') count--;
}
return instPtr;
}
function memMgmt(mem, memPtr, nb){
var base = mem[memPtr];
if(base === undefined)
base = 0;
var temp = base + nb;
if(temp > 255) return (temp % 255) - 1;
else if(temp < 0) return 256 + temp;
else return temp;
}
var starts = [];
function startCond(mem, memPtr, instPtr){
if(mem[memPtr] === 0){
return matchingBracket(code, instPtr);
}else{
starts.push(instPtr);
return instPtr;
}
}
function endCond(mem, memPtr, instPtr){
if(mem[memPtr] !== 0){
return starts[starts.length - 1];
}else{
starts.pop();
return instPtr;
}
}
var mem = [];
var memPtr = 0;
var inputPtr = 0;
var ret = [];
for(var i=0; i < code.length; i++){
var cmd = code[i];
switch(cmd){
case ">":
memPtr++;
break;
case "<":
memPtr--;
break;
case "+":
mem[memPtr] = memMgmt(mem, memPtr, 1);
break;
case "-":
mem[memPtr] = memMgmt(mem, memPtr, -1);
break;
case ".":
ret.push(String.fromCharCode(mem[memPtr]));
break;
case ",":
mem[memPtr] = input[inputPtr++].charCodeAt(0);
break;
case "[":
i = startCond(mem, memPtr, i);
break;
case "]":
i = endCond(mem, memPtr, i);
break;
}
}
return ret.join("");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment