diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-21 15:18:22 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-21 15:18:22 +0000 |
commit | 40c021d964bc60d2b60dd78022e180c964ea1b67 (patch) | |
tree | aee97fdfef0378c94871579b8bc12cbdca583553 /eval.c | |
parent | 1ddd7de5b15f52c13a5c084445253655a94bd970 (diff) |
Implement better error handling, but still no error guards
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 49 |
1 files changed, 17 insertions, 32 deletions
@@ -6,7 +6,6 @@ #define traceprint if(traceeval)print -Rune *errormsg; int traceeval; typedef Datum (*evalfn)(Datum, Datum); @@ -54,16 +53,9 @@ evalfn evalfns[11][11] = { Datum * eval(Statement *stmt, int toplevel) { - errormsg = nil; - /* start by looking up first variable if needed */ - if(stmt->ntoks > 0 && stmt->toks[stmt->ntoks-1].tag == NameTag){ - Datum *value = lookup(stmt->toks[stmt->ntoks-1]); - if(value == nil) - return nil; - else - stmt->toks[stmt->ntoks-1] = *value; - } + if(stmt->ntoks > 0 && stmt->toks[stmt->ntoks-1].tag == NameTag) + stmt->toks[stmt->ntoks-1] = *lookup(stmt->toks[stmt->ntoks-1]);; while(stmt->ntoks > 1){ int maxlevel = 0; @@ -82,13 +74,8 @@ retry: } if(level == 0 && stmt->toks[offset-1].tag == NameTag){ - Datum *value = lookup(stmt->toks[offset-1]); - if(value == nil) - return nil; - else{ - stmt->toks[offset-1] = *value; - goto retry; - } + stmt->toks[offset-1] = *lookup(stmt->toks[offset-1]); + goto retry; }else if(level < maxlevel){ Datum left = stmt->toks[offset]; Datum right = stmt->toks[offset+1]; @@ -98,10 +85,9 @@ retry: }else if(level > maxlevel) maxlevel = level; } - if(maxlevel == 0){ - errormsg = L"No reduce rule. Syntax error."; - return nil; - }else{ + if(maxlevel == 0) + throwerror(L"No reduce rule", EParse); + else{ Datum new = fn(stmt->toks[offset],stmt->toks[offset+1]); traceprint("handler fn done\n"); if(stmt->toks[offset].tag == ArrayTag) @@ -135,12 +121,13 @@ retry: guardOK = 0; else if(stmt->toks[0].array->intdata[0] != 0 && stmt->toks[0].array->intdata[0] != 1) guardOK = 0; - if(!guardOK){ - print("Guard expected single valued boolean\n"); - exits(nil); + if(!guardOK) + throwerror(L"Guard expected single valued boolean", EDomain); + else{ + stop = 0; + if(stmt->toks[0].array->intdata[0] == 1) + return eval(stmt->guard, toplevel); } - if(stmt->toks[0].array->intdata[0] == 1) - return eval(stmt->guard, toplevel); } if(stmt->next && !stop) return eval(stmt->next, toplevel); @@ -156,8 +143,8 @@ lookup(Datum var) traceprint("VAR LOOKUP %S\n", var.symbol->name); if(var.symbol->undefined){ - errormsg = runesmprint("Variable undefined: %S\n", var.symbol->name); - return nil; + Rune *msg = runesmprint("Undefined name: %S", var.symbol->name); + throwerror(msg, EValue); } Datum *val; @@ -240,10 +227,8 @@ assign(Datum left, Datum right) { if(left.symbol->setfn != nil){ int ok = left.symbol->setfn(right); - if(!ok){ - print("Assignment failed\n"); - exits(nil); - } + if(!ok) + throwerror(nil, ESyntax); }else{ if(left.symbol->undefined == 0 && left.symbol->value.tag == ArrayTag) freearray(left.symbol->value.array); |