block as statement
This commit is contained in:
parent
6041ec5102
commit
c52b7ab8de
|
|
@ -591,8 +591,17 @@ parse_statement:
|
||||||
call expect_token
|
call expect_token
|
||||||
test rax, rax
|
test rax, rax
|
||||||
jnz .let
|
jnz .let
|
||||||
|
mov dil, TOKEN_LBRACE
|
||||||
|
call peek_expect_token ; parse_block expects lbrace to still be there
|
||||||
|
jnz .block
|
||||||
jmp .panic
|
jmp .panic
|
||||||
|
|
||||||
|
.block:
|
||||||
|
mov rdi, [rsp] ; Ast
|
||||||
|
call parse_block
|
||||||
|
; Blocks don't require a trailing semicolon
|
||||||
|
jmp .epilogue
|
||||||
|
|
||||||
.let:
|
.let:
|
||||||
mov rdi, [rsp] ; Ast
|
mov rdi, [rsp] ; Ast
|
||||||
call ast_parse_let
|
call ast_parse_let
|
||||||
|
|
@ -617,6 +626,7 @@ parse_statement:
|
||||||
mov dil, TOKEN_SEMI
|
mov dil, TOKEN_SEMI
|
||||||
call unwrap_token
|
call unwrap_token
|
||||||
mov rax, [rsp] ; expression
|
mov rax, [rsp] ; expression
|
||||||
|
.epilogue:
|
||||||
add rsp, 40
|
add rsp, 40
|
||||||
pop rbp
|
pop rbp
|
||||||
ret
|
ret
|
||||||
|
|
@ -652,7 +662,7 @@ parse_block:
|
||||||
mov rdx, 0 ; drop = None
|
mov rdx, 0 ; drop = None
|
||||||
mov rcx, 64 ; capacity
|
mov rcx, 64 ; capacity
|
||||||
call vec_init_with
|
call vec_init_with
|
||||||
|
nop
|
||||||
.loop:
|
.loop:
|
||||||
mov dil, TOKEN_RBRACE
|
mov dil, TOKEN_RBRACE
|
||||||
call peek_expect_token
|
call peek_expect_token
|
||||||
|
|
@ -673,6 +683,10 @@ parse_block:
|
||||||
call vec_push
|
call vec_push
|
||||||
jmp .loop
|
jmp .loop
|
||||||
.done:
|
.done:
|
||||||
|
; eat the closing brace
|
||||||
|
mov dil, TOKEN_RBRACE
|
||||||
|
call unwrap_token
|
||||||
|
|
||||||
mov rdi, [rsp + 56] ; Ast
|
mov rdi, [rsp + 56] ; Ast
|
||||||
mov qword [rsp], AST_BLOCK ; AstNode.kind
|
mov qword [rsp], AST_BLOCK ; AstNode.kind
|
||||||
mov rsi, [rsp + 64] ; span
|
mov rsi, [rsp + 64] ; span
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,9 @@ fn main() {
|
||||||
print_ast(
|
print_ast(
|
||||||
b"fn main(a: u32) -> void {
|
b"fn main(a: u32) -> void {
|
||||||
let y: u32 = a + 4;
|
let y: u32 = a + 4;
|
||||||
|
{
|
||||||
|
let y: u32 = 10;
|
||||||
|
}
|
||||||
let y: *u32 = &y;
|
let y: *u32 = &y;
|
||||||
return *y;
|
return *y;
|
||||||
}",
|
}",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue