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");
}
case '<':
case '!':
case '>':
- if (line[i + 1] == '=') {
+ if (line[i + 1] == '=' || line[i + 1] == '>' || line[i + 1] == '<') {
dst->buf[write] = line[i];
i++;
write++;
buf++;
} else if (*buf == '<') {
tok.type = ULAS_LSHIFT;
+ buf++;
}
break;
case '>':
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);
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};
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