mirror of
https://github.com/ValKmjolnir/Nasal-Interpreter.git
synced 2026-07-23 11:28:45 +08:00
update test file
This commit is contained in:
+53
-56
@@ -147,96 +147,93 @@ var mandelbrot=
|
||||
+[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<
|
||||
<<<<<]]>>>]";
|
||||
|
||||
var paper=[];
|
||||
var (ptr,pc)=(0,0);
|
||||
var (code,inum,stack)=(nil,nil,nil);
|
||||
var (add,mov,jt,jf,in,out)=(0,1,2,3,4,5);
|
||||
var func_table=[
|
||||
func(){paper[ptr]+=inum[pc];return;},
|
||||
func(){ptr+=inum[pc];return;},
|
||||
func(){if(paper[ptr])pc=inum[pc];return;},
|
||||
func(){if(!paper[ptr])pc=inum[pc];return;},
|
||||
func(){paper[ptr]=input()[0];return;},
|
||||
func(){print(chr(paper[ptr]));return;}
|
||||
];
|
||||
|
||||
var bf=func(program)
|
||||
{
|
||||
var paper=[];
|
||||
setsize(paper,131072);
|
||||
var ptr=0;
|
||||
var s=program;
|
||||
var len=size(s);
|
||||
var code=[];
|
||||
var stack=[];
|
||||
(ptr,code,inum,stack)=(0,[],[],[]);
|
||||
var len=size(program);
|
||||
|
||||
var (add,mov,jt,jf,in,out)=(1,2,3,4,5,6);
|
||||
for(var i=0;i<len;i+=1)
|
||||
{
|
||||
if(chr(s[i])=='+' or chr(s[i])=='-')
|
||||
var c=chr(program[i]);
|
||||
if(c=='+' or c=='-')
|
||||
{
|
||||
append(code,[add,0]);
|
||||
while(i<len)
|
||||
append(code,add);
|
||||
append(inum,0);
|
||||
for(;i<len;i+=1)
|
||||
{
|
||||
if(chr(s[i])=='+')
|
||||
code[-1][1]+=1;
|
||||
elsif(chr(s[i])=='-')
|
||||
code[-1][1]-=1;
|
||||
if(chr(program[i])=='+')
|
||||
inum[-1]+=1;
|
||||
elsif(chr(program[i])=='-')
|
||||
inum[-1]-=1;
|
||||
else
|
||||
{
|
||||
i-=1;
|
||||
break;
|
||||
}
|
||||
i+=1;
|
||||
}
|
||||
}
|
||||
elsif(chr(s[i])=='<' or chr(s[i])=='>')
|
||||
elsif(c=='<' or c=='>')
|
||||
{
|
||||
append(code,[mov,0]);
|
||||
while(i<len)
|
||||
append(code,mov);
|
||||
append(inum,0);
|
||||
for(;i<len;i+=1)
|
||||
{
|
||||
if(chr(s[i])=='>')
|
||||
code[-1][1]+=1;
|
||||
elsif(chr(s[i])=='<')
|
||||
code[-1][1]-=1;
|
||||
if(chr(program[i])=='>')
|
||||
inum[-1]+=1;
|
||||
elsif(chr(program[i])=='<')
|
||||
inum[-1]-=1;
|
||||
else
|
||||
{
|
||||
i-=1;
|
||||
break;
|
||||
}
|
||||
i+=1;
|
||||
}
|
||||
}
|
||||
elsif(chr(s[i])==',')
|
||||
append(code,[in,0]);
|
||||
elsif(chr(s[i])=='.')
|
||||
append(code,[out,0]);
|
||||
elsif(chr(s[i])=='[')
|
||||
elsif(c==',')
|
||||
{
|
||||
append(code,[jf,0]);
|
||||
append(code,in);
|
||||
append(inum,0);
|
||||
}
|
||||
elsif(c=='.')
|
||||
{
|
||||
append(code,out);
|
||||
append(inum,0);
|
||||
}
|
||||
elsif(c=='[')
|
||||
{
|
||||
append(code,jf);
|
||||
append(inum,0);
|
||||
append(stack,size(code)-1);
|
||||
}
|
||||
elsif(chr(s[i])==']')
|
||||
elsif(c==']')
|
||||
{
|
||||
if(!size(stack))
|
||||
{
|
||||
println("lack [");
|
||||
return;
|
||||
}
|
||||
die("lack [");
|
||||
var label=pop(stack);
|
||||
append(code,[jt,label-1]);
|
||||
code[label][1]=size(code)-2;
|
||||
append(code,jt);
|
||||
append(inum,label-1);
|
||||
inum[label]=size(code)-2;
|
||||
}
|
||||
}
|
||||
if(size(stack))
|
||||
{
|
||||
println("lack ]");
|
||||
return;
|
||||
}
|
||||
|
||||
die("lack ]");
|
||||
len=size(code);
|
||||
for(var i=0;i<len;i+=1)
|
||||
{
|
||||
if(code[i][0]==add)
|
||||
paper[ptr]+=code[i][1];
|
||||
elsif(code[i][0]==mov)
|
||||
ptr+=code[i][1];
|
||||
elsif(code[i][0]==jt and paper[ptr])
|
||||
i=code[i][1];
|
||||
elsif(code[i][0]==jf and !paper[ptr])
|
||||
i=code[i][1];
|
||||
elsif(code[i][0]==out)
|
||||
print(chr(paper[ptr]));
|
||||
elsif(code[i][0]==in)
|
||||
paper[ptr]=input()[0];
|
||||
}
|
||||
for(pc=0;pc<len;pc+=1)
|
||||
func_table[code[pc]]();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user