INPUT文の実装について。
10 INPUT A
みたいなINPUT (変数)という構文を実装する。
入力を促すためのプロンプト表示として”?”を出力する。
これは前回のPRINTと同様にコード出力すればよい。
そのあとは、C言語のgets関数をcall命令で呼び出して、文字列を入力し、atoi関数で整数に変換する。
セキュアなコードではないのだけど、手抜きをして作ったのでこんなもので。
そして、そのatoiの戻り値をstore命令で変数%aのメモリに格納する。
まとめると、このようになる。
%1 = call i32(i8*,...)* @printf(i8* getelementptr inbounds([3 x i8]* @.2, i32 0, i32 0)) nounwind %2 = call i8* @gets(i8* getelementptr inbounds ([1024 x i8]* @buf, i32 0, i32 0)) nounwind %3 = call i32 @atoi(i8* getelementptr inbounds ([1024 x i8]* @buf, i32 0, i32 0)) nounwind store i32 %3, i32* %a ,align 4
これで、INPUT文、PRINT文、IF文、GOTO文、FOR文、数式の演算ができた。
大体TinyBasicとして使えるようになった。
あと、
GOSUB文、RETURN文を実装したいのだが、BASICの構文での任意の行番号を呼び出すのはLLVM-IRアセンブラの命令語では実現することができない。
関数やサブルーチンを定義できるようにBASICの構文を拡張しなくてはならないのだが、いいアイデアが思いつかないので、GOSUBの実装をあきらめて放置している。