summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorCarlos Maniero <carlos@maniero.me>2023-05-03 23:17:50 -0300
committerJohnny Richard <johnny@johnnyrichard.com>2023-05-04 21:47:51 +0200
commite2e0ed950bb147ebca3b9ac879268feeb185e20b (patch)
treed6888d4468d75a9d4498f20976b66a3d4bd8575a /src/parser.c
parent8655b77d57ace45d4d040ef297cf172f3c12f4bd (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.c21
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;
}