summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorJohnny Richard <johnny@johnnyrichard.com>2023-04-26 00:40:44 +0200
committerCarlos Maniero <carlosmaniero@gmail.com>2023-04-25 23:19:13 -0300
commit127dae1c3b48c3a4dceddb9000309bfeaa8d0a01 (patch)
tree4d92b3a7b4c29f0ace3a5ff699e4789f60b0aa46 /src/parser.c
parentc1a1bd2320b4c1508c4ab20d23b7c193a94d8026 (diff)
style: Use clang-format as formatter and linter tool
We want to keep the code style consistent, this first commit adds a .clang-format in order to "document" our style code. This patch also adds a target *linter* to Makefile which will complain if we have any style issue on test and src dirs. I have run the follow command to create the .clang-format file: $ clang-format -style=mozilla -dump-config > .clang-format And I also made some adjusts to .clang-format changing the following properties: PointerAlignment: Right ColumnLimit: 120 Commands executed to fix the current styling: $ find . -name *.h | xargs clang-format -i $ find . -name *.c | xargs clang-format -i Signed-off-by: Johnny Richard <johnny@johnnyrichard.com>
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c126
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;
}