ast: placeness

This commit is contained in:
janis 2025-10-30 00:31:51 +01:00
parent 099d774634
commit 2df4d182f9
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 77 additions and 4 deletions

View file

@ -265,7 +265,7 @@ parse_number:
call panic call panic
;; rdi: *mut Ast ;; rdi: *mut Ast
;; define-fn: fn parse_primary_expr(ast: *mut Ast) -> u64 ;; define-fn: fn parse_primary_expr(ast: *mut Ast) -> (u64, bool)
parse_primary_expr: parse_primary_expr:
push rbp push rbp
mov rbp, rsp mov rbp, rsp
@ -294,6 +294,7 @@ parse_primary_expr:
mov rdi, [rsp] ; Ast mov rdi, [rsp] ; Ast
mov rax, [rdi + 8] ; return Ast.nodes.len() mov rax, [rdi + 8] ; return Ast.nodes.len()
dec rax dec rax
mov rdx, 0 ; placeness = false
jmp .epilogue jmp .epilogue
.paren_expr: .paren_expr:
mov rdi, [rsp] ; Ast mov rdi, [rsp] ; Ast
@ -312,7 +313,7 @@ parse_primary_expr:
;; rdi: *mut Ast ;; rdi: *mut Ast
;; sil: precedence ;; sil: precedence
;; define-fn: fn parse_binary_expr(ast: *mut Ast, precedence: u8) -> u64 ;; define-fn: fn parse_binary_expr(ast: *mut Ast, precedence: u8) -> (u64, bool)
parse_binary_expr: parse_binary_expr:
push rbp push rbp
mov rbp, rsp mov rbp, rsp
@ -329,6 +330,8 @@ parse_binary_expr:
sub rsp, 64 sub rsp, 64
; lexeme: Lexeme [32..56] ; lexeme: Lexeme [32..56]
; right: u64 [24..32] ; right: u64 [24..32]
; right_placeness: u8 [20..21]
; left_placeness: u8 [19..20]
; our_precedence: u8 [18..19] ; our_precedence: u8 [18..19]
; upper_precedence: u8 [17..18] ; upper_precedence: u8 [17..18]
; operator: u8 [16..17] ; operator: u8 [16..17]
@ -341,6 +344,7 @@ parse_binary_expr:
call parse_primary_expr call parse_primary_expr
mov [rsp + 8], rax ; left mov [rsp + 8], rax ; left
mov [rsp + 19], dl ; left_placeness
.loop: .loop:
lea rdi, [rsp + 32] ; lexeme lea rdi, [rsp + 32] ; lexeme
@ -391,6 +395,21 @@ parse_binary_expr:
mov sil, [rsp + 18] mov sil, [rsp + 18]
call parse_binary_expr call parse_binary_expr
mov [rsp + 24], rax ; right mov [rsp + 24], rax ; right
mov [rsp + 20], dl ; right_placeness
; convert left and right to values
mov rdi, [rsp] ; Ast
mov rsi, [rsp + 8] ; left
mov dl, [rsp + 19] ; left_placeness
call ast_place_to_value
mov [rsp + 8], rax ; left
mov rdi, [rsp] ; Ast
mov rsi, [rsp + 24] ; right
mov dl, [rsp + 20] ; right_placeness
call ast_place_to_value
mov [rsp + 24], rax ; right
mov rdi, 24 mov rdi, 24
mov rsi, 8 mov rsi, 8
@ -563,3 +582,57 @@ parse_type:
ret ret
.panic: .panic:
call panic call panic
;; rdi: *mut Ast
;; rsi: index of node
;; rdx: is_placeness
;; fn ast_value_to_place(ast: *mut Ast, node_index: u64, is_placeness: bool) -> u64
ast_value_to_place:
push rbp
mov rbp, rsp
cmp dl, 0
xor rax, rax
je .done
; create new AST node
sub rsp, 32
mov [rsp], rdi
mov byte [rsp + 8], AST_VALUE_TO_PLACE ; kind
mov [rsp + 16], rsi ; data
mov qword [rsp + 24], 0 ; extra
lea rsi, [rsp + 8] ; &AstNode
call vec_push
mov rdi, [rsp] ; Ast
mov rax, [rdi + 8] ; Ast.nodes.len()
dec rax
add rsp, 32
.done:
pop rbp
ret
;; rdi: *mut Ast
;; rsi: index of node
;; rdx: is_placeness
;; fn ast_place_to_value(ast: *mut Ast, node_index: u64, is_placeness: bool) -> u64
ast_place_to_value:
push rbp
mov rbp, rsp
cmp dl, 1
xor rax, rax
je .done
; create new AST node
sub rsp, 32
mov [rsp], rdi
mov byte [rsp + 8], AST_PLACE_TO_VALUE ; kind
mov [rsp + 16], rsi ; data
mov qword [rsp + 24], 0 ; extra
lea rsi, [rsp + 8] ; &AstNode
call vec_push
mov rdi, [rsp] ; Ast
mov rax, [rdi + 8] ; Ast.nodes.len()
dec rax
add rsp, 32
.done:
pop rbp
ret

View file

@ -4,8 +4,8 @@
unsafe extern "C" { unsafe extern "C" {
pub unsafe fn parse_func(ast: *mut Ast) -> u64; pub unsafe fn parse_func(ast: *mut Ast) -> u64;
pub unsafe fn parse_args(ast: *mut Ast) -> (*const Argument, usize); pub unsafe fn parse_args(ast: *mut Ast) -> (*const Argument, usize);
pub unsafe fn parse_primary_expr(ast: *mut Ast) -> u64; pub unsafe fn parse_primary_expr(ast: *mut Ast) -> (u64, bool);
pub unsafe fn parse_binary_expr(ast: *mut Ast, precedence: u8) -> u64; pub unsafe fn parse_binary_expr(ast: *mut Ast, precedence: u8) -> (u64, bool);
pub unsafe fn parse_expr(ast: *mut Ast) -> u64; pub unsafe fn parse_expr(ast: *mut Ast) -> u64;
pub unsafe fn parse_statement(ast: *mut Ast) -> u64; pub unsafe fn parse_statement(ast: *mut Ast) -> u64;
pub unsafe fn parse_block(ast: *mut Ast) -> u64; pub unsafe fn parse_block(ast: *mut Ast) -> u64;