diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 126 |
1 files changed, 61 insertions, 65 deletions
diff --git a/src/parser.c b/src/parser.c index 5399cfd..f3c6328 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1,19 +1,19 @@ /* -* Copyright (C) 2023 Johnny Richard -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <https://www.gnu.org/licenses/>. -*/ + * Copyright (C) 2023 Johnny Richard + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ #include <assert.h> #include <stdbool.h> @@ -38,7 +38,7 @@ parser_init(parser_t *parser, lexer_t *lexer) static void parser_error_push_unexpected_kind(parser_t *parser, token_t *token, token_kind_t expected) { - parser_error_t* error = &parser->errors[parser->errors_len++]; + parser_error_t *error = &parser->errors[parser->errors_len++]; error->token = *token; if (token->kind == TOKEN_EOF) { @@ -74,7 +74,8 @@ parser_parse_type(type_t *type, parser_t *parser) { token_t token; - if(!expected_token(&token, parser, TOKEN_NAME)) return false; + if (!expected_token(&token, parser, TOKEN_NAME)) + return false; if (string_view_eq(token.value, string_view_from_str("i32"))) { *type = TYPE_I32; @@ -84,11 +85,7 @@ parser_parse_type(type_t *type, parser_t *parser) parser_error_t error; error.token = token; - sprintf( - error.message, - "type '"SVFMT"' is not defined", - SVARG(&token.value) - ); + sprintf(error.message, "type '" SVFMT "' is not defined", SVARG(&token.value)); parser->errors[parser->errors_len++] = error; return false; @@ -114,7 +111,8 @@ parser_parse_factor(parser_t *parser, ast_node_t *node) return parser_literal_integer_node(node, &token); } else if (token.kind == TOKEN_OPAREN) { parser_parse_expression(parser, node); - if (!drop_expected_token(parser, TOKEN_CPAREN)) return false; + if (!drop_expected_token(parser, TOKEN_CPAREN)) + return false; return true; } else if (token.kind == TOKEN_NAME) { /// FIXME: Check if the identifier is defined @@ -125,12 +123,7 @@ parser_parse_factor(parser_t *parser, ast_node_t *node) // FIXME: Extract this erros logic to a function parser_error_t error; error.token = token; - sprintf( - error.message, - "unexpected '%s ("SVFMT")' token", - token_kind_to_str(token.kind), - SVARG(&token.value) - ); + sprintf(error.message, "unexpected '%s (" SVFMT ")' token", token_kind_to_str(token.kind), SVARG(&token.value)); parser->errors[parser->errors_len++] = error; return false; @@ -139,17 +132,20 @@ parser_parse_factor(parser_t *parser, ast_node_t *node) bool parser_parse_term(parser_t *parser, ast_node_t *node) { - if (!parser_parse_factor(parser, node)) return false; + if (!parser_parse_factor(parser, node)) + return false; token_t token; lexer_next_token(parser->lexer, &token); - while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("*")) || string_view_eq(token.value, string_view_from_str("/")))) { + while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("*")) || + string_view_eq(token.value, string_view_from_str("/")))) { ast_node_t *left = ast_node_new(); *left = *node; ast_node_t *right = ast_node_new(); - if (!parser_parse_factor(parser, right)) return false; + if (!parser_parse_factor(parser, right)) + return false; ast_node_init_binary_operation(node, token.value, left, right); @@ -171,17 +167,20 @@ parser_parse_term(parser_t *parser, ast_node_t *node) bool parser_parse_expression(parser_t *parser, ast_node_t *node) { - if (!parser_parse_term(parser, node)) return false; + if (!parser_parse_term(parser, node)) + return false; token_t token; lexer_next_token(parser->lexer, &token); - while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("+")) || string_view_eq(token.value, string_view_from_str("-")))) { + while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("+")) || + string_view_eq(token.value, string_view_from_str("-")))) { ast_node_t *left = ast_node_new(); *left = *node; ast_node_t *right = ast_node_new(); - if (!parser_parse_term(parser, right)) return false; + if (!parser_parse_term(parser, right)) + return false; ast_node_init_binary_operation(node, token.value, left, right); @@ -197,9 +196,11 @@ bool parser_parse_return_stmt(parser_t *parser, ast_node_t *node) { ast_node_t *argument_token = ast_node_new(); - if (!parser_parse_expression(parser, argument_token)) return false; + if (!parser_parse_expression(parser, argument_token)) + return false; - if (!drop_expected_token(parser, TOKEN_SEMICOLON)) return false; + if (!drop_expected_token(parser, TOKEN_SEMICOLON)) + return false; ast_node_init_return_stmt(node, argument_token); return true; @@ -208,26 +209,25 @@ parser_parse_return_stmt(parser_t *parser, ast_node_t *node) bool parser_parse_variable_definition(parser_t *parser, string_view_t variable_name, ast_node_t *node) { - if (!drop_expected_token(parser, TOKEN_COLON)) return false; + if (!drop_expected_token(parser, TOKEN_COLON)) + return false; type_t type; // FIXME: change the parameters order - if (!parser_parse_type(&type, parser)) return false; + if (!parser_parse_type(&type, parser)) + return false; token_t equal_token; - if (!expected_token(&equal_token, parser, TOKEN_OP)) return false; - + if (!expected_token(&equal_token, parser, TOKEN_OP)) + return false; + if (!string_view_eq(equal_token.value, string_view_from_str("="))) { parser_error_t error; error.token = equal_token; - sprintf( - error.message, - "expected '=' but got "SVFMT, - SVARG(&equal_token.value) - ); + sprintf(error.message, "expected '=' but got " SVFMT, SVARG(&equal_token.value)); parser->errors[parser->errors_len++] = error; return false; @@ -267,8 +267,7 @@ parser_parse_block_declarations(parser_t *parser, vector_t *body) } vector_push_back(body, return_node); - } - else { + } else { ast_node_t *variable_node = ast_node_new(); bool parsed_variable = parser_parse_variable_definition(parser, current_token.value, variable_node); @@ -294,10 +293,7 @@ parser_parse_block_declarations(parser_t *parser, vector_t *body) parser_error_t error; error.token = current_token; - sprintf( - error.message, - "expected 'return' keyword." - ); + sprintf(error.message, "expected 'return' keyword."); parser->errors[parser->errors_len++] = error; return false; @@ -314,28 +310,28 @@ parser_parse_function_declaration(parser_t *parser, ast_node_t *node) return false; } - if (!drop_expected_token(parser, TOKEN_OPAREN)) return false; - if (!drop_expected_token(parser, TOKEN_CPAREN)) return false; - if (!drop_expected_token(parser, TOKEN_COLON)) return false; + if (!drop_expected_token(parser, TOKEN_OPAREN)) + return false; + if (!drop_expected_token(parser, TOKEN_CPAREN)) + return false; + if (!drop_expected_token(parser, TOKEN_COLON)) + return false; type_t return_type; - if(!parser_parse_type(&return_type, parser)) { + if (!parser_parse_type(&return_type, parser)) { return false; } - if (!drop_expected_token(parser, TOKEN_OCURLY)) return false; + if (!drop_expected_token(parser, TOKEN_OCURLY)) + return false; - vector_t* body = vector_new(); + vector_t *body = vector_new(); - if (!parser_parse_block_declarations(parser, body)) return false; + if (!parser_parse_block_declarations(parser, body)) + return false; - ast_node_init_function_declaration( - node, - func_name_token.value, - return_type, - body - ); + ast_node_init_function_declaration(node, func_name_token.value, return_type, body); return true; } |