diff --git a/lang/src/ast.asm b/lang/src/ast.asm index 5343dec..a42caa3 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -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 diff --git a/lang/tests/ast.rs b/lang/tests/ast.rs index 6b9e0af..9f68be6 100644 --- a/lang/tests/ast.rs +++ b/lang/tests/ast.rs @@ -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; }",