add builtin functions

This commit is contained in:
r4
2021-12-22 16:09:52 +01:00
parent 41a5dba208
commit 5dd15ce9f1
6 changed files with 239 additions and 41 deletions

60
main.c
View File

@@ -32,6 +32,56 @@ static void die(const char *fmt, ...) {
exit(1);
}
static Value fn_print(Value *args) {
switch (args[0].type.kind) {
case TypeVoid: printf("(void)\n"); break;
case TypeFloat: printf("%f\n", args[0].Float); break;
case TypeInt: printf("%zd\n", args[0].Int); break;
default:
ASSERT_UNREACHED();
}
return (Value){0};
}
static Value fn_int(Value *args) {
Value ret = {
.type.kind = TypeInt,
.Int = 0,
};
switch (args[0].type.kind) {
case TypeVoid: break;
case TypeFloat: ret.Int = (ssize_t)args[0].Float; break;
case TypeInt: ret.Int = args[0].Int; break;
default: ASSERT_UNREACHED();
}
return ret;
}
static Value fn_float(Value *args) {
Value ret = {
.type.kind = TypeFloat,
.Float = 0.0,
};
switch (args[0].type.kind) {
case TypeVoid: break;
case TypeFloat: ret.Float = args[0].Float; break;
case TypeInt: ret.Float = (double)args[0].Int; break;
default: ASSERT_UNREACHED();
}
return ret;
}
static Value fn_pow(Value *args) {
if (!(args[0].type.kind == TypeFloat && args[1].type.kind == TypeFloat)) {
set_err("pow() requires arguments of type float");
return (Value){0};
}
return (Value) {
.type.kind = TypeFloat,
.Float = pow(args[0].Float, args[1].Float),
};
}
int main(int argc, const char **argv) {
/* parse arguments */
size_t nargs = argc - 1;
@@ -88,7 +138,13 @@ int main(int argc, const char **argv) {
if (opt_emit_tokens)
print_toks(&tokens);
/* parse tokens into IR code */
IRToks ir = parse(&tokens);
BuiltinFunc funcs[] = {
{ .name = "print", .side_effects = true, .n_args = 1, .func = fn_print, },
{ .name = "int", .side_effects = false, .n_args = 1, .func = fn_int, },
{ .name = "float", .side_effects = false, .n_args = 1, .func = fn_float, },
{ .name = "pow", .side_effects = false, .n_args = 2, .func = fn_pow, },
};
IRToks ir = parse(&tokens, funcs, sizeof(funcs) / sizeof(funcs[0]));
if (err) {
irtoks_term(&ir);
toklist_term(&tokens);
@@ -97,7 +153,7 @@ int main(int argc, const char **argv) {
}
toklist_term(&tokens);
if (opt_emit_ir)
print_ir(&ir);
print_ir(&ir, funcs);
/* run the IR */
/* TODO... */
irtoks_term(&ir);