From: Lukas Krickl Date: Sun, 10 Dec 2023 08:15:57 +0000 (+0100) Subject: Added remaining int expression evaluations X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=2a649df2cc2061b19bf8b833cf7966cead972406;p=ulas%2F.git Added remaining int expression evaluations --- diff --git a/src/test.c b/src/test.c index 92e6561..8948322 100644 --- a/src/test.c +++ b/src/test.c @@ -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"); } diff --git a/src/ulas.c b/src/ulas.c index 5ee5030..a7c85cb 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -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