diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-09 22:03:36 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-09 22:03:36 +0000 |
commit | 325cfd6354dcccaa095767e0419760a3f9462fed (patch) | |
tree | 00932f332530feaf57c1c17758fb3a7f30fe8522 /eval.c | |
parent | 1ef3119fe613823a2145126c58948361ca7d3cd8 (diff) |
Add basic code for parser/evaluator. Can do simple stranding
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 82 |
1 files changed, 80 insertions, 2 deletions
@@ -6,10 +6,88 @@ Rune *errormsg; +typedef Datum (*evalfn)(Datum, Datum); + +Datum strand(Datum, Datum); + +int bindingstrengths[12][12] = { +/* A F H MO DO AF ( ) { } [ ] */ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* H */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* FA */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ( */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ) */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* { */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* } */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* [ */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ] */ +}; + +evalfn evalfns[12][12] = { +/* A F H MO DO AF ( ) { } [ ] */ + strand, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* H */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* FA */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ( */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ) */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* { */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* } */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* [ */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ] */ +}; + + Datum * eval(Datum *tokens, int *ntoks) { - *ntoks = 0; - errormsg = L"Evaluator not written yet"; + while(*ntoks > 1){ + int maxlevel = 0; + int offset; + evalfn fn = nil; + print("CURRENT: %S\n", ppdatums(tokens, *ntoks)); + for(offset = (*ntoks)-1; offset >= 0; offset--){ + int level; + if(offset == 0) + level = 0; + else{ + Datum left = tokens[offset-1]; + Datum right = tokens[offset]; + level = bindingstrengths[left.tag][right.tag]; + } + if(level < maxlevel){ + Datum left = tokens[offset]; + Datum right = tokens[offset+1]; + fn = evalfns[left.tag][right.tag]; + print("Reducing %S and %S\n", ppdatum(left), ppdatum(right)); + break; + }else if(level > maxlevel) + maxlevel = level; + } + if(maxlevel == 0){ + errormsg = L"No reduce rule. Syntax error."; + *ntoks = 0; + }else{ + tokens[offset] = fn(tokens[offset],tokens[offset+1]); + for(int i = offset+1; i < (*ntoks)-1; i++) + tokens[i] = tokens[i+1]; + (*ntoks)--; + } + } return tokens; +} + +Datum +strand(Datum left, Datum right) +{ + print("Stranding\n"); + Datum result; + result.tag = ArrayTag; + result.array = fnCatenateFirst(left.array,fnEnclose(right.array)); + return result; }
\ No newline at end of file |