IR jmp and scopes

This commit is contained in:
r4 2021-12-21 13:59:08 +01:00
parent 6080901842
commit 005309d1eb
5 changed files with 33 additions and 7 deletions

View File

@ -1,8 +1,8 @@
a := 1 a := 0
a = a + 1 {
b := a - 2 * 3 a := 1
b = 2 + b * a b := a
c := -b }
//a := 1 //a := 1
//b := 1 - 2 * 2 + 5 //b := 1 - 2 * 2 + 5

5
ir.c
View File

@ -11,6 +11,7 @@ const char *irinstr_str[IRInstrEnumSize] = {
[IRMul] = "mul", [IRMul] = "mul",
[IRDiv] = "div", [IRDiv] = "div",
[IRPrint] = "print", [IRPrint] = "print",
[IRJmp] = "jmp",
[IRJnz] = "jnz", [IRJnz] = "jnz",
}; };
@ -90,6 +91,10 @@ void print_ir(IRToks *v) {
print_irparam(&a->param); print_irparam(&a->param);
} }
break; break;
case IRJmp:
printf(" ");
printf(" %zu", v->toks[i].Jmp.iaddr);
break;
case IRJnz: case IRJnz:
printf(" "); printf(" ");
print_irparam(&v->toks[i].CJmp.condition); print_irparam(&v->toks[i].CJmp.condition);

5
ir.h
View File

@ -11,6 +11,7 @@ enum IRInstr {
IRMul, IRMul,
IRDiv, IRDiv,
IRPrint, IRPrint,
IRJmp,
IRJnz, IRJnz,
IRInstrEnumSize, IRInstrEnumSize,
}; };
@ -56,6 +57,10 @@ typedef struct IRTok {
IRArgs *args; IRArgs *args;
size_t args_size; size_t args_size;
} Print; } Print;
struct {
size_t iaddr;
} Jmp;
struct { struct {
size_t iaddr; size_t iaddr;

16
parse.c
View File

@ -343,6 +343,22 @@ static void stmt(State *s, Scope *sc, TokListItem *t) {
TRY(addr = get_ident_addr(sc, name, &start->tok)); TRY(addr = get_ident_addr(sc, name, &start->tok));
TRY(expr(s, sc, t, true, true, addr)); TRY(expr(s, sc, t, true, true, addr));
} }
} else if (t->tok.kind == TokOp && t->tok.Op == OpLCurl) {
Scope inner_sc = make_scope(sc, sc->mem_addr, true);
for (;;) {
if (t->next->tok.kind == TokOp) {
if (t->next->tok.Op == OpEOF) {
term_scope(&inner_sc);
mark_err(&start->tok);
set_err("Unclosed '{'");
return;
}
if (t->next->tok.Op == OpRCurl)
break;
}
TRY(stmt(s, &inner_sc, t->next));
}
term_scope(&inner_sc);
} }
toklist_del(s->toks, start, t); toklist_del(s->toks, start, t);
} }

View File

@ -15,7 +15,7 @@ Value eval_arith(IRInstr instr, const Value *lhs, const Value *rhs) {
case IRSub: res = lhs->Int - rhs->Int; break; case IRSub: res = lhs->Int - rhs->Int; break;
case IRMul: res = lhs->Int * rhs->Int; break; case IRMul: res = lhs->Int * rhs->Int; break;
case IRDiv: res = lhs->Int / rhs->Int; break; case IRDiv: res = lhs->Int / rhs->Int; break;
default: break; default: ASSERT_UNREACHED();
} }
return (Value){ return (Value){
.type.kind = TypeInt, .type.kind = TypeInt,
@ -28,7 +28,7 @@ Value eval_arith(IRInstr instr, const Value *lhs, const Value *rhs) {
case IRSub: res = lhs->Float - rhs->Float; break; case IRSub: res = lhs->Float - rhs->Float; break;
case IRMul: res = lhs->Float * rhs->Float; break; case IRMul: res = lhs->Float * rhs->Float; break;
case IRDiv: res = lhs->Float / rhs->Float; break; case IRDiv: res = lhs->Float / rhs->Float; break;
default: break; default: ASSERT_UNREACHED();
} }
return (Value){ return (Value){
.type.kind = TypeFloat, .type.kind = TypeFloat,