commit 3b3b54d12dc4973505371b5b28a7a577c4211a88
parent 80ed2e101f2d769a0c7e47c44144c022f7fd74fc
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Wed, 10 Dec 2025 11:36:34 +0000
fixed brackets
Diffstat:
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;
}