以下に対応できるようにする
foo = 1;
bar = 2 + 3;
return foo + bar;
typedef struct LVar Lvar; // local variable struct LVar { LVar *next; // next variable or null char *name; // variable name int len; // name length int offset; // RBP offset }; LVar *locals;
### if, while, for
アセンブラではcmpを使って、jumpしてend or biginに行くか処理をするか判定している
program = stmt * stmt = expr ";" | "if" "(" expr ")" stmt ("else" stmt)? | "while" "(" expr ")" stmt | "for" "(" expr? ";" expr? ";" expr? ")" stmt
if
Aをコンパイルしたコード // スタックトップに結果が入っているはず pop rax cmp rax, 0 je .LendXXX Bをコンパイルしたコード .LendXXX:
if else
Aをコンパイルしたコード // スタックトップに結果が入っているはず pop rax cmp rax, 0 je .LelseXXX Bをコンパイルしたコード jmp .LendXXX .LelseXXX Cをコンパイルしたコード .LendXXX
while
.LbeginXXX: Aをコンパイルしたコード pop rax cmp rax, 0 je .LendXXX Bをコンパイルしたコード jmp .LbeginXXX .LendXXX:
for
Aをコンパイルしたコード .LbeginXXX: Bをコンパイルしたコード pop rax cmp rax, 0 je .LendXXX Dをコンパイルしたコード Cをコンパイルしたコード jmp .LbeginXXX .LendXXX: