summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/lexer.c12
-rw-r--r--src/lexer.h2
-rw-r--r--src/parser.c21
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;
}