From 84e52b1649c21162b5c661f180023a0ad0f5b67e Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 8 Sep 2025 15:50:50 +0100 Subject: [PATCH] lang: ast: replace var keyword with global local variables are now created automatically when they are first assigned to. the global keyword can be used to declare that a name refers to a global variable instead, at which point, assigning to the name results in the assignment referencing the global variable instead of allocating a new global variable. --- lang/ast/block.c | 6 ++-- lang/ast/{var.c => global.c} | 59 ++++++++++++++++++------------------ lang/ast/lambda.c | 3 -- lang/ast/node.c | 6 ++-- lang/ast/unit.c | 6 ++-- 5 files changed, 39 insertions(+), 41 deletions(-) rename lang/ast/{var.c => global.c} (63%) diff --git a/lang/ast/block.c b/lang/ast/block.c index eb13ad6..b85eda8 100644 --- a/lang/ast/block.c +++ b/lang/ast/block.c @@ -101,10 +101,10 @@ static struct token_parse_result parse_symbol( return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0); } -static struct token_parse_result parse_var( +static struct token_parse_result parse_global( struct ivy_parser *ctx, struct ivy_token *tok) { - parser_push_state(ctx, IVY_AST_VAR, 0); + parser_push_state(ctx, IVY_AST_GLOBAL, 0); return PARSE_RESULT(IVY_OK, 0); } @@ -157,7 +157,7 @@ struct ast_node_type block_node_ops = { .n_state_size = sizeof(struct block_parser_state), .n_node_size = sizeof(struct ivy_ast_block_node), .n_keyword_parsers = { - KW_PARSER(VAR, parse_var), + KW_PARSER(GLOBAL, parse_global), KW_PARSER(END, parse_end), KW_PARSER(ELSE, parse_else), KW_PARSER(ELIF, parse_else), /* same behaviour as ELSE */ diff --git a/lang/ast/var.c b/lang/ast/global.c similarity index 63% rename from lang/ast/var.c rename to lang/ast/global.c index fe172e3..5a8ebe3 100644 --- a/lang/ast/var.c +++ b/lang/ast/global.c @@ -5,22 +5,22 @@ #include -struct var_parser_state { +struct global_parser_state { struct parser_state s_base; unsigned int s_prev_token; }; static void init_state(struct ivy_parser *ctx, struct parser_state *sp, uintptr_t arg) { - struct var_parser_state *state = (struct var_parser_state *)sp; - state->s_prev_token = IVY_KW_VAR; + struct global_parser_state *state = (struct global_parser_state *)sp; + state->s_prev_token = IVY_KW_GLOBAL; } struct token_parse_result parse_ident(struct ivy_parser *ctx, struct ivy_token *tok) { - struct var_parser_state *state - = parser_get_state(ctx, struct var_parser_state); - if (state->s_prev_token != IVY_KW_VAR) { + struct global_parser_state *state + = parser_get_state(ctx, struct global_parser_state); + if (state->s_prev_token != IVY_KW_GLOBAL) { return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0); } @@ -35,10 +35,10 @@ struct token_parse_result parse_ident(struct ivy_parser *ctx, struct ivy_token * struct token_parse_result parse_left_paren( struct ivy_parser *ctx, struct ivy_token *tok) { - struct var_parser_state *state - = parser_get_state(ctx, struct var_parser_state); + struct global_parser_state *state + = parser_get_state(ctx, struct global_parser_state); - if (state->s_prev_token != IVY_KW_VAR) { + if (state->s_prev_token != IVY_KW_GLOBAL) { return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0); } @@ -51,11 +51,11 @@ struct token_parse_result parse_left_paren( struct token_parse_result parse_equal(struct ivy_parser *ctx, struct ivy_token *tok) { - struct var_parser_state *state - = parser_get_state(ctx, struct var_parser_state); - struct ivy_ast_var_node *var - = (struct ivy_ast_var_node *)state->s_base.s_node; - if (!var->n_left) { + struct global_parser_state *state + = parser_get_state(ctx, struct global_parser_state); + struct ivy_ast_global_node *global + = (struct ivy_ast_global_node *)state->s_base.s_node; + if (!global->n_left) { return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0); } @@ -77,23 +77,24 @@ struct token_parse_result parse_dot(struct ivy_parser *ctx, struct ivy_token *to static enum ivy_status add_child( struct parser_state *parent, struct ivy_ast_node *child) { - struct var_parser_state *state = (struct var_parser_state *)parent; - struct ivy_ast_var_node *var = (struct ivy_ast_var_node *)parent->s_node; + struct global_parser_state *state = (struct global_parser_state *)parent; + struct ivy_ast_global_node *global + = (struct ivy_ast_global_node *)parent->s_node; switch (state->s_prev_token) { - case IVY_KW_VAR: - if (var->n_left) { + case IVY_KW_GLOBAL: + if (global->n_left) { return IVY_ERR_BAD_SYNTAX; } - var->n_left = child; + global->n_left = child; break; case IVY_SYM_EQUAL: - if (var->n_val) { + if (global->n_val) { return IVY_ERR_BAD_SYNTAX; } - var->n_val = child; + global->n_val = child; break; default: return IVY_ERR_BAD_SYNTAX; @@ -105,22 +106,22 @@ static enum ivy_status add_child( static void collect_children( struct ivy_ast_node *node, struct ivy_ast_node_iterator *iterator) { - struct ivy_ast_var_node *var = (struct ivy_ast_var_node *)node; + struct ivy_ast_global_node *global = (struct ivy_ast_global_node *)node; - if (var->n_left) { - ast_node_iterator_enqueue_node(iterator, node, var->n_left); + if (global->n_left) { + ast_node_iterator_enqueue_node(iterator, node, global->n_left); } - if (var->n_val) { - ast_node_iterator_enqueue_node(iterator, node, var->n_val); + if (global->n_val) { + ast_node_iterator_enqueue_node(iterator, node, global->n_val); } } -struct ast_node_type var_node_ops = { +struct ast_node_type global_node_ops = { .n_add_child = add_child, .n_collect_children = collect_children, - .n_state_size = sizeof(struct var_parser_state), - .n_node_size = sizeof(struct ivy_ast_var_node), + .n_state_size = sizeof(struct global_parser_state), + .n_node_size = sizeof(struct ivy_ast_global_node), .n_init_state = init_state, .n_token_parsers = { TOK_PARSER(IDENT, parse_ident), diff --git a/lang/ast/lambda.c b/lang/ast/lambda.c index 24c0422..979974e 100644 --- a/lang/ast/lambda.c +++ b/lang/ast/lambda.c @@ -173,9 +173,6 @@ struct ast_node_type lambda_node_ops = { SYM_PARSER(PIPE, parse_pipe), SYM_PARSER(COLON, parse_colon), }, - .n_keyword_parsers = { - KW_PARSER(VAR, parse_expr_begin), - }, .n_expr_parser = { .expr_begin = parse_expr_begin, }, diff --git a/lang/ast/node.c b/lang/ast/node.c index c25a6dc..b276265 100644 --- a/lang/ast/node.c +++ b/lang/ast/node.c @@ -16,7 +16,7 @@ extern struct ast_node_type expr_node_ops; extern struct ast_node_type block_node_ops; extern struct ast_node_type msg_node_ops; extern struct ast_node_type op_node_ops; -extern struct ast_node_type var_node_ops; +extern struct ast_node_type global_node_ops; extern struct ast_node_type ident_node_ops; extern struct ast_node_type int_node_ops; extern struct ast_node_type double_node_ops; @@ -52,7 +52,7 @@ static const struct ast_node_type *node_ops[] = { [IVY_AST_BLOCK] = &block_node_ops, [IVY_AST_MSG] = &msg_node_ops, [IVY_AST_OP] = &op_node_ops, - [IVY_AST_VAR] = &var_node_ops, + [IVY_AST_GLOBAL] = &global_node_ops, [IVY_AST_IDENT] = &ident_node_ops, [IVY_AST_INT] = &int_node_ops, [IVY_AST_DOUBLE] = &double_node_ops, @@ -349,7 +349,7 @@ const char *ivy_ast_node_type_to_string(enum ivy_ast_node_type v) ENUM_STR(IVY_AST_UNIT_IMPORT); ENUM_STR(IVY_AST_DISCARD); ENUM_STR(IVY_AST_INT); - ENUM_STR(IVY_AST_VAR); + ENUM_STR(IVY_AST_GLOBAL); ENUM_STR(IVY_AST_DOUBLE); ENUM_STR(IVY_AST_STRING); ENUM_STR(IVY_AST_FSTRING); diff --git a/lang/ast/unit.c b/lang/ast/unit.c index 8335767..b7bf170 100644 --- a/lang/ast/unit.c +++ b/lang/ast/unit.c @@ -19,10 +19,10 @@ static struct token_parse_result parse_use_keyword( return PARSE_RESULT(IVY_OK, 0); } -static struct token_parse_result parse_var_keyword( +static struct token_parse_result parse_global_keyword( struct ivy_parser *ctx, struct ivy_token *tok) { - parser_push_state(ctx, IVY_AST_VAR, 0); + parser_push_state(ctx, IVY_AST_GLOBAL, 0); return PARSE_RESULT(IVY_OK, 0); } @@ -75,7 +75,7 @@ struct ast_node_type unit_node_ops = { KW_PARSER(PACKAGE, parse_package_keyword), KW_PARSER(CLASS, parse_class_keyword), KW_PARSER(USE, parse_use_keyword), - KW_PARSER(VAR, parse_var_keyword), + KW_PARSER(GLOBAL, parse_global_keyword), }, .n_symbol_parsers = { SYM_PARSER(DOT, parse_dot),