commit e98c229d70834e190c6c5321cbecc7948001f42b
parent b243ff1b9a3707ef37dab4cc5e135aef8bd4aa3e
Author: thing1 <thing1@seacrossedlovers.xyz>
Date: Fri, 12 Dec 2025 14:01:53 +0000
added types
Diffstat:
6 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/a.out b/a.out
Binary files differ.
diff --git a/cback.c b/cback.c
@@ -52,17 +52,28 @@ compiletype_C(type *t, FILE *f) {
int
compilerexpr_C(rexpr *r, FILE *f) {
int left, right;
- if (r->op == INT) {
- fprintf(f, "int v%d = %ld;\n", vid++, r->n);
+ switch (r->op) {
+ case INT:
+ compiletype_C(r->type, f);
+ fprintf(f, " v%d = %ld;\n", vid++, r->n);
+ return vid - 1;
+ case FLOAT:
+ compiletype_C(r->type, f);
+ fprintf(f, " v%d = %lf;\n", vid++, r->f);
return vid - 1;
}
+
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);
+
+ compiletype_C(r->type, f);
+ fprintf(f, " 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);
+
+ compiletype_C(r->type, f);
+ fprintf(f, " v%d = v%d;\n", vid++, left);
}
return vid - 1;
}
diff --git a/lexer.c b/lexer.c
@@ -88,6 +88,7 @@ next(lex *l) {
if (*l->ptr == '.') {
unlex(l);
t.f = lexFloat(l);
+ t.op = FLOAT;
}
} else if (isalpha(*l->ptr)) {
t.op = NAME;
diff --git a/parse.c b/parse.c
@@ -94,25 +94,44 @@ findlowest(tok *start, tok *end) {
return lowest;
}
+type *
+mkbasictype(char *name, mctx *ctx) {
+ type *t = alloczctx(ctx, sizeof(type));
+ t->type = BASIC;
+ t->name = strdup(name);
+ return t;
+}
+
rexpr *
parsesimple(tok *start, tok *end, tok *lowest, mctx *ctx) {
rexpr *e = alloczctx(ctx, sizeof(rexpr));
switch (lowest->op) {
case INT:
+ case FLOAT:
if (start != end) {
parserErr("Trailing expression");
return NULL;
}
- e->op = INT;
+ e->op = lowest->op;
e->n = lowest->n;
+ switch (e->op) {
+ case INT:
+ e->type = mkbasictype("i64", ctx);
+ break;
+ case FLOAT:
+ e->type = mkbasictype("f64", ctx);
+ break;
+ }
break;
case OBRACE:
e->op = OBRACE;
e->e = parserexpr(&lowest[1], &findend(lowest, end)[-1], ctx);
+ e->type = e->e->type;
break;
case NEGATE:
e->op = NEGATE;
e->e = parserexpr(&lowest[1], end, ctx);
+ e->type = e->e->type;
break;
default:
parserErr("Unexpected token type");
@@ -135,6 +154,9 @@ parsebin(tok *start, tok *end, tok *lowest, mctx *ctx) {
e->expr[0] = parserexpr(start, &lowest[-1], ctx);
e->expr[1] = parserexpr(&lowest[1], end, ctx);
+ /* TODO make this check both sides */
+ e->type = e->expr[0]->type;
+
return e;
}
diff --git a/spl.c b/spl.c
@@ -30,6 +30,7 @@ main(int argc, char **argv) {
checklexpr(e, NULL, checkctx);
freectx(checkctx);
+ fprintf(stdout, "#include <stdint.h>\n");
compilelexpr_C(e, stdout);
cleanup:
diff --git a/test.spl b/test.spl
@@ -1,3 +1,3 @@
func main() i32 {
- i i32 = 50;
+ i f32 = (4 + 2 - 4);
}