tiny-cをscalaに移植する。(5)

今日は tiny-c のフロントエンドをC言語風式言語 Compact を使うように書き換えました。
ソースでいうとCLex.javaとcparser.yをcompact.scalaとcompact2ast.scalaに置き換えを行いました。

https://github.com/hsk/ctinyc

処理内容

compact.scalaで文字列をタプルと基本Scalaのプリミティブとして構文木を作ります。
ast.scalaは抽象構文木を表します。
compact2ast.scalaがcompactの構文木をastに変換しコンパイルアセンブルします。
compiler.scalaはastをコンパイルし、アセンブラコードに変換します。

以下のテストコードがコンパイルできます。(しかし、このコードしかテストしていません。笑)

test.cx

def main = fun() {
	var i, s
	s = 0;
	i = 0;
	while (i < 10) {
		s = s + i;
		i = i + 1;
	}
	println("s = %d", s);
}
scala ctinyc.c test.cx

としてコンパイルすると、a.exeが作成されます。(Windowsのみですが)
ということで、ようやく動くネイティブコンパイラが出来ました。

tiny-cは規模が小さい言語の実装なので、やろうとしていることをゴリ押しで出来てよかったです。
それでも、今後やろうとしているさらに本格的な実装へ近づけるにあたって非常に良い経験が出来ました。

次回はここに、マクロ用言語を搭載してマクロをコンパイルタイムに動かしてみたいと思います。