summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index baabf21..9c737ff 100644
--- a/eval.c
+++ b/eval.c
@@ -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