かんたんな自作言語のコンパイラをいろんな言語で書いてみるシリーズ 12回目は Kotlin です。
やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。
移植元
ベースになっているバージョン: tag:51 のあたり
メモ
- Java版 からコピーしてきて修正してできあがり。3日くらい。
- Kotlin は仕事で少しだけ使って、あと少し前に 「標準入力を読んで行ごとに処理」 と 「四則演算と剰余のみのexprコマンドをKotlinで作ってみた」 を書いたくらいのほぼ初心者
- Java と Scala の中間みたいな印象
今回の実験は配列変数の宣言。 trial ブランチで試してみました。
確認用のコードです。今回の実験ではとりあえずこれだけコンパイルできれば OK。
// declare_array.vg.txt func main() { var xs[22]; }
AST がこんな感じ。お試しなので適当。
$ ( \ > cat declare_array.vg.txt \ > | ./run.sh tokenize \ > | ./run.sh parse \ > ) 2>/dev/null [ "top_stmts", [ "func", "main", [ ], [ [ "var_array", "xs", 22 ] ] ] ]
アセンブリコードがこんな感じ。
$ ( \ > cat declare_array.vg.txt \ > | ./run.sh tokenize \ > | ./run.sh parse \ > | ./run.sh codegen \ > ) 2>/dev/null call main exit label main push bp cp sp bp # 関数の処理本体 sub_sp 22 # ... 配列のサイズ分の領域をスタック上に確保する cp bp sp pop bp ret
これだけだったら少し修正するだけで済みました。
次のようなコードはまだ正しく動くようにコンパイルできません。
func main() { var xs[22]; var a = 11; }
配列がスタック上で占有している幅を考慮しないといけないのに、それをまだやってないからです。 これをやろうとするとたぶんあちこち修正しないといけなくなるので、それはまた今度ということで。