block as statement

This commit is contained in:
janis 2025-10-31 14:18:49 +01:00
parent 6041ec5102
commit c52b7ab8de
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 18 additions and 1 deletions

View file

@ -591,8 +591,17 @@ parse_statement:
call expect_token
test rax, rax
jnz .let
mov dil, TOKEN_LBRACE
call peek_expect_token ; parse_block expects lbrace to still be there
jnz .block
jmp .panic
.block:
mov rdi, [rsp] ; Ast
call parse_block
; Blocks don't require a trailing semicolon
jmp .epilogue
.let:
mov rdi, [rsp] ; Ast
call ast_parse_let
@ -617,6 +626,7 @@ parse_statement:
mov dil, TOKEN_SEMI
call unwrap_token
mov rax, [rsp] ; expression
.epilogue:
add rsp, 40
pop rbp
ret
@ -652,7 +662,7 @@ parse_block:
mov rdx, 0 ; drop = None
mov rcx, 64 ; capacity
call vec_init_with
nop
.loop:
mov dil, TOKEN_RBRACE
call peek_expect_token
@ -673,6 +683,10 @@ parse_block:
call vec_push
jmp .loop
.done:
; eat the closing brace
mov dil, TOKEN_RBRACE
call unwrap_token
mov rdi, [rsp + 56] ; Ast
mov qword [rsp], AST_BLOCK ; AstNode.kind
mov rsi, [rsp + 64] ; span

View file

@ -82,6 +82,9 @@ fn main() {
print_ast(
b"fn main(a: u32) -> void {
let y: u32 = a + 4;
{
let y: u32 = 10;
}
let y: *u32 = &y;
return *y;
}",