From e2e0ed950bb147ebca3b9ac879268feeb185e20b Mon Sep 17 00:00:00 2001 From: Carlos Maniero Date: Wed, 3 May 2023 23:17:50 -0300 Subject: parser: Introduce statement keywords This commit introduces a few changes in pipalang syntax. Now, both functions and variables requires keywords to be defined. before: main(): i32 { a: i32 = 2; return a; } now: fn main(): i32 { let a: i32 = 2; return a; } Signed-off-by: Carlos Maniero Reviewed-by: Johnny Richard --- src/lexer.c | 12 ++++++++++++ src/lexer.h | 2 ++ src/parser.c | 21 ++++++++++++--------- 3 files changed, 26 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/lexer.c b/src/lexer.c index 3f6948a..56e24af 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -97,10 +97,18 @@ lexer_tokenize_name(lexer_t *lexer, token_t *token) static void lexer_token_process_keyword(token_t *token) { + if (string_view_eq(string_view_from_str("let"), token->value)) { + token->kind = TOKEN_KEYWORD_LET; + return; + } if (string_view_eq(string_view_from_str("return"), token->value)) { token->kind = TOKEN_KEYWORD_RETURN; return; } + if (string_view_eq(string_view_from_str("fn"), token->value)) { + token->kind = TOKEN_KEYWORD_FN; + return; + } } void @@ -318,6 +326,10 @@ token_kind_to_str(token_kind_t kind) return "="; case TOKEN_KEYWORD_RETURN: return "return"; + case TOKEN_KEYWORD_FN: + return "fn"; + case TOKEN_KEYWORD_LET: + return "let"; case TOKEN_EOF: return "TOKEN_EOF"; case TOKEN_UNKNOWN: diff --git a/src/lexer.h b/src/lexer.h index 9aa8efe..6449a0a 100644 --- a/src/lexer.h +++ b/src/lexer.h @@ -38,6 +38,8 @@ typedef enum TOKEN_SLASH, TOKEN_EQUAL, TOKEN_KEYWORD_RETURN, + TOKEN_KEYWORD_FN, + TOKEN_KEYWORD_LET, TOKEN_EOF, TOKEN_UNKNOWN } token_kind_t; diff --git a/src/parser.c b/src/parser.c index 82d25f5..49803eb 100644 --- a/src/parser.c +++ b/src/parser.c @@ -296,9 +296,14 @@ parser_parse_variable_assignment(parser_t *parser) } static ast_node_t * -parser_parse_variable_definition(parser_t *parser) +parser_parse_variable_declaration(parser_t *parser) { token_t variable_name; + + if (!drop_expected_token(parser, TOKEN_KEYWORD_LET)) { + return NULL; + } + if (!expected_token(&variable_name, parser, TOKEN_NAME)) { return NULL; } @@ -340,13 +345,7 @@ is_next_statement_a_variable_declaration(parser_t *parser) token_t token; lexer_peek_next_token(parser->lexer, &token); - if (token.kind != TOKEN_NAME) { - return false; - } - - lexer_lookahead(parser->lexer, &token, 2); - - return token.kind == TOKEN_COLON; + return token.kind == TOKEN_KEYWORD_LET; } static bool @@ -440,7 +439,7 @@ parser_parse_block_declarations(parser_t *parser) } if (is_next_statement_a_variable_declaration(parser)) { - ast_node_t *variable_node = parser_parse_variable_definition(parser); + ast_node_t *variable_node = parser_parse_variable_declaration(parser); if (variable_node == NULL) { scope_leave(parser->scope); @@ -493,6 +492,10 @@ parser_parse_function_declaration(parser_t *parser) { token_t func_name_token; + if (!drop_expected_token(parser, TOKEN_KEYWORD_FN)) { + return NULL; + } + if (!expected_token(&func_name_token, parser, TOKEN_NAME)) { return NULL; } -- cgit v1.2.3