IR jmp and scopes
This commit is contained in:
parent
6080901842
commit
005309d1eb
@ -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
5
ir.c
@ -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
5
ir.h
@ -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
16
parse.c
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user