hakeの日記

Windows環境でプログラミングの勉強をしています。

Rubyでコンパイラを作ってみる

GWの時間を利用して勉強のために、Rubyを使って超簡易コンパイラを作ってみました。
ソースを読み込んで、仮想スタックマシンのアセンブラを出力します。
使用したRubyのバージョンは1.9.1、Windows環境で作成しています。

仕様は以下のとおり

  • 扱えるデータは整数値のみ
  • 変数はグローバル変数のみ
  • 制御構造として、if文とwhile文(break等はなし)をもつ
  • 変数の入出力として、print文とinput文をもつ
  • 最適化は何もしていない

以下のソースプログラムが

int a,b,c;
a = 2;
b = 3;
if(a==0)
  print a;
else{
  c = a*(b+4);
  print c;
}

こんな感じになります

_VAR
_a$         INT 0
_b$         INT 0
_c$         INT 0
_END_VAR
_PROG
     LDA    _a$
     LDI    2
     STS
     DEL
     LDA    _b$
     LDI    3
     STS
     DEL
L001_IF:
     LDA    _a$
     LDS
     LDI    0
     CMPEQ
     JPF    L001_ELSE
     LDA    _a$
     LDS
     PRT
     JP     L001_END
L001_ELSE:
     LDA    _c$
     LDA    _a$
     LDS
     LDA    _b$
     LDS
     LDI    4
     ADD
     MUL
     STS
     DEL
     LDA    _c$
     LDS
     PRT
L001_END:
     STOP
_END_PROG

詳細はこちら
あとは、ローカル変数と関数を使用できるようにしてみたいですね。