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;
        }
       ...