diff options
author | Carlos Maniero <carlos@maniero.me> | 2023-05-03 23:17:50 -0300 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2023-05-04 21:47:51 +0200 |
commit | e2e0ed950bb147ebca3b9ac879268feeb185e20b (patch) | |
tree | d6888d4468d75a9d4498f20976b66a3d4bd8575a /src/parser.c | |
parent | 8655b77d57ace45d4d040ef297cf172f3c12f4bd (diff) |
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 <carlos@maniero.me>
Reviewed-by: Johnny Richard <johnny@johnnyrichard.com>
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 21 |
1 files changed, 12 insertions, 9 deletions
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; } |