命令ポインタi
とptr
データポインタも同様です。私はこれを正しくしようとしています:
[ - データ ポインターのバイトがゼロの場合、命令ポインターを次のコマンドに進める代わりに、一致する ] コマンドの後のコマンドにジャンプします。
] - データ ポインターのバイトがゼロ以外の場合、命令ポインターを次のコマンドに移動する代わりに、一致する [ コマンドの後のコマンドにジャンプして戻します。
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
s です。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;
}
}
}