diff options
author | Carlos Maniero <carlos@maniero.me> | 2023-05-10 16:07:39 -0300 |
---|---|---|
committer | Carlos Maniero <carlos@maniero.me> | 2023-05-10 17:35:03 -0300 |
commit | 75639fbf01bd6ae1212521b6cf822025eb8b598d (patch) | |
tree | 49709154c437cfbc01568f1e0c9abc8574fd3a54 /src/gas_assembly_generator.c | |
parent | 2cf0bcb409f3a1fd298b664103d57c945c6349f5 (diff) |
namespaces: Add a namespace structure that represents a file
We have been always parsing a single function. Since we want to have
multiple functions in a near future, this patch introduces an namespace
that represents an entire file.
To ensure a function is defined inside a namespace, a helper function
was created. Today our ast_node structure is highly exposed, and this is
something that Johnny and I have been discussed. So then, this is a
first step to try to protected the code generation from our ast tree.
Signed-off-by: Carlos Maniero <carlos@maniero.me>
Diffstat (limited to 'src/gas_assembly_generator.c')
-rw-r--r-- | src/gas_assembly_generator.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/gas_assembly_generator.c b/src/gas_assembly_generator.c index 413fbb0..4326b27 100644 --- a/src/gas_assembly_generator.c +++ b/src/gas_assembly_generator.c @@ -147,6 +147,9 @@ gas_assembly_generator_compile(gas_assembly_generator_t *gen, ast_node_t *ast) gen->latest_evaluation.kind = EVALUATION_RESULT_VOID; switch (ast->kind) { + case AST_NAMESPACE: + gas_assembly_generator_compile_ns(gen, &ast->data.ns); + break; case AST_BINARY_OPERATION: gas_assembly_generator_binary_operation(gen, &ast->data.binary_operation); break; @@ -179,6 +182,14 @@ gas_assembly_generator_compile(gas_assembly_generator_t *gen, ast_node_t *ast) } } +void +gas_assembly_generator_compile_ns(gas_assembly_generator_t *gen, ast_namespace_t *ns) +{ + for (size_t i = 0; i < ns->nodes->size; i++) { + gas_assembly_generator_compile(gen, vector_at(ns->nodes, i)); + } +} + static void gas_assembly_generator_compile_function(gas_assembly_generator_t *gen, ast_function_declaration_t *func) { @@ -201,12 +212,9 @@ gas_assembly_generator_compile_function(gas_assembly_generator_t *gen, ast_funct } void -gas_assembly_generator_compile_linux_main(gas_assembly_generator_t *gen, ast_node_t *func) +gas_assembly_generator_compile_linux_main(gas_assembly_generator_t *gen, ast_node_t *ns) { - assert(func); - assert(func->kind == AST_FUNCTION_DECLARATION); - - if (!string_view_eq(func->data.function.identifier.name, string_view_from_str("main"))) { + if (ast_node_ns_get_function_node_by_name(ns, "main") == NULL) { fprintf(stderr, "[ERROR]: no main function has been defined!\n"); exit(EXIT_FAILURE); } @@ -214,7 +222,7 @@ gas_assembly_generator_compile_linux_main(gas_assembly_generator_t *gen, ast_nod fprintf(gen->stream, ".global _start\n"); fprintf(gen->stream, ".text\n"); - gas_assembly_generator_compile(gen, func); + gas_assembly_generator_compile(gen, ns); fprintf(gen->stream, "_start:\n"); fprintf(gen->stream, " call main\n"); |