spl

a Simple Programming Language
Log | Files | Refs

commit 06ce9ce7de6801f702b53ff84edb6107d9682838
parent b682acf4e47acae6edd1aeb7a86d6c4dd3aa14e6
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Fri, 21 Nov 2025 14:57:14 +0000

made work on the bracketed expr

Diffstat:
Mspl.c | 44+++++++++++++++++++++++++++++++-------------
1 file changed, 31 insertions(+), 13 deletions(-)

diff --git a/spl.c b/spl.c @@ -9,7 +9,7 @@ typedef struct rexpr { char op; union { struct { /* for bracketed exprs */ - tok *ts; + tok *ts; int *tc; }; struct { /* operators */ @@ -30,6 +30,8 @@ parserErr(const char *msg) { int getpres(tok t) { switch (t.op) { + case OBRACE: + return 0; case ADD: return 1; case SUB: @@ -62,12 +64,26 @@ pivotParse(tok *start, tok *end, mctx *ctx) { lowest = t; } if (lowest == start) { - if (lowest->op != INT) - parserErr("Expected int expression"); - if (start != end) - parserErr("Trailing expression"); - e->op = INT; - e->n = lowest->n; + switch (lowest->op) { + case INT: + if (start != end) + parserErr("Trailing expression"); + e->op = INT; + e->n = lowest->n; + break; + case OBRACE: + tok *endbrace; + int d = 1; + for (int i = 1; d != 0; i++) { /* this doesn't work */ + if (lowest[i].op == '(') d++; + else if (lowest[i].op == ')') d--; + endbrace = &lowest[i]; + } /* make it find the end brace -1 */ + e = pivotParse(lowest, endbrace, ctx); + break; + default: + parserErr("Unexpected token type"); + } } else { if (!isop(*lowest)) parserErr("Expected op"); @@ -78,10 +94,6 @@ pivotParse(tok *start, tok *end, mctx *ctx) { return e; } -rexpr * -parseRexpr(lex *l, mctx *ctx) { -} - int eval(rexpr *e) { switch (e->op) { @@ -100,9 +112,15 @@ eval(rexpr *e) { int main() { - lex l = mklexer("2 + 4 * 9 / 3"); + lex l = mklexer("(2 + 4) * 9 / 3"); + tok list[32] = {0}, t = next(&l); + int i; + for (i = 0; i < 32 && t.op != LEOF; i++, t = next(&l)) { + list[i] = t; + } mctx *ctx = newctx(); - parseRexpr(&l, ctx); + rexpr *e = pivotParse(list, &list[i - 1], ctx); + printf("%d\n", eval(e)); freectx(ctx); }