4

私は頭脳明晰アイデアのアルファ版を書きました。私は自分のインタープリターを書きましたが、「IT の方法」でそれを理解するのに本当に苦労したため、コードのループに関して先生から多大な助けを受けました。今、私のレポートのために、インタープリターのアルゴリズムの状態チャートが必要です。彼は各文字をどのように処理しますか。

私は次の図を思いつきました.欠けているのは、インタープリターがループを処理する方法だけです. 先生がほぼ一人で書いたコードを見たのですが、よくわかりません。ここで正しい方向に向けていただければ幸いです。コードで [ または ] が検出されたときに何が行われるかについて、いくつかのサイドノートだけで完成した回答は必要ありません。

ここに画像の説明を入力

codeZeiger = codePointer (コード内を移動するポインター)
memoryZeiger = memoryPointer (メモリースタック内を移動するポインター)
memory = メモリースタック
code = 文字列としてのコード oject
i = interpre() メソッドのカウンター (単一の文字)文字列から読み取られ、switch ステートメントを介して解析されます。そのステートチャートは以下に表示されます)

ここに画像の説明を入力

4

2 に答える 2

4

ループのメカニズムを理解しようとする必要があります。Brainfuck では、ループは と で囲まれてい[ます]。つまり、特定の条件が満たされると、括弧内のコードが実行され、最初からやり直されます。例えば:

1: [
2:   cmd1
3:   cmd2
4: ]
5: cmd3

行 1 は、が 0 に等しいかどうかをチェックしますmemory[memoryZeiger]。等しい場合は、行 5 にジャンプします。そうでない場合は、cmd1、cmd2 などを行 4 まで実行します。インタープリターが行 4 にある場合、自動的に行 1 にジャンプします (または、条件をチェックしてさらに 1 ステップ進むこともできますが、単純にして line1 にジャンプすると仮定します)。その後、プロセス全体が再び開始されます。

状態図についての質問に答えます。次のようなものが必要です。

     _____________________________
    |   code[codeZeiger] == '['   |
     -----------------------------
            /                  \
           /                    \
memory[memoryZeiger] == 0       memory[memoryZeiger] != 0
          |                               |
   "go to matching ']'"               codeZeiger++

の他のケースは]同等である必要があります。

ところで、「一致する]」は重要です。これらの括弧は入れ子にすることができます!

于 2012-12-18T10:40:13.553 に答える
3

1)コンパイラには状態がないため(メモリ、メモリポインター、コードポインター、および一致するブラケットを見つけるための2つだけ)、ステートチャートは必要ありません-ウィキペディアのような単純なテーブル(変数名のようなドイツ語)は足ります

2)ステートチャートに固執する場合は、条件(のようなcode[codeZeiger]=='+')を状態に入れず、遷移に入れます

3)代わりiに変更する必要がありますcodeZeiger

4) Brainfuck を解釈するコードは非常に単純であるべきです。理解できない場合は、たとえばウィキペディアのページを読んで、そこにあるプログラムをソフトウェアなしで解釈してみてください。紙の上で走らせてください:)

于 2012-12-18T11:10:22.797 に答える