c-compiler/src/codegen.c

88 lines
2.3 KiB
C
Raw Normal View History

2024-11-15 19:37:01 +13:00
#include "codegen.h"
#include "helpers.h"
#include <stdio.h>
void codegen(Node node) {
switch(node.type) {
case NODE_FUNCTION_CALL:
codegen_function_call(node);
break;
case NODE_FUNCTION_DECL:
codegen_function_decl(node);
break;
case NODE_FUNCTION_IMPL:
codegen_function_impl(node);
break;
case NODE_ARG_DECL:
codegen_arg_decl(node);
break;
case NODE_NUMBER:
codegen_number(node);
break;
default:
syntax_error("unexpected node %c", node.type);
}
}
void codegen_function_call(Node node) {
printf("FunctionCall(%s", node.function_call.name);
if(Nodes_size(&node.function_call.args) > 0)
printf(", ");
for(size_t i = 0; i < Nodes_size(&node.function_call.args); i++) {
const Node* arg = Nodes_at(&node.function_call.args, i);
codegen(*arg);
if(arg != Nodes_back(&node.function_call.args)) {
printf(", ");
}
}
printf(")\n");
}
void codegen_function_decl(Node node) {
printf("FunctionDecl(%s, %s, ", node.function_decl.type, node.function_decl.name);
for(size_t i = 0; i < Nodes_size(&node.function_decl.args); i++) {
const Node* arg = Nodes_at(&node.function_decl.args, i);
codegen(*arg);
if(arg != Nodes_back(&node.function_decl.args)) {
printf(", ");
}
}
printf(")\n");
}
void codegen_function_impl(Node node) {
printf("FunctionImpl(%s, %s", node.function_impl.type, node.function_impl.name);
if(Nodes_size(&node.function_impl.args) > 0)
printf(", ");
for(size_t i = 0; i < Nodes_size(&node.function_impl.args); i++) {
const Node* arg = Nodes_at(&node.function_impl.args, i);
codegen(*arg);
if(arg != Nodes_back(&node.function_impl.args)) {
printf(", ");
}
}
printf(") {\n\t");
for(size_t i = 0; i < Nodes_size(&node.function_impl.body); i++) {
const Node* n = Nodes_at(&node.function_impl.body, i);
codegen(*n);
if(n != Nodes_back(&node.function_impl.body)) {
printf("\t");
}
}
printf("}\n");
}
void codegen_arg_decl(Node node) {
printf("ArgDecl(%s, %s)", node.arg_decl.type, node.arg_decl.name);
}
void codegen_number(Node node) {
printf("Number(%llu)", node.number.value);
}