Skip to content

Instantly share code, notes, and snippets.

@ccbikai
Created December 4, 2014 06:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ccbikai/772f3d6faff3dce58bad to your computer and use it in GitHub Desktop.
Save ccbikai/772f3d6faff3dce58bad to your computer and use it in GitHub Desktop.
BrainFuck 解释器
function getMatchingBra(code) {
var stack = [];
var bra = [];
for(var i = 0; i < code.length; i++) bra.push(-1);
for(var i = 0; i < code.length; i++) {
if(code[i] === '[') {
stack.push(i);
} else if(code[i] === ']') {
bra[i] = stack.pop();
bra[bra[i]] = i;
}
}
return bra;
}
function brainFuck(code, input) {
var inputPos = 0;
var commandPos = 0;
var pointerPos = 0;
var bytes = [ 0 ];
var output = "";
var matching = getMatchingBra(code);
while(commandPos < code.length) {
switch(code[commandPos]) {
case '>': {
pointerPos++;
if(undefined === bytes[pointerPos]) {
bytes.push(0);
}
break;
}
case '<': {
pointerPos--;
if(0 > pointerPos) {
bytes.unshift(0);
pointerPos = 0;
}
break;
}
case '+': {
bytes[pointerPos] = (bytes[pointerPos] + 1) % 256;
break;
}
case '-': {
bytes[pointerPos]--;
if(bytes[pointerPos] < 0) bytes[pointerPos] = 0;
break;
}
case '.': {
output += String.fromCharCode(bytes[pointerPos]);
break;
}
case ',': {
var temp = input.charCodeAt(inputPos++);
bytes[pointerPos] = temp;
break;
}
case '[': {
if(!bytes[pointerPos]) {
commandPos = matching[commandPos];
}
break;
}
case ']': {
if(bytes[pointerPos]) {
commandPos = matching[commandPos];
}
break;
}
}
commandPos++;
}
return output;
}
var out = brainFuck('+++++++[>+++++[>++>+<<-]>>>+>++>++<<<<<<-]>>+++.[->+<]>.+++.[->+<]>.>[-<->]<---.>>[-<<->>]<<--.');
console.log(out);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment