Kotlin に移植してみました。やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。
https://github.com/sonota88/vm2gol-v2-kotlin
ベースになっているバージョン: tag:51 のあたり
今回の実験は配列変数の宣言。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;
}
配列がスタック上で占有している幅を考慮しないといけないのに、それをまだやってないからです。これをやろうとするとたぶんあちこち修正しないといけなくなるので、それはまた今度ということで。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント