Added remaining int expression evaluations
authorLukas Krickl <lukas@krickl.dev>
Sun, 10 Dec 2023 08:15:57 +0000 (09:15 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sun, 10 Dec 2023 08:15:57 +0000 (09:15 +0100)
src/test.c
src/ulas.c

index 92e65615cb5ede382ed5cd8a38b7eeea8495d5f1..8948322ef501e27aa2e757704021b43d535bb434 100644 (file)
@@ -277,6 +277,13 @@ void test_intexpr(void) {
   ASSERT_INTEXPR(25, 0, "(2 + 3) * 5");
   ASSERT_INTEXPR(4, 0, "1 + 3 ; comment");
 
+  ASSERT_INTEXPR(3 & 2, 0, "3 & 2");
+  ASSERT_INTEXPR(3 | 2, 0, "3 | 2");
+  ASSERT_INTEXPR(3 ^ 2, 0, "3 ^ 2");
+  ASSERT_INTEXPR(~2, 0, "~2");
+  ASSERT_INTEXPR(3 << 2, 0, "3 << 2");
+  ASSERT_INTEXPR(3 >> 2, 0, "3 >> 2");
+
   TESTEND("intexpr");
 }
 
index 5ee5030d13a84f6ecd9d366dbb946662a1417bd5..a7c85cb90d873e89dc42dddba75aff300dd9dbb1 100644 (file)
@@ -376,7 +376,7 @@ int ulas_tok(struct ulas_str *dst, const char **out_line, unsigned long n) {
       case '<':
       case '!':
       case '>':
-        if (line[i + 1] == '=') {
+        if (line[i + 1] == '=' || line[i + 1] == '>' || line[i + 1] == '<') {
           dst->buf[write] = line[i];
           i++;
           write++;
@@ -528,6 +528,7 @@ struct ulas_tok ulas_totok(char *buf, unsigned long n, int *rc) {
         buf++;
       } else if (*buf == '<') {
         tok.type = ULAS_LSHIFT;
+        buf++;
       }
       break;
     case '>':
@@ -1369,7 +1370,7 @@ int ulas_parsecmp(int *i);
 int ulas_parseun(int *i) {
   struct ulas_tok *t = ulas_tokbufget(&ulas.toks, *i);
 
-  if (t && (t->type == '!' || t->type == '-')) {
+  if (t && (t->type == '!' || t->type == '-' || t->type == '~')) {
     int op = *i;
     *i += 1;
     int right = ulas_parseun(i);
@@ -1421,16 +1422,35 @@ int ulas_parseterm(int *i) {
   return expr;
 }
 
-int ulas_parsecmp(int *i) {
+int ulas_parseshift(int *i) {
   int expr = ulas_parseterm(i);
   struct ulas_tok *t = NULL;
 
+  while ((t = ulas_tokbufget(&ulas.toks, *i)) &&
+         (t->type == ULAS_RSHIFT || t->type == ULAS_LSHIFT)) {
+    int op = *i;
+    *i += 1;
+    int right = ulas_parseterm(i);
+
+    struct ulas_expbin bin = {expr, right, op};
+    union ulas_expval val = {.bin = bin};
+    struct ulas_expr e = {ULAS_EXPBIN, val};
+    expr = ulas_exprbufpush(&ulas.exprs, e);
+  }
+
+  return expr;
+}
+
+int ulas_parsecmp(int *i) {
+  int expr = ulas_parseshift(i);
+  struct ulas_tok *t = NULL;
+
   while ((t = ulas_tokbufget(&ulas.toks, *i)) &&
          (t->type == ULAS_LTEQ || t->type == ULAS_GTEQ || t->type == '>' ||
           t->type == '<')) {
     int op = *i;
     *i += 1;
-    int right = ulas_parseterm(i);
+    int right = ulas_parseshift(i);
 
     struct ulas_expbin bin = {expr, right, op};
     union ulas_expval val = {.bin = bin};
@@ -1459,7 +1479,26 @@ int ulas_parseeq(int *i) {
   return expr;
 }
 
-int ulas_parseexprat(int *i) { return ulas_parseeq(i); }
+int ulas_parsebit(int *i) {
+  int expr = ulas_parseeq(i);
+  struct ulas_tok *t = NULL;
+
+  while ((t = ulas_tokbufget(&ulas.toks, *i)) &&
+         (t->type == '&' || t->type == '|' || t->type == '^')) {
+    int op = *i;
+    *i += 1;
+    int right = ulas_parseeq(i);
+
+    struct ulas_expbin bin = {expr, right, op};
+    union ulas_expval val = {.bin = bin};
+    struct ulas_expr e = {ULAS_EXPBIN, val};
+    expr = ulas_exprbufpush(&ulas.exprs, e);
+  }
+
+  return expr;
+}
+
+int ulas_parseexprat(int *i) { return ulas_parsebit(i); }
 
 // parses tokens to expression tree
 // returns head expression index