ilasmでstack machine その5


概要

ilasmでstack machineやってみた。
俺言語をjavascriptで、実装してみた。

サンプルコード

var out = document.getElementById("out");
var src = document.getElementById("src"); 

function run() {
  var str = src.value;
  str = str.replace(/\t/g, " ");
  str = str.replace(/  /g, " ");
  str = str.replace(/  /g, " ");
  str = str.replace(/  /g, " ");
  var codes = str.split("\n");  
  var pc = 0;  
  var sp = 0;
  var len = codes.length;
  var i;
  var label = {};
  var val = {};
  var ram = [];
  var res = "";
  for (i = 0; i < len; i++)
  {
    if (codes[i].indexOf(":") > -1) 
    {
      label[codes[i]] = i;
    }
  }
  while (i > 0)
  {
    var code = codes[pc].split(" ");
    switch (code[1])
    {
    case "pushi":  
      ram[sp] = code[2];
      sp++;
      pc++;
    break; 
    case "push":  
      ram[sp] = code[2];
      sp++;
      pc++;
    break;
    case "set":  
      sp--;
      val[code[2]] = ram[sp];
      pc++;
    break;
    case "get":  
      ram[sp] = val[code[2]]; 
      sp++;
      pc++;
    break; 
    case "call":
      sp--;
      if (code[2] == "printi")
      {
        res += ram[sp] + " ";
      }
      if (code[2] == "prints")
      {
        res += ram[sp].replace(/\"/g," ");
      }
      pc++;
    break;
    case "if": 
      sp--;
      if (ram[sp] == 0)
      {
        pc = label[code[2] + ":"];
      }
      else
      {
        pc++;
      }
    break;
    case "if<":
      sp--;
      if (ram[sp] < ram[sp - 1])
      {
        pc = label[code[2] + ":"];
      }
      else
      {
        pc++;
      }
    break; 
    case "%":  
      sp--;
      ram[sp - 1] = parseInt(ram[sp - 1]) % parseInt(ram[sp]);
      pc++;
    break;
    case "+":  
      sp--;
      ram[sp - 1] = parseInt(ram[sp - 1]) + parseInt(ram[sp]);
      pc++;
    break;
    case "jp": 
      pc = label[code[2] + ":"];
    break;
    case "ret":  
      i = 0;
    break;
    default:
      pc++;
    break;
    }
  }
  alert("ok");
  out.value = res;
}


成果物

以上。