Javascript 愚蠢的错误行为

Javascript 愚蠢的错误行为,javascript,interpreter,brainfuck,Javascript,Interpreter,Brainfuck,我有下面的Brainfuck解释器,它通过了一个最小的测试套件。除了一个相当大的问题,比如打印斐波那契序列似乎失败了(套件中的最后一个测试)。我的解释未能执行的愚蠢的斐波那契代码来自。我的电脑怎么了? 这是一把小提琴: 函数(代码,输入){ //为bf存储程序值而初始化为0的“无限”内存堆 设data=newproxy([],{get:(arr,i)=>arr[i]?arr[i]:0}) 设ptr=0; 让inputPtr=0; 设codePtr=0; 让输出=“”; 让loopStack=[

我有下面的Brainfuck解释器,它通过了一个最小的测试套件。除了一个相当大的问题,比如打印斐波那契序列似乎失败了(套件中的最后一个测试)。我的解释未能执行的愚蠢的斐波那契代码来自。我的电脑怎么了? 这是一把小提琴:

函数(代码,输入){
//为bf存储程序值而初始化为0的“无限”内存堆
设data=newproxy([],{get:(arr,i)=>arr[i]?arr[i]:0})
设ptr=0;
让inputPtr=0;
设codePtr=0;
让输出=“”;
让loopStack=[]
常数op={
'+' : () => {
如果(数据[ptr]==255){data[ptr]=0;}
else{data[ptr]++;}
codePtr++;
},
'-' : () => {
如果(数据[ptr]==0){data[ptr]=255;}
else{data[ptr]--;}
codePtr++;
},
'.' : () => { 
输出+=String.fromCharCode(数据[ptr]);
codePtr++;
},
',' : () => {
data[ptr]=input.charCodeAt(inputPtr++);
codePtr++;
},
'>' : () => { 
ptr++;codePtr++;
},
“+++[-]”,“A”)
)相等(
“AAA”
)
})
它('仅解析已知符号',()=>{
期待(
brainLuck(',nothing>++else+[重要!-],'A')
)相等(
“AAA”
)
})
它('处理嵌套循环',()=>{
期待(

以“,,,>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++匹配
]
,可能是第二个、第三个、第四个等。
]
symbol。您需要在扫描时对其进行计数。以下代码段具有执行此操作的
[
的实现,fib测试现在可以工作了:

函数(代码,输入){
//为bf存储程序值而初始化为0的“无限”内存堆
设data=newproxy([],{get:(arr,i)=>arr[i]?arr[i]:0})
设ptr=0;
让inputPtr=0;
设codePtr=0;
让输出=“”;
让loopStack=[]
常数op={
'+' : () => {
如果(数据[ptr]==255){data[ptr]=0;}
else{data[ptr]++;}
codePtr++;
},
'-' : () => {
如果(数据[ptr]==0){data[ptr]=255;}
else{data[ptr]--;}
codePtr++;
},
'.' : () => { 
输出+=String.fromCharCode(数据[ptr]);
codePtr++;
},
',' : () => {
data[ptr]=input.charCodeAt(inputPtr++);
codePtr++;
},
'>' : () => { 
ptr++;codePtr++;
},
“+++[-]”,“A”)
)相等(
“AAA”
)
})
它('仅解析已知符号',()=>{
期待(
brainLuck(',nothing>++else+[重要!-],'A')
)相等(
“AAA”
)
})
它('处理嵌套循环',()=>{
期待(

在“,,>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"?给出意外的结果?其他一些?感谢您的响应,如果您运行我的代码段,您可以看到
错误:预期“:,”等于“1,1,2,3”
。至于使用调试器进行单步调试,我已经尝试过,但bf代码非常混乱。到目前为止,我没有运气。斐波那契bf代码太大了。不幸的是,我只知道它是一个它无法正确执行。您的
]
实现正确吗?我希望看到类似
的东西,如果(data[ptr]!==0){while(code[codePtr]!='[')codePtr--;
(我想可能可以。您使用数组作为堆栈。)那
呢@Sahuagin!谢谢你的两个建议!是的,我认为使用数组作为堆栈很好。我尝试换成循环,结果相同。但奇怪的是,如果我删除非负ptr检查,我会遇到无限循环。我实际上不确定bf中是否允许使用负数据寄存器。我假设不允许。