78 lines
2.0 KiB
Plaintext
78 lines
2.0 KiB
Plaintext
/*
|
|
* javascript bf interpreter
|
|
* by wenxichang@163.com
|
|
*/
|
|
|
|
function execute(code)
|
|
{
|
|
var mem = new Array(30000);
|
|
var sp = 10000;
|
|
var opcode = new String(code);
|
|
var oplen = opcode.length;
|
|
var ip = 0;
|
|
var loopstack = new Array();
|
|
var output = "";
|
|
|
|
for (var i = 0; i < 30000; ++i) mem[i] = 0;
|
|
|
|
while (ip < oplen) {
|
|
switch(opcode[ip]) {
|
|
case '+':
|
|
mem[sp]++;
|
|
break;
|
|
case '-':
|
|
mem[sp]--;
|
|
break;
|
|
case '>':
|
|
sp++;
|
|
break;
|
|
case '<':
|
|
sp--;
|
|
break;
|
|
case '.':
|
|
if (mem[sp] != 10 && mem[sp] != 13) {
|
|
output = output + Util.fromCharCode(mem[sp]);
|
|
} else {
|
|
puts(output);
|
|
output = "";
|
|
}
|
|
break;
|
|
case ',':
|
|
var s = console.input();
|
|
if (!s) exit(0);
|
|
|
|
mem[sp] = s.charCodeAt(0);
|
|
break;
|
|
case '[':
|
|
if (mem[sp]) {
|
|
loopstack.push(ip);
|
|
} else {
|
|
for (var k = ip, j = 0; k < oplen; k++) {
|
|
opcode[k] == '[' && j++;
|
|
opcode[k] == ']' && j--;
|
|
if (j == 0) break;
|
|
}
|
|
if (j == 0) ip = k;
|
|
else {
|
|
puts("Unmatched loop");
|
|
return false;
|
|
}
|
|
}
|
|
break;
|
|
case ']':
|
|
ip = loopstack.pop() - 1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
ip++;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
if (Interp.conf('unitTest') > 0) execute('
|
|
++++++++++[>+>+++>++++>+++++++ >++++++++>+++++++++>++++++++++>+++++++++
|
|
++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<+
|
|
+.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---.
|
|
');
|