minskyfsck
by otesunki
JavaScript
const output = v => console.log(String.fromCodePoint(v));
const input = () => window.prompt().codePointAt(0);
function parse(code) {
let r1 = 0;
let r2 = 0;
let branching = false;
code = code.replace(/[^+\-><?:\(\)]/g, '');
parser: for (let i = 0; i < code.length; i++) {
// console.log(r1, r2, branching, code[i]);
switch (code[i]) {
case '+':
if (code[i+1] == '+') {
r2++;
i++;
} else {
r1++;
}
branching = false;
break;
case '>':
if (code[i+1] == '>') {
output(r2);
i++;
} else {
output(r1);
}
branching = false;
break;
case '<':
if (code[i+1] == '<') {
r2 = input();
i++;
} else {
r1 = input();
}
branching = false;
break;
case '-':
if (code[i+1] == '-') {
if (r2 == 0) {
branching = false;
} else {
r2--;
branching = true;
}
i++;
} else {
if (r1 == 0)
branching = false;
else {
r1--;
branching = true;
}
}
break;
case '?':
if (branching) {
let nestedness = 1;
while (nestedness > 0)
switch (code[++i]) {
case '?':
nestedness++;
break;
case ':':
nestedness--;
break;
default:
}
branching = false;
}
break;
case ':':
break parser;
case '(':
branching = false;
break;
case ')':
if (branching) {
let nestedness = 1;
while (nestedness > 0)
switch (code[--i]) {
case ')':
nestedness++;
break;
case '(':
nestedness--;
break;
default:
}
branching = false;
}
...