2

命令ポインタiptrデータポインタも同様です。私はこれを正しくしようとしています:

[ - データ ポインターのバイトがゼロの場合、命令ポインターを次のコマンドに進める代わりに、一致する ] コマンドの後のコマンドにジャンプします。

] - データ ポインターのバイトがゼロ以外の場合、命令ポインターを次のコマンドに移動する代わりに、一致する [ コマンドの後のコマンドにジャンプして戻します。

 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 の例を試すと、間違った出力が生成され、どこか[]めちゃくちゃになります。

ループを修正する方法について何か提案はありますか?

編集

これは、提案されたネスト ハンドラーを使用して変更されたifs です。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;
                }
            }
        }
4

1 に答える 1

2

とのネストを適切に処理する必要があり[ます]count私は変数を持つことでこれを行います。たとえば、 a に遭遇し[、一致する を見つける必要がある場合は、1]に初期化countして文字を調べます。に遭遇したら[、それをインクリメントします。で]、デクリメントします。ゼロにcountヒットすると、一致するブラケットが見つかりました。

于 2015-01-04T00:40:54.890 に答える