08/08/12 12:12:24 g8zRwFNG
>>442
何がわからないのかがよくわからない。
IF expr THEN stmt1 ELSE stmt2 ENDIF
みたいなものを、このゲームでは以下のように書くわけだよな。
IF expr DIV1 stmt1 DIV2 stmt2 DIV-1
DIVは意味的にはGOTOラベル。DIV2がELSEでDIV-1はENDIF。
1)IF exprを評価したときに、分岐先のラベルをセットする。
2)非ゼロのラベルがセットされていれば、そのラベルまでGOTO。
ジャンプ先が-1でなければ、ラベルを0に書き換えてブロック処理中である
ことを示す。-1なら、ENDIFなので分岐終了。
3)ラベルが0の間、ブロックの中を普通に一文ずつ処理する
4)次のラベルに出会ったら、ラベルを-1に書き換える。状態2)へ飛ぶ。
状態3)で別のIFが来ることもあって、これが入れ子だ。
それに対応するために、1)では分岐先ラベルをスタックにプッシュして、
分岐が終わったらスタックからポップするようにしている。
スタックを利用することで、入れ子の一番内側(現在処理中のIF)に関する
情報が、常にスタックトップに積まれていることになるので、常に
スタックトップを見ていればいい。
外側のIFの情報は、スタックトップより下に保存されており、内側のIFの
処理が終わってスタックからポップされたら、自然にトップに戻る、という
仕組みだ。
スタックという言葉を聞いたことが無いのなら、一番基本的で有用な
抽象データ型なので、ぐぐれ。