ilasmでstack machine その5
2330 ワード
概要
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;
}
成果物
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;
}
以上。
Author And Source
この問題について(ilasmでstack machine その5), 我々は、より多くの情報をここで見つけました https://qiita.com/ohisama@github/items/4682cf2df8dc7910bbe9著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .