2008-08-12から1日間の記事一覧

リッチ計算機(ただし整数のみ)

変数つけた カッコつけたcaperとcapella(AST作成ツール)のおかげで結構楽はできているが、 それでもソースがややこしくなってきた そろそろ整理するか ただいまの文法 %token Number<calc::Integer*> Identifier<calc::Identifier*>; %token Add Sub Mul Div Var Equal LPar RPar; %namespace ca</calc::identifier*></calc::integer*>…

あるじゃん

select使えばいいだけか! あれ? でもこれ使うと 片方の値は未定義になる気がするけど いいのかな まあ明日試してみるか

if〜then〜else続き

ほっとくのも気色悪いので 明示的スタック操作で実装した。 一応動いた。 よく考えるとLLVMのBasicBlockは引数をとれるわけではないから CPSとかそういう問題ではないよな。 関数の引数以外に同じ名前で違う値を持つ方法がない。 とするとthen句とかのBasicB…

さらにif〜then〜else

……と思ったけど if then else(ただし値を持つ)はSSAだと簡単ではないなァ ytqwertyさんのを見ると…… 普通に無条件ブランチして合流してる。 3項演算子風のif書きたいときは戻り値どうすればいいのかな…… 明示的にスタック操作すんのかな レジスタだけで美し…

いまのソース

こんなのソースを fun foo( a, b ) { a + b } foo(1,4) * foo(5,7);コンパイルすると ; ModuleID = 'test' @format0 = internal constant [4 x i8] c"%d\0A\00" declare i32 @printf(i8*, ...) define void @puti(i32 %arg0) { %format0_address = getelemen…

関数呼び出し

関数定義と関数呼び出しを追加。動いた。 LLVMのインターフェイスってよくできてるな…… カンチャンずっぽりって感じでズバズバ決まる。 おかげでコーディング楽できる。