switchの実装が死ぬほど面倒。基本的にgotoに皮をかぶせたようなものっぽいので、手抜き実装をして、gotoを実装したあとに戻ってくるのが一番良さそうだ。手抜き実装ですら面倒なので諦めた。gotoをさっさと実装しよう。8月5日なんだかんだswitchとgotoを実装した。一度方針を決めて書き出せばそんなにはつらくなかった。ラベル生成を統一してもコードは汚いが、より良いものは思いつかないのでとりあえず放置。gotoとlabelをASTレベルで作ればifとかforとかを消し飛ばせるのではと思ったけどそうでもない。これはこれでいいのかも知れない。gotoの仕様がひどい。ラベルはローカル変数やら関数名やらとバッチングしても何の問題もない。ラベルをそのままアセンブリに吐き出すことは出来ない。仕方がないので適当なラベルに置換。すると、先にgotoが出てあとからラベルが定義されるソースに対応するのが面倒だった。関数内でしかラベルが使えないっていうのは実装を楽にするという意味でも妥当な制約だった。次は何をしようか......。KatoさんがNクイーンを実装していて、Twitterでたくさんいいねがついていた。構造体の実装に向けて、AST_LVAR/GVARをアドレスpushの命令とするように変更しようとしたが断念。いま意味解析では変数が左辺値か右辺値かというのは全く考慮していないから。30分ぐらい考えて、これを実装しなくても構造体の実装には問題無さそうに思えたのでとりあえずこのまま放置。@hiromi_mitiによるとMinGWでaqccが動かないらしい。吐く_test.sがLinuxとMinGWで異なっているそうだ。castを実装しようかと思ったがまともなテストケースが書けないので断念。int*をintに変換しても情報が落ちるのだ。sizeofに対して期待通りに動いている。パーズがくそ雑なのでどうにかしたいが、とりあえず動いている。演算子.やら->やらを実装した。変数のアドレスを起点としてコードを生成するように書き換えるのがとてもつらかった。AST_INDIRとAST_ADDRの実装で悩んだ。その過程で面白い発見をした。AST_INDIRとAST_ADDRは、コード生成としては、自分が持っているアドレスをそのまま出力するだけだ。こいつらの役目は主に意味解析にあって、AST_INDIRはrvalueをlvalueに変換し、AST_ADDRはlvalueをrvalueに変換する。上でバグらしていた主な原因は、既にlvalueになっているASTをAST_INDIRが持っている場合には、一度lvalue2rvalueをかましてからAST_INDIRしないといけないということだった。