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:
| M | spl.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);
}