#include "codegen.h" #include "helpers.h" #include 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); }