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/parser.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'src/parser.c') 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