所以i
是指令指针,而ptr
是数据指针。
我正在努力做到这一点:
[-如果数据指针处的字节为零,则不要将指令指针向前移动到下一个命令,而是在匹配的命令之后将其向前跳转到该命令。
]-如果数据指针处的字节为非零,则不要将指令指针向前移动到下一个命令,而是将其匹配到[command之后]跳回该命令。
var memory = new Array();
for ( var ptr = 0; ptr < 1000; ptr++ )
memory[ptr] = 0;
var ptr = 0;
var src = document.getElementById("source").value;
for ( var i = 0; i < src.length; i++ )
{
// other code
if ( src[i] == "[" )
if ( memory[ptr] == 0 )
{
for ( var j = i; j < src.length; j++ )
if ( src[j] == "]" )
{
i = j;
break;
}
continue; // so we don't enter the next if
}
if ( src[i] == "]" )
if ( memory[ptr] != 0 )
for ( var k = i; k > 0; k-- )
if ( src[k] == "[" )
{
i = k;
break;
}
}
一切正常,但是尝试使用“ Hello World”循环示例会产生错误的输出,将
[
和]
弄乱了。关于如何修复循环的任何建议?
编辑
这是带有建议的嵌套处理程序的修改后的
if
,它现在可以正确执行Hello World示例。 if ( src[i] == "[" )
if ( memory[ptr] == 0 )
{
var count = 1;
for ( var j = i + 1; j < src.length; j++ )
{
if ( src[j] == "[" )
count++;
if ( src[j] == "]" )
count--;
if ( count == 0 )
{
i = j;
break;
}
}
continue;
}
if ( src[i] == "]" )
if ( memory[ptr] != 0 )
{
var count = 1;
for ( var k = i - 1; k > 0; k-- )
{
if ( src[k] == "]" )
count++;
if ( src[k] == "[" )
count--;
if ( count == 0 )
{
i = k;
break;
}
}
}
最佳答案
您需要正确处理[
和]
的嵌套。我可以通过使用count
变量来实现。例如,当您遇到[
并需要找到匹配的]
时,请将count
初始化为1并检查字符。当遇到[
时,将其递增;在]
上递减。当count
达到零时,您已找到匹配的括号。
关于javascript - 使用JavaScript实现Brainf * ck循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27761146/