ASSERT_INTEXPR(5, 0, "2 + 3");
ASSERT_INTEXPR(-1, 0, "2 + 3 - 6");
-
+
ASSERT_INTEXPR(6, 0, "2 * 3");
ASSERT_INTEXPR(2, 0, "8 / 4");
ASSERT_INTEXPR(0, -1, "8 / 0");
ASSERT_INTEXPR(0, -1, "8 % 0");
ASSERT_INTEXPR(0, 0, "8 % 4");
+ ASSERT_INTEXPR(0, 0, "!1");
+ ASSERT_INTEXPR(-1, 0, "-1");
+ ASSERT_INTEXPR(1, 0, "--1");
+ ASSERT_INTEXPR(2, 0, "1 - -1");
+
TESTEND("intexpr");
}
}
dst->buf[write] = line[i];
write++;
- break;
+ i++;
+ goto tokdone;
default:
if (isspace(line[i])) {
goto tokdone;
int ulas_parsecmp(int *i);
-int ulas_parseun(int *i) { return ulas_parseprim(i); }
+int ulas_parseun(int *i) {
+ struct ulas_tok *t = ulas_tokbufget(&ulas.toks, *i);
+
+ if (t && (t->type == '!' || t->type == '-')) {
+ int op = *i;
+ *i += 1;
+ int right = ulas_parseun(i);
+
+ struct ulas_expun un = {right, op};
+ union ulas_expval val = {.un = un};
+ struct ulas_expr e = {ULAS_EXPUN, val, -1};
+ return ulas_exprbufpush(&ulas.exprs, e);
+ }
+
+ return ulas_parseprim(i);
+}
int ulas_parsefact(int *i) {
int expr = ulas_parseun(i);
(t->type == '*' || t->type == '/' || t->type == '%')) {
int op = *i;
*i += 1;
- int right = ulas_parsecmp(i);
+ int right = ulas_parseun(i);
struct ulas_expbin bin = {expr, right, op};
union ulas_expval val = {.bin = bin};
(t->type == '+' || t->type == '-')) {
int op = *i;
*i += 1;
- int right = ulas_parsecmp(i);
+ int right = ulas_parsefact(i);
struct ulas_expbin bin = {expr, right, op};
union ulas_expval val = {.bin = bin};
t->type == '<')) {
int op = *i;
*i += 1;
- int right = ulas_parsecmp(i);
+ int right = ulas_parseterm(i);
struct ulas_expbin bin = {expr, right, op};
union ulas_expval val = {.bin = bin};
struct ulas_tok *t = NULL;
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);
}
break;
}
- case ULAS_EXPUN:
+ case ULAS_EXPUN: {
+ struct ulas_tok *op = ulas_tokbufget(&ulas.toks, e->val.un.op);
+ if (!op) {
+ ULASPANIC("Unary operator was NULL\n");
+ }
+ int right = ulas_intexpreval(e->val.un.right, rc);
+ switch ((int)op->type) {
+ case '!':
+ return !right;
+ case '-':
+ return -right;
+ default:
+ ULASPANIC("Unhandeled unary operation\n");
+ break;
+ }
+ break;
+ }
case ULAS_EXPGRP:
break;
case ULAS_EXPPRIM: {