diff --git a/example.script b/example.script index 888c6da..9465ac7 100644 --- a/example.script +++ b/example.script @@ -1,8 +1,8 @@ -a := 1 -a = a + 1 -b := a - 2 * 3 -b = 2 + b * a -c := -b +a := 0 +{ + a := 1 + b := a +} //a := 1 //b := 1 - 2 * 2 + 5 diff --git a/ir.c b/ir.c index 5eb8dc1..a6dc956 100644 --- a/ir.c +++ b/ir.c @@ -11,6 +11,7 @@ const char *irinstr_str[IRInstrEnumSize] = { [IRMul] = "mul", [IRDiv] = "div", [IRPrint] = "print", + [IRJmp] = "jmp", [IRJnz] = "jnz", }; @@ -90,6 +91,10 @@ void print_ir(IRToks *v) { print_irparam(&a->param); } break; + case IRJmp: + printf(" "); + printf(" %zu", v->toks[i].Jmp.iaddr); + break; case IRJnz: printf(" "); print_irparam(&v->toks[i].CJmp.condition); diff --git a/ir.h b/ir.h index 022c385..c1e9e0e 100644 --- a/ir.h +++ b/ir.h @@ -11,6 +11,7 @@ enum IRInstr { IRMul, IRDiv, IRPrint, + IRJmp, IRJnz, IRInstrEnumSize, }; @@ -56,6 +57,10 @@ typedef struct IRTok { IRArgs *args; size_t args_size; } Print; + + struct { + size_t iaddr; + } Jmp; struct { size_t iaddr; diff --git a/parse.c b/parse.c index 0b5cc84..870070b 100644 --- a/parse.c +++ b/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(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); } diff --git a/runtime.c b/runtime.c index 3ef6aee..d848f3c 100644 --- a/runtime.c +++ b/runtime.c @@ -15,7 +15,7 @@ Value eval_arith(IRInstr instr, const Value *lhs, const Value *rhs) { case IRSub: res = lhs->Int - rhs->Int; break; case IRMul: res = lhs->Int * rhs->Int; break; case IRDiv: res = lhs->Int / rhs->Int; break; - default: break; + default: ASSERT_UNREACHED(); } return (Value){ .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 IRMul: res = lhs->Float * rhs->Float; break; case IRDiv: res = lhs->Float / rhs->Float; break; - default: break; + default: ASSERT_UNREACHED(); } return (Value){ .type.kind = TypeFloat,