From 52c92386d70c0d5d8054abb58e9e2f25475917e2 Mon Sep 17 00:00:00 2001 From: uan Date: Wed, 4 Feb 2026 08:45:05 +0100 Subject: [PATCH] working scopes --- parser.v | 26 ++++++++++++++++++-------- test.one | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/parser.v b/parser.v index e4bf438..2128803 100644 --- a/parser.v +++ b/parser.v @@ -260,7 +260,7 @@ fn (mut p Parser) parse_statement() Stmt { .kw_let {return p.parse_var_decl()} .kw_return {return p.parse_return_stmt()} .kw_fn {return p.parse_func_decl()} - .lbracket {return p.parse_block()} + .lbracket {return p.parse_block(false)} else {return p.parse_expr_stmt()} } } @@ -275,7 +275,7 @@ fn (mut p Parser) parse_var_decl() VarDecl { type_tok := p.next() if type_tok.type != .type { - parse_error("Expected variable type after name") + parse_error("Expected variable type after name when declaring ${name_tok.text}") } p.expect(.equals) @@ -306,18 +306,21 @@ fn (mut p Parser) parse_func_decl() FuncDecl { name_tok := p.next() if name_tok.type != .identifier { - parse_error("Expected variable name after let") + parse_error("Expected function name after let") } p.expect(.lparen) p.expect(.rparen) + p.dump_token() + type_tok := p.next() if type_tok.type != .type { - parse_error("Expected variable type after name") + parse_error("Expected function return type after name when declaring ${name_tok.text}") } - block := p.parse_block() + p.symbols.variable_scopes << map[string]VarSymbolInfo{} + block := p.parse_block(true) return_stmts := p.get_return_stmts_recursive(block) @@ -328,6 +331,8 @@ fn (mut p Parser) parse_func_decl() FuncDecl { } } + p.symbols.variable_scopes.delete_last() + p.symbols.define_func(name_tok.text, type_tok.text) return FuncDecl { @@ -369,12 +374,15 @@ fn (mut p Parser) parse_expr_stmt() ExprStmt { } } -fn (mut p Parser) parse_block() Block { +fn (mut p Parser) parse_block(no_scope bool) Block { p.expect(.lbracket) mut statements := []Stmt{} - p.symbols.variable_scopes << map[string]VarSymbolInfo{} + if !no_scope { + p.symbols.variable_scopes << map[string]VarSymbolInfo{} + } + $if debug { println("entering scope") } @@ -391,7 +399,9 @@ fn (mut p Parser) parse_block() Block { parse_error("Unexpected use of return. Unreachable code") } - p.symbols.variable_scopes.delete_last() + if !no_scope { + p.symbols.variable_scopes.delete_last() + } $if debug { println("exiting scope") diff --git a/test.one b/test.one index 7a5d334..383b6d3 100644 --- a/test.one +++ b/test.one @@ -4,6 +4,6 @@ fn foo() int { return y; } -fn bar() float { +fn bar() real { return 5.5; }