diff options
| -rw-r--r-- | src/builtins.c | 47 | ||||
| -rw-r--r-- | src/builtins.h | 6 | ||||
| -rw-r--r-- | src/parser.c | 29 |
3 files changed, 54 insertions, 28 deletions
diff --git a/src/builtins.c b/src/builtins.c new file mode 100644 index 0000000..591caeb --- /dev/null +++ b/src/builtins.c @@ -0,0 +1,47 @@ +#include "builtins.h" +#include "ast.h" +#include "utils.h" +#include <string.h> +#include <stdlib.h> +#include <assert.h> + + +#define MAX_BUILTINS_COUNT 128 +static Node *all_builtins[MAX_BUILTINS_COUNT]; +static i64 builtins_count = 0; + +static void push_builtin(Node *node) +{ + assert(builtins_count < MAX_BUILTINS_COUNT); + all_builtins[builtins_count++] = node; +} + +void initialize_builtins() +{ + Node *node; + // FIXME: The `TYPE_ANY` is a hack + node = Node_new(AST_BUILTIN); + node->func.name = "print"; + node->func.return_type = type_new(TYPE_INT); + node->func.num_args = 1; + node->func.args = (Variable *)calloc(sizeof(Variable), 1); + node->func.args[0] = (Variable){"val", type_new(TYPE_ANY), 0}; + push_builtin(node); + + node = Node_new(AST_BUILTIN); + node->func.name = "putc"; + node->func.return_type = type_new(TYPE_INT); + node->func.num_args = 1; + node->func.args = (Variable *)calloc(sizeof(Variable), 2); + node->func.args[0] = (Variable){"arg", type_new(TYPE_INT), 0}; + push_builtin(node); +} + +Node *find_builtin_function(Token *token) +{ + for (i64 i = 0; i < builtins_count; i++) { + if (strcmp(all_builtins[i]->func.name, token->value.as_string) == 0) + return all_builtins[i]; + } + return NULL; +}
\ No newline at end of file diff --git a/src/builtins.h b/src/builtins.h new file mode 100644 index 0000000..38c1cb4 --- /dev/null +++ b/src/builtins.h @@ -0,0 +1,6 @@ +#pragma once + +#include "ast.h" + +void initialize_builtins(); +Node *find_builtin_function(Token *token);
\ No newline at end of file diff --git a/src/parser.c b/src/parser.c index 13878d1..f412c79 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,5 +1,6 @@ #include "parser.h" #include "utils.h" +#include "builtins.h" #include <stdlib.h> #include <string.h> #include <assert.h> @@ -69,34 +70,6 @@ void dump_block_stack() } } -Node *builtin_print; -Node *builtin_putc; - -void initialize_builtins() -{ - // FIXME: The `TYPE_ANY` is a hack - builtin_print = Node_new(AST_BUILTIN); - builtin_print->func.name = "print"; - builtin_print->func.return_type = type_new(TYPE_INT); - builtin_print->func.num_args = 1; - builtin_print->func.args = (Variable *)calloc(sizeof(Variable), 1); - builtin_print->func.args[0] = (Variable){"val", type_new(TYPE_ANY), 0}; - - builtin_putc = Node_new(AST_BUILTIN); - builtin_putc->func.name = "putc"; - builtin_putc->func.return_type = type_new(TYPE_INT); - builtin_putc->func.num_args = 1; - builtin_putc->func.args = (Variable *)calloc(sizeof(Variable), 2); - builtin_putc->func.args[0] = (Variable){"arg", type_new(TYPE_ANY), 0}; -} - -Node *find_builtin_function(Token *token) -{ - if (strcmp(token->value.as_string, "putc") == 0) { return builtin_putc; } - if (strcmp(token->value.as_string, "print") == 0) { return builtin_print; } - return NULL; -} - Variable *find_local_variable(Token *token) { if (current_function == NULL) |