88 lines
2.3 KiB
C
88 lines
2.3 KiB
C
|
#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);
|
||
|
}
|