spl

a Simple Programming Language
Log | Files | Refs

commit e98c229d70834e190c6c5321cbecc7948001f42b
parent b243ff1b9a3707ef37dab4cc5e135aef8bd4aa3e
Author: thing1 <thing1@seacrossedlovers.xyz>
Date:   Fri, 12 Dec 2025 14:01:53 +0000

added types

Diffstat:
Aa.out | 0
Mcback.c | 19+++++++++++++++----
Mlexer.c | 1+
Mparse.c | 24+++++++++++++++++++++++-
Mspl.c | 1+
Mtest.spl | 2+-
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); }