summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorCarlos Maniero <carlos@maniero.me>2023-05-10 16:53:05 -0300
committerCarlos Maniero <carlos@maniero.me>2023-05-10 19:23:52 -0300
commit3129b741064c2b4f2c6c2408bd42cc83f7341ea8 (patch)
treeec499cf238b266f963f8b6524b4b96190ccac9bf /src/parser.c
parent75639fbf01bd6ae1212521b6cf822025eb8b598d (diff)
gas: Generate function call
This is an initial commit that enables function calls. At this point only functions with no parameters is going to work. Signed-off-by: Carlos Maniero <carlos@maniero.me>
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/parser.c b/src/parser.c
index b94087f..578514c 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -339,10 +339,9 @@ parser_parse_factor(parser_t *parser)
return expression;
}
case TOKEN_NAME: {
- // TODO: Check node kind, today accepts only variables
- ast_node_t *var_node = scope_get(parser->scope, token.value);
+ ast_node_t *referenced_node = scope_get(parser->scope, token.value);
- if (var_node == NULL) {
+ if (referenced_node == NULL) {
parser_error_t error;
error.token = token;
sprintf(error.message, "identifier '" SVFMT "' not defined", SVARG(&token.value));
@@ -350,8 +349,21 @@ parser_parse_factor(parser_t *parser)
return NULL;
}
- return ast_node_new_variable(&var_node->data.variable_declaration.identifier,
- var_node->data.variable_declaration.type);
+ if (referenced_node->kind == AST_VARIABLE_DECLARATION) {
+ return ast_node_new_variable(&referenced_node->data.variable_declaration.identifier,
+ referenced_node->data.variable_declaration.type);
+ }
+
+ // Parse function parameters
+ if (!drop_expected_token(parser, TOKEN_OPAREN)) {
+ return NULL;
+ }
+ if (!drop_expected_token(parser, TOKEN_CPAREN)) {
+ return NULL;
+ }
+
+ return ast_node_new_function_call(&referenced_node->data.function.identifier,
+ referenced_node->data.function.return_type);
}
default: {
parser_error_t error;