spl

a Simple Programming Language
Log | Files | Refs

commit 3b3b54d12dc4973505371b5b28a7a577c4211a88
parent 80ed2e101f2d769a0c7e47c44144c022f7fd74fc
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Wed, 10 Dec 2025 11:36:34 +0000

fixed brackets

Diffstat:
Mcback.c | 43+++++++++++++++++++++----------------------
Mparse.c | 8++++++--
Mtest.spl | 4++--
3 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/cback.c b/cback.c @@ -6,14 +6,20 @@ #define SAME(s1, s2) (strcmp(s1, s2) == 0) int vid = 0; -int indent = 0; void compilelexpr_C(lexpr *l, FILE *f); -void -putindent(FILE *f) { - for (int i = 0; i < indent; i++) - fputc('\t', f); +int +isbin(rexpr *r) { + switch (r->op) { + case ADD: + case SUB: + case MUL: + case DIV: + return 1; + default: + return 0; + } } char * @@ -47,16 +53,17 @@ int compilerexpr_C(rexpr *r, FILE *f) { int left, right; if (r->op == INT) { - putindent(f); fprintf(f, "int v%d = %ld;\n", vid++, r->n); return vid - 1; } - putindent(f); - left = compilerexpr_C(r->expr[0], f); - putindent(f); - right = compilerexpr_C(r->expr[1], f); - putindent(f); - fprintf(f, "int v%d = v%d %c v%d;\n", vid++, left, r->op, right); + if (isbin(r)) { + left = compilerexpr_C(r->expr[0], f); + right = compilerexpr_C(r->expr[1], f); + fprintf(f, "int v%d = v%d %c v%d;\n", vid++, left, r->op, right); + } else if (r->op == OBRACE) { + left = compilerexpr_C(r->expr[0], f); + fprintf(f, "int v%d = v%d;\n", vid++, left); + } return vid - 1; } @@ -70,14 +77,11 @@ compilefunc_C(lexpr *l, FILE *f) { } fprintf(f, ") {\n"); - indent++; - for (int i = 0; i < l->bodyc; i++) { compilelexpr_C(&l->body[i], f); } fprintf(f, "}\n"); - indent--; } void @@ -85,7 +89,6 @@ compileassign_C(lexpr *l, FILE *f) { int id; if (l->rexpr) id = compilerexpr_C(l->rexpr, f); - putindent(f); compiletype_C(l->type, f); fprintf(f, " %s", l->name); if (l->rexpr) @@ -95,12 +98,8 @@ compileassign_C(lexpr *l, FILE *f) { void compilereassign_C(lexpr *l, FILE *f) { int id; - if (l->rexpr) - id = compilerexpr_C(l->rexpr, f); - putindent(f); - fprintf(f, "%s", l->name); - if (l->rexpr) - fprintf(f, " = v%d;\n", id); + id = compilerexpr_C(l->rexpr, f); + fprintf(f, "%s = v%d;\n", l->name, id); } diff --git a/parse.c b/parse.c @@ -6,6 +6,8 @@ #include "parse.h" #include "util.h" +int funcargs = 0; + void parserErr(const char *msg) { fprintf(stderr, "%s\n", msg); @@ -170,7 +172,7 @@ parsetype(lex *l, mctx *ctx) { int isterm(tok t) { - return (t.op == SEMI || t.op == COMMA || t.op == CBRACE); + return (t.op == SEMI || t.op == COMMA); } lexpr * @@ -187,7 +189,7 @@ parseassign(lex *l, tok name, mctx *ctx) { return NULL; } if ((t = next(l)).op != ASSIGN) { - if (isterm(t)) { + if (isterm(t) || (funcargs && t.op == ')')) { if (t.op != SEMI) unlex(l); goto shortdec; @@ -242,6 +244,7 @@ parsefunc(lex *l, mctx *ctx) { t = next(l); switch (t.op) { case NAME: + funcargs = 1; if (!(arg = parseassign(l, t, ctx))) { parserErr("malformed function arg"); RESTORE(l); @@ -249,6 +252,7 @@ parsefunc(lex *l, mctx *ctx) { } args = realloczctx(ctx, args, sizeof(lexpr) * ++argc); args[argc - 1] = *arg; + funcargs = 0; break; case COMMA: continue; diff --git a/test.spl b/test.spl @@ -1,4 +1,4 @@ func main(arg1 i32) i32 { - a i64 = 21474836470; - a = 1; + a i64 = (5 * 2) + 4; + a = 0; }