Added equality expression
authorLukas Krickl <lukas@krickl.dev>
Mon, 20 Nov 2023 06:52:54 +0000 (07:52 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 20 Nov 2023 06:52:54 +0000 (07:52 +0100)
src/test.c
src/ulas.c

index 74448abe176e96f57dfd0bc260f47541cd7240aa..46529bae62fbb54086db78ef042f2390b6183dec 100644 (file)
@@ -245,6 +245,8 @@ void test_intexpr(void) {
   ASSERT_INTEXPR(-1, -1, "");
   ASSERT_INTEXPR(1, 0, "1");
   ASSERT_INTEXPR(1, 0, "2 == 2");
+  ASSERT_INTEXPR(0, 0, "2 == 2 == 3");
+  ASSERT_INTEXPR(1, 0, "2 == 2 == 1");
 
   TESTEND("intexpr");
 }
index 77a1e0b254b32fe447417e67be2da49380091bfb..c5b99a201e9353c88954603b1c2f44ff534e29c7 100644 (file)
@@ -1083,13 +1083,21 @@ int ulas_parseeq(int *i) {
   while ((t = ulas_tokbufget(&ulas.toks, *i)) &&
          (t->type == ULAS_EQ || t->type == ULAS_NEQ)) {
 
+    int op = *i;
     *i += 1;
+    int right = ulas_parsecmp(i);
+
+    struct ulas_expbin bin = {expr, right, op};
+    union ulas_expval val = {.bin = bin};
+    struct ulas_expr e = {ULAS_EXPBIN, val, -1};
+    expr = ulas_exprbufpush(&ulas.exprs, e);
   }
 
   return expr;
 }
 
 // parses tokens to expression tree
+// returns head expression index
 int ulas_parseexpr(void) {
   ulas_exprbufclear(&ulas.exprs);
 
@@ -1102,8 +1110,8 @@ int ulas_parseexpr(void) {
   int i = 0;
   int rc = ulas_parseeq(&i);
 
-  if (i != toks->len) {
-    ULASERR("Trailing token at index %d!\n", i);
+  if (i < toks->len) {
+    ULASERR("Trailing token at index %d\n", i);
     rc = -1;
   }
 
@@ -1118,10 +1126,23 @@ int ulas_intexpreval(int i, int *rc) {
     return 0;
   }
 
-  int result = 0;
-
   switch (e->type) {
-  case ULAS_EXPBIN:
+  case ULAS_EXPBIN: {
+    struct ulas_tok *op = ulas_tokbufget(&ulas.toks, e->val.bin.op);
+    if (!op) {
+      ULASPANIC("Binary operator was NULL\n");
+    }
+    int left = ulas_intexpreval(e->val.bin.left, rc);
+    int right = ulas_intexpreval(e->val.bin.right, rc);
+    switch (op->type) {
+    case ULAS_EQ:
+      return left == right; 
+    default:
+      ULASPANIC("Unhandeled binary operator\n");
+      break;
+    }
+    break;
+  }
   case ULAS_EXPUN:
   case ULAS_EXPGRP:
     break;
@@ -1131,7 +1152,7 @@ int ulas_intexpreval(int i, int *rc) {
   }
   }
 
-  return result;
+  return 0;
 }
 
 int ulas_intexpr(const char **line, unsigned long n, int *rc) {
@@ -1140,14 +1161,15 @@ int ulas_intexpr(const char **line, unsigned long n, int *rc) {
     return -1;
   }
 
-  if (ulas_parseexpr() == -1) {
+  int expr = -1;
+  if ((expr = ulas_parseexpr()) == -1) {
     *rc = -1;
     return -1;
   }
 
   // execute the tree of expressions
 
-  return ulas_intexpreval(0, rc);
+  return ulas_intexpreval(expr, rc);
 }
 
 int ulas_asmline(FILE *dst, FILE *src, const char *line, unsigned long n) {