LLVM-IR(LLVM中間コード)用コンパイラの作り方 その10

前回の続き

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の実装をあきらめて放置している。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

49 + = 58