diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lexer.c | 12 | ||||
-rw-r--r-- | src/lexer.h | 2 | ||||
-rw-r--r-- | src/parser.c | 21 |
3 files changed, 26 insertions, 9 deletions
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; } |