40 lines
No EOL
1.1 KiB
C
40 lines
No EOL
1.1 KiB
C
#include <codegen.h>
|
|
#include <slibs/slibs.h>
|
|
|
|
const char* codegen(ASTNode* node) {
|
|
if(node->type == AST_PROGRAM) {
|
|
sl_string code = sl_string("#include <runtime.h>\n\nint main() {\n");
|
|
for(sl_vec_it(n, node->body)) {
|
|
sl_append_c_str(&code, codegen(*n));
|
|
sl_append_c_str(&code, ";\n");
|
|
}
|
|
sl_append_c_str(&code, "}");
|
|
return sl_c_str(code);
|
|
}
|
|
|
|
if(node->type == AST_CALL_EXPRESSION) {
|
|
sl_string code = sl_string(node->name);
|
|
sl_append_c_str(&code, "(");
|
|
for(size_t i = 0; i < node->params.size; i++) {
|
|
sl_append_c_str(&code, codegen(node->params.data[i]));
|
|
if(i < node->params.size - 1) {
|
|
sl_append_c_str(&code, ", ");
|
|
}
|
|
}
|
|
sl_append_c_str(&code, ")");
|
|
return sl_c_str(code);
|
|
}
|
|
|
|
if(node->type == AST_NUMBER_LITERAL) {
|
|
return node->value;
|
|
}
|
|
|
|
if(node->type == AST_STRING_LITERAL) {
|
|
sl_string code = sl_string("\"");
|
|
sl_append_c_str(&code, node->value);
|
|
sl_append_c_str(&code, "\"");
|
|
return sl_c_str(code);
|
|
}
|
|
|
|
return "";
|
|
} |