機能拡張のおおまかな話

豊四季タイニーBASICの機能拡張の方法はいずれきちんとまとめるつもりだが、せっかく公表しておかげさまで多くのアクセスをいただいている状況で、あまり時間をかけてあきらめたり見切りを付けたりする人がでると意義が霞むから、とりあえず大筋を述べておく。あまり親切でない説明になり、ある程度の技術がないと意味不明だと思うが、何もいわないのに比べたら多少の手掛かりにはなると思う。そして、そんな説明でも理解できた誰かが機能拡張版を公開してくれたら、それが見本になって理解が広がり、あとに続く人が現れるのではないかと期待している。

1.キーワードを決める
機能拡張する場合、まずコマンド、ステートメント、関数のいずれかにあたるキーワードを決める。引数は式(変数、関数、数値の単体およびこれらと演算子、括弧の組み合わせ)、文字列、キーワードのどれかであれば、既存の機能で処理できる。一般に、出力制御(LEDの点灯など)はステートメント、入力(スイッチの状態の読み取りなど)は関数、プログラムそのものを処理の対象とするもの(保存や読み込み)はコマンドとする。以降、ttbasic.xへ次に述べるとおり記述を追加する。

2.キーワードに中間コードを割り当てる
豊四季タイニーBASICは中間コード方式をとっている。キーワードに中間コードを割り当てる方法は、文字列の配列const char* kwtbl[]にキーワードを追加し、すぐあとのenumリストに、文字列の配列と同じ順序で中間コードのシンボルを追加する。キーワードの中間コードが数値でいくつかということは機能に影響しない。だから、原則、どの位置に追加してもいいが、位置によってリストの表示の体裁(空白の入れ方)がかわるので、すぐあとのマクロIS_OP(関数に適す)、IS_SEP(区切り文字に適す)、IS_TOKSP(トークンに適す)を考慮するといい。この段階で、プログラムに書いてリストを表示できる。

3.中間コードに対応する機能を作る
拡張機能がステートメントなら関数iexe、関数なら関数ivalue、コマンドなら関数icomのswitch文にcaseで中間コードのシンボルを追加し、機能を記述する(このとき必要に応じて独自の関数を追加し、呼び出す形をとる)。処理を始める時点で、unsigned char* cipが中間コードを指している。中間コードを解釈したら、cipは次の中間コードを指すように進めなければならない。具体的な記述の方法は、前後の記述が参考になると思う。

4.引数の判別と取得の方法
文字列は 中間コードI_STRのあと文字数を表す1バイトの値があってASCIIの羅列となっている。数値は中間コードI_NUMのあと2バイトのバイナリ。変数は中間コード I_VARのあと1バイトのインデクスで、インデクスはA~Zに相当する符号付整数の配列short var[26]の添え字になる。ただし、数値や変数は式として取得したほうが話が早いと思う。純粋な式の値は関数iexpが返し、これは中間コードポインタcipを自動的に進める。関数の引数に記述された式の値(括弧に囲まれた式の値)は関数getparamが返し、同じく中間コードポインタを進める。

BASIC言語の文法は、個人的には、ハードウェアに依存しないことが理想だと思う。たとえば、ポートの初期化と入出力ができるキーワードを追加すればLEDの点灯だろうとスイッチの読み取りだろうと何でもできるが、それではC言語とあまり違わない。BASIC言語の利点を生かすにはLEDを点灯するステートメントとスイッチを読み取る関数を作るほうがいい。つまり、C言語を知っている人が装置ごとに面倒くさい機能拡張の仕事をやって、BASIC言語しか使えない人をラクにしてあげる。その結果、誰にでも使える装置が出来上がり、マイコンに関心を持つ人が増えて、この世界が活性化すると思う。ただの夢だけど。

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

コメントを残す