add builtin functions
This commit is contained in:
60
main.c
60
main.c
@@ -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);
|
||||
|
Reference in New Issue
Block a user