Code

level = 0;
a = 1;
b = 2;
c = 3;
function test( a, b )
{
	var x;
	x = a + b;
	return x;
}
if( test( "wat", 4 + 5 ) )
{
	level += 1 + 2 * 3;
}
else
{
	level += 1 * 2 + 3;
	{ a += b; }
	b += c;
}

Tokens

ident("level");op("=");number("0");spec(";");ident("a");op("=");number("1");spec(";");ident("b");op("=");number("2");spec(";");ident("c");op("=");number("3");spec(";");ident("function");ident("test");spec("(");ident("a");spec(",");ident("b");spec(")");spec("{");ident("var");ident("x");spec(";");ident("x");op("=");ident("a");op("+");ident("b");spec(";");ident("return");ident("x");spec(";");spec("}");ident("if");spec("(");ident("test");spec("(");string("wat");spec(",");number("4");op("+");number("5");spec(")");spec(")");spec("{");ident("level");op("+=");number("1");op("+");number("2");op("*");number("3");spec(";");spec("}");ident("else");spec("{");ident("level");op("+=");number("1");op("*");number("2");op("+");number("3");spec(";");spec("{");ident("a");op("+=");ident("b");spec(";");spec("}");ident("b");op("+=");ident("c");spec(";");spec("}");

Op-tree

(Array)
--->0=(stdClass){ type="op" op="=" arg1=(stdClass){ type="ident" data="level" } arg2=(Array){ } }
--->1=(Array){ }
--->2=(stdClass){ type="op" op="=" arg1=(stdClass){ type="ident" data="a" } arg2=(stdClass){ type="number" data=1 } }
--->3=(stdClass){ type="op" op="=" arg1=(stdClass){ type="ident" data="b" } arg2=(stdClass){ type="number" data=2 } }
--->4=(stdClass){ type="op" op="=" arg1=(stdClass){ type="ident" data="c" } arg2=(stdClass){ type="number" data=3 } }
--->5=(stdClass)
--->--->type="func"
--->--->name="test"
--->--->args=(Array){ 0=(stdClass){ name="a" ref=0 } 1=(stdClass){ name="b" ref=0 } }
--->--->body=(Array)
--->--->--->0=(stdClass){ type="vardefs" vars=(Array){ 0="x" } }
--->--->--->1=(stdClass)
--->--->--->--->type="op"
--->--->--->--->op="="
--->--->--->--->arg1=(stdClass){ type="ident" data="x" }
--->--->--->--->arg2=(stdClass){ type="op" op="+" arg1=(stdClass){ type="ident" data="a" } arg2=(stdClass){ type="ident" data="b" } }
--->--->--->2=(stdClass){ type="return" value=(stdClass){ type="ident" data="x" } }
--->6=(stdClass)
--->--->type="if"
--->--->test=(stdClass)
--->--->--->type="fcall"
--->--->--->func=(stdClass){ type="ident" data="test" }
--->--->--->args=(Array)
--->--->--->--->0=(stdClass){ type="string" data="wat" }
--->--->--->--->1=(stdClass){ type="op" op="+" arg1=(stdClass){ type="number" data=4 } arg2=(stdClass){ type="number" data=5 } }
--->--->sltrue=(Array)
--->--->--->0=(stdClass)
--->--->--->--->type="op"
--->--->--->--->op="+="
--->--->--->--->arg1=(stdClass){ type="ident" data="level" }
--->--->--->--->arg2=(stdClass)
--->--->--->--->--->type="op"
--->--->--->--->--->op="+"
--->--->--->--->--->arg1=(stdClass){ type="number" data=1 }
--->--->--->--->--->arg2=(stdClass){ type="op" op="*" arg1=(stdClass){ type="number" data=2 } arg2=(stdClass){ type="number" data=3 } }
--->--->slfalse=(Array)
--->--->--->0=(stdClass)
--->--->--->--->type="op"
--->--->--->--->op="+="
--->--->--->--->arg1=(stdClass){ type="ident" data="level" }
--->--->--->--->arg2=(stdClass)
--->--->--->--->--->type="op"
--->--->--->--->--->op="+"
--->--->--->--->--->arg1=(stdClass){ type="op" op="*" arg1=(stdClass){ type="number" data=1 } arg2=(stdClass){ type="number" data=2 } }
--->--->--->--->--->arg2=(stdClass){ type="number" data=3 }
--->--->--->1=(Array){ 0=(stdClass){ type="op" op="+=" arg1=(stdClass){ type="ident" data="a" } arg2=(stdClass){ type="ident" data="b" } } }
--->--->--->2=(stdClass){ type="op" op="+=" arg1=(stdClass){ type="ident" data="b" } arg2=(stdClass){ type="ident" data="c" } }

Opcode compiler / runner

SCE dump before execution:
(stdClass)
--->main=(stdClass)
--->--->args=(Array){ }
--->--->ops=(Array)
--->--->--->0=(stdClass){ type="NOOP" }
--->--->--->1=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="level" } 1="" } }
--->--->--->2=(stdClass){ type="NOOP" }
--->--->--->3=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="a" } 1=(Array){ 0="const" 1=0 } } }
--->--->--->4=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="b" } 1=(Array){ 0="const" 1=1 } } }
--->--->--->5=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="c" } 1=(Array){ 0="const" 1=2 } } }
--->--->--->6=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="test" } 1=(Array){ 0="const" 1=3 } } }
--->--->--->7=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=7 } 1=(Array){ 0="const" 1=5 } 2=(Array){ 0="const" 1=6 } } }
--->--->--->8=(stdClass){ type="CALL" args=(Array){ 0=(Array){ 0="ident" 1="test" } 1=(Array){ 0="const" 1=4 } 2=(Array){ 0="reg" 1=7 } } }
--->--->--->9=(stdClass){ type="CJMP" args=(Array){ 0=(Array){ 0="reg" 1=8 } 1=(Array){ 0="reg" 1=10 } 2=(Array){ 0="reg" 1=14 } } }
--->--->--->10=(stdClass){ type="xMUL" args=(Array){ 0=(Array){ 0="reg" 1=10 } 1=(Array){ 0="const" 1=1 } 2=(Array){ 0="const" 1=2 } } }
--->--->--->11=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=11 } 1=(Array){ 0="const" 1=0 } 2=(Array){ 0="reg" 1=10 } } }
--->--->--->12=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="level" } 1=(Array){ 0="ident" 1="level" } 2=(Array){ 0="reg" 1=11 } } }
--->--->--->13=(stdClass){ type="NOOP" }
--->--->--->14=(stdClass){ type="xMUL" args=(Array){ 0=(Array){ 0="reg" 1=14 } 1=(Array){ 0="const" 1=0 } 2=(Array){ 0="const" 1=1 } } }
--->--->--->15=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=15 } 1=(Array){ 0="reg" 1=14 } 2=(Array){ 0="const" 1=2 } } }
--->--->--->16=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="level" } 1=(Array){ 0="ident" 1="level" } 2=(Array){ 0="reg" 1=15 } } }
--->--->--->17=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="a" } 1=(Array){ 0="ident" 1="a" } 2=(Array){ 0="ident" 1="b" } } }
--->--->--->18=(stdClass){ type="NOOP" }
--->--->--->19=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="b" } 1=(Array){ 0="ident" 1="b" } 2=(Array){ 0="ident" 1="c" } } }
--->--->--->20=(stdClass){ type="NOOP" }
--->--->--->21=(stdClass){ type="NOOP" }
--->--->data=(Array){ }
--->consts=(Array)
--->--->0=1
--->--->1=2
--->--->2=3
--->--->3=(stdClass)
--->--->--->args=(Array){ 0=(stdClass){ name="a" ref=0 } 1=(stdClass){ name="b" ref=0 } }
--->--->--->ops=(Array)
--->--->--->--->0=(stdClass){ type="VDEF" args=(Array){ 0=(Array){ 0="ident" 1="x" } } }
--->--->--->--->1=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=1 } 1=(Array){ 0="ident" 1="a" } 2=(Array){ 0="ident" 1="b" } } }
--->--->--->--->2=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="x" } 1=(Array){ 0="reg" 1=1 } } }
--->--->--->--->3=(stdClass){ type="RETN" args=(Array){ 0=(Array){ 0="ident" 1="x" } } }
--->--->--->--->4=(stdClass){ type="NOOP" }
--->--->--->data=(Array){ }
--->--->4="wat"
--->--->5=4
--->--->6=5
--->frames=(Array){ }
Executing...
EXEC NOOP [0] IN [main]
EXEC MOVE [1] IN [main]
EXEC NOOP [2] IN [main]
EXEC MOVE [3] IN [main]
EXEC MOVE [4] IN [main]
EXEC MOVE [5] IN [main]
EXEC MOVE [6] IN [main]
EXEC xADD [7] IN [main]
EXEC CALL [8] IN [main]
EXEC VDEF [0] IN test
EXEC xADD [1] IN test
EXEC MOVE [2] IN test
EXEC RETN [3] IN test
EXEC CJMP [9] IN [main]
EXEC xMUL [10] IN [main]
EXEC xADD [11] IN [main]
EXEC xADD [12] IN [main]
EXEC NOOP [13] IN [main]
EXEC xMUL [14] IN [main]
EXEC xADD [15] IN [main]
EXEC xADD [16] IN [main]
EXEC xADD [17] IN [main]
EXEC NOOP [18] IN [main]
EXEC xADD [19] IN [main]
EXEC NOOP [20] IN [main]
EXEC NOOP [21] IN [main]
SCE dump after execution:
(stdClass)
--->main=(stdClass)
--->--->args=(Array){ }
--->--->ops=(Array)
--->--->--->0=(stdClass){ type="NOOP" }
--->--->--->1=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="level" } 1="" } }
--->--->--->2=(stdClass){ type="NOOP" }
--->--->--->3=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="a" } 1=(Array){ 0="const" 1=0 } } }
--->--->--->4=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="b" } 1=(Array){ 0="const" 1=1 } } }
--->--->--->5=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="c" } 1=(Array){ 0="const" 1=2 } } }
--->--->--->6=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="test" } 1=(Array){ 0="const" 1=3 } } }
--->--->--->7=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=7 } 1=(Array){ 0="const" 1=5 } 2=(Array){ 0="const" 1=6 } } }
--->--->--->8=(stdClass){ type="CALL" args=(Array){ 0=(Array){ 0="ident" 1="test" } 1=(Array){ 0="const" 1=4 } 2=(Array){ 0="reg" 1=7 } } }
--->--->--->9=(stdClass){ type="CJMP" args=(Array){ 0=(Array){ 0="reg" 1=8 } 1=(Array){ 0="reg" 1=10 } 2=(Array){ 0="reg" 1=14 } } }
--->--->--->10=(stdClass){ type="xMUL" args=(Array){ 0=(Array){ 0="reg" 1=10 } 1=(Array){ 0="const" 1=1 } 2=(Array){ 0="const" 1=2 } } }
--->--->--->11=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=11 } 1=(Array){ 0="const" 1=0 } 2=(Array){ 0="reg" 1=10 } } }
--->--->--->12=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="level" } 1=(Array){ 0="ident" 1="level" } 2=(Array){ 0="reg" 1=11 } } }
--->--->--->13=(stdClass){ type="NOOP" }
--->--->--->14=(stdClass){ type="xMUL" args=(Array){ 0=(Array){ 0="reg" 1=14 } 1=(Array){ 0="const" 1=0 } 2=(Array){ 0="const" 1=1 } } }
--->--->--->15=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=15 } 1=(Array){ 0="reg" 1=14 } 2=(Array){ 0="const" 1=2 } } }
--->--->--->16=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="level" } 1=(Array){ 0="ident" 1="level" } 2=(Array){ 0="reg" 1=15 } } }
--->--->--->17=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="a" } 1=(Array){ 0="ident" 1="a" } 2=(Array){ 0="ident" 1="b" } } }
--->--->--->18=(stdClass){ type="NOOP" }
--->--->--->19=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="ident" 1="b" } 1=(Array){ 0="ident" 1="b" } 2=(Array){ 0="ident" 1="c" } } }
--->--->--->20=(stdClass){ type="NOOP" }
--->--->--->21=(stdClass){ type="NOOP" }
--->--->data=(Array){ 7=9 8=3 10=6 11=7 14=2 15=5 }
--->consts=(Array)
--->--->0=1
--->--->1=2
--->--->2=3
--->--->3=(stdClass)
--->--->--->args=(Array){ 0=(stdClass){ name="a" ref=0 } 1=(stdClass){ name="b" ref=0 } }
--->--->--->ops=(Array)
--->--->--->--->0=(stdClass){ type="VDEF" args=(Array){ 0=(Array){ 0="ident" 1="x" } } }
--->--->--->--->1=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=1 } 1=(Array){ 0="ident" 1="a" } 2=(Array){ 0="ident" 1="b" } } }
--->--->--->--->2=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="x" } 1=(Array){ 0="reg" 1=1 } } }
--->--->--->--->3=(stdClass){ type="RETN" args=(Array){ 0=(Array){ 0="ident" 1="x" } } }
--->--->--->--->4=(stdClass){ type="NOOP" }
--->--->--->data=(Array){ 1=3 }
--->--->4="wat"
--->--->5=4
--->--->6=5
--->frames=(Array)
--->--->0=(stdClass)
--->--->--->name="[main]"
--->--->--->vars=(Array)
--->--->--->--->level=12
--->--->--->--->a=3
--->--->--->--->b=5
--->--->--->--->c=3
--->--->--->--->test=(stdClass)
--->--->--->--->--->args=(Array){ 0=(stdClass){ name="a" ref=0 } 1=(stdClass){ name="b" ref=0 } }
--->--->--->--->--->ops=(Array)
--->--->--->--->--->--->0=(stdClass){ type="VDEF" args=(Array){ 0=(Array){ 0="ident" 1="x" } } }
--->--->--->--->--->--->1=(stdClass){ type="xADD" args=(Array){ 0=(Array){ 0="reg" 1=1 } 1=(Array){ 0="ident" 1="a" } 2=(Array){ 0="ident" 1="b" } } }
--->--->--->--->--->--->2=(stdClass){ type="MOVE" args=(Array){ 0=(Array){ 0="ident" 1="x" } 1=(Array){ 0="reg" 1=1 } } }
--->--->--->--->--->--->3=(stdClass){ type="RETN" args=(Array){ 0=(Array){ 0="ident" 1="x" } } }
--->--->--->--->--->--->4=(stdClass){ type="NOOP" }
--->--->--->--->--->data=(Array){ 1=3 }