制御構造で悩む

1行入力、中間コードへの変換などの記述は手探りだった。リスト保存が完成したあたりからデバッグ用にコマンドラインバッファやリストの内容を16進数で表示する関数を作り、1行入力するたびに表示して確認した。式の構文解析は、デバッグ用に式を計算する関数を作って動作確認した。PRINTを完成させたあたりからやや見通しがよくなって、デバッグ用の関数を外すことができた。PRINTを使いながらLETやLETを省略する代入文を完成させた。

次の大きな課題が制御構造で、GOSUB~RETURNやFOT~NEXがヤマになると思う。とりあえず行番号順に実行するRUNがうまく動いた。引き続き単純な分岐GOTOを作ろうとしたところ、これがなかなか難しい。現状、ローカルで保持している行ポインタ(実行中の行の先頭を指すポインタ)をグローバルに変更するよりしかたがない。ここまでローカルのまま何とか頑張ってきたが、その工夫が無駄になるばかりか、グローバルならではの合理的な記述へまた工夫を重ねなければならない。

行ポインタは制御構造のほかリスト保存とリスト表示でも使う。制御構造はリスト保存と同時に実行しないから競合しないが、もしプログラムにLISTを記述していいとすればリスト表示と競合する。いままで、うまくすればLIST、NEW、RUNをプログラムに記述できるかもしれないと思っていたが、それは明確に禁止しなければならない。これでパロアルト版や東大版と文法が一致することになる。プログラムの実行中にRUNを実行する必要はないだろうし、リスト表示するというのも現実的でないし、NEWを実行したら大事になるのでそこれはそれでいいのだと思う。

行ポインタをグローバルにしたことで、もし1行に1ステートメントだけなら制御構造を比較的簡単に完成できる。しかし、タイニーBASICの仕様は「;」で区切って複数のステートメントを羅列できるようになっている。だから、GOSUBは行番号と行内の位置をスタックに置いて分岐する。その関係で、行末を表す中間コードI_EOLを追加した。いままで行末の記号は0xffだったが、これはエラーを表す値と一致して区別が付かない。行末は、ほかの中間コードと一致しなければどんな値でもいいので(何か見落としがない限り)、未使用の最後の値を割り当てることにする。

広告
カテゴリー: TinyBASIC パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中