型を解決するロジック変更

結局、構文木を一回なぞっただけで型を解決しようとするのは無理とは言い切らないけど辛いと判断、型解決をごそっと書き直すことにしました。

まず(1)各項が取りうる型のうち確実なものをリストアップ(複数可)、(2)数値リテラルなどの型を明言できない項を前後の項の情報から補完(複数可)、(3)矛盾したのを排除していき収束させる…の三段階。それぞれ終わるか行き詰まるまで繰り返し。演算子も(1)では放置して(2)の段階でパターンを推測して前後を満足させる可能性(だけ)を列挙(3)で絞って、その結果だけを生成。どっかの項は必ず(1)である程度型が決まってる筈なので(じゃなきゃ無意味な式が書かれてるだけなのでエラーにしてよし)繰り返す事でそこから順に推測していける。…オーバーロードがあって(1)の段階でも候補が出せる場合でも(2)で更に前後を満足させるパターンを追加しなければならない、と、メモ。
他人が読んだら意味不明だろうなあ…と思いつつも。

AdaやHaskellなどオーバーロードに強い処理系のソースを参考にすればいいのでしょうけど、高度に完成されたコンパイラのソースは読むだけで人生費やしそうな予感(皆様のblogや日記をぼーっと表面だけ眺めた感想)がするので、上手く行くまで何度も書き直した方が早いでしょう、きっと。

それから、static":"でdmdが落ちるバグ、小さなコードでは再現しません…。