ast: placeness
This commit is contained in:
parent
099d774634
commit
2df4d182f9
|
|
@ -265,7 +265,7 @@ parse_number:
|
|||
call panic
|
||||
|
||||
;; 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:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
|
|
@ -294,6 +294,7 @@ parse_primary_expr:
|
|||
mov rdi, [rsp] ; Ast
|
||||
mov rax, [rdi + 8] ; return Ast.nodes.len()
|
||||
dec rax
|
||||
mov rdx, 0 ; placeness = false
|
||||
jmp .epilogue
|
||||
.paren_expr:
|
||||
mov rdi, [rsp] ; Ast
|
||||
|
|
@ -312,7 +313,7 @@ parse_primary_expr:
|
|||
|
||||
;; rdi: *mut Ast
|
||||
;; 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:
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
|
|
@ -329,6 +330,8 @@ parse_binary_expr:
|
|||
sub rsp, 64
|
||||
; lexeme: Lexeme [32..56]
|
||||
; right: u64 [24..32]
|
||||
; right_placeness: u8 [20..21]
|
||||
; left_placeness: u8 [19..20]
|
||||
; our_precedence: u8 [18..19]
|
||||
; upper_precedence: u8 [17..18]
|
||||
; operator: u8 [16..17]
|
||||
|
|
@ -341,6 +344,7 @@ parse_binary_expr:
|
|||
|
||||
call parse_primary_expr
|
||||
mov [rsp + 8], rax ; left
|
||||
mov [rsp + 19], dl ; left_placeness
|
||||
|
||||
.loop:
|
||||
lea rdi, [rsp + 32] ; lexeme
|
||||
|
|
@ -391,6 +395,21 @@ parse_binary_expr:
|
|||
mov sil, [rsp + 18]
|
||||
call parse_binary_expr
|
||||
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 rsi, 8
|
||||
|
|
@ -563,3 +582,57 @@ parse_type:
|
|||
ret
|
||||
.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
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
unsafe extern "C" {
|
||||
pub unsafe fn parse_func(ast: *mut Ast) -> u64;
|
||||
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_binary_expr(ast: *mut Ast, precedence: u8) -> u64;
|
||||
pub unsafe fn parse_primary_expr(ast: *mut Ast) -> (u64, bool);
|
||||
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_statement(ast: *mut Ast) -> u64;
|
||||
pub unsafe fn parse_block(ast: *mut Ast) -> u64;
|
||||
|
|
|
|||
Loading…
Reference in a new issue