From 230aac3c644df9d80c8eba507e6bc7c710b26b52 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 20 Jan 2022 23:07:08 +0000 Subject: Implement better dnfs semantics --- eval.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 7d9afbe..e794a38 100644 --- a/eval.c +++ b/eval.c @@ -52,7 +52,7 @@ evalfn evalfns[11][11] = { }; Datum * -eval(Statement *stmt) +eval(Statement *stmt, int toplevel) { errormsg = nil; @@ -122,6 +122,9 @@ retry: } } if(stmt->ntoks == 1){ + int stop = 0; + if(toplevel == 0 && !stmt->toks[0].shy) + stop = 1; if(stmt->guard){ int guardOK = 1; if(stmt->toks[0].tag != ArrayTag) @@ -137,10 +140,10 @@ retry: exits(nil); } if(stmt->toks[0].array->intdata[0] == 1) - return eval(stmt->guard); + return eval(stmt->guard, toplevel); } - if(stmt->next) - return eval(stmt->next); + if(stmt->next && !stop) + return eval(stmt->next, toplevel); else return stmt->toks; }else @@ -215,7 +218,7 @@ parens(Datum left, Datum right) /* evaluate a parenthesis expression and return the result */ USED(right); traceprint("PARENS: %S\n", ppdatums(left.stmt.toks, left.stmt.ntoks)); - Datum *result = eval(&left.stmt); + Datum *result = eval(&left.stmt, 1); if(result[0].tag == ArrayTag) result[0].array->stranded = 0; result[0].shy = 0; -- cgit v1.2.3