diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-24 00:09:29 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-24 00:09:29 +0000 |
| commit | 27d041865d17a4055e7e6b3e297656d6f35a0f3b (patch) | |
| tree | 8fe0cbd2fecf24a6da3150dc4a2666a1c6dec0c3 /src/parser/parser_decl.c | |
| parent | 1991cb62d26b954e54cf13c2d765fb3a0bbaa3ca (diff) | |
Welcome to 'def' + changed 'const'
Diffstat (limited to 'src/parser/parser_decl.c')
| -rw-r--r-- | src/parser/parser_decl.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/parser/parser_decl.c b/src/parser/parser_decl.c index 5cac0b4..87b15ad 100644 --- a/src/parser/parser_decl.c +++ b/src/parser/parser_decl.c @@ -701,9 +701,9 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l) return n; } -ASTNode *parse_const(ParserContext *ctx, Lexer *l) +ASTNode *parse_def(ParserContext *ctx, Lexer *l) { - lexer_next(l); // eat const + lexer_next(l); // eat def Token n = lexer_next(l); char *type_str = NULL; @@ -723,7 +723,14 @@ ASTNode *parse_const(ParserContext *ctx, Lexer *l) type_obj = type_new(TYPE_UNKNOWN); // Ensure we have an object } type_obj->is_const = 1; + + // Use is_def flag for manifest constants add_symbol(ctx, ns, type_str ? type_str : "unknown", type_obj); + Symbol *sym_entry = find_symbol_entry(ctx, ns); + if (sym_entry) { + sym_entry->is_def = 1; + // is_const_value set only if literal + } ASTNode *i = 0; if (lexer_peek(l).type == TOK_OP && is_token(lexer_peek(l), "=")) @@ -741,6 +748,7 @@ ASTNode *parse_const(ParserContext *ctx, Lexer *l) { s->is_const_value = 1; s->const_int_val = val; + s->is_def = 1; // Double ensure if (!s->type_name || strcmp(s->type_name, "unknown") == 0) { @@ -754,6 +762,7 @@ ASTNode *parse_const(ParserContext *ctx, Lexer *l) free(s->type_info); } s->type_info = type_new(TYPE_INT); + s->type_info->is_const = 1; } } } @@ -771,7 +780,7 @@ ASTNode *parse_const(ParserContext *ctx, Lexer *l) } else { - lexer_next(l); + zpanic_at(n, "'def' constants must be initialized"); } if (lexer_peek(l).type == TOK_SEMICOLON) @@ -783,6 +792,7 @@ ASTNode *parse_const(ParserContext *ctx, Lexer *l) o->var_decl.name = ns; o->var_decl.type_str = type_str; o->var_decl.init_expr = i; + // Store extra metadata if needed, but NODE_CONST usually suffices if (!ctx->current_scope || !ctx->current_scope->parent) { @@ -805,10 +815,7 @@ ASTNode *parse_type_alias(ParserContext *ctx, Lexer *l) char *o = parse_type(ctx, l); - lexer_next(l); // consume ';' (parse_type doesn't consume it? parse_type calls parse_type_formal - // which doesn't consume ;?) - // Note: parse_type_stmt usually expects ; but parse_type just parses type expression. - // Check previous implementation: it had lexer_next(l) at end. This assumes ;. + lexer_next(l); ASTNode *node = ast_create(NODE_TYPE_ALIAS); node->type_alias.alias = xmalloc(n.len + 1); |
