ast: placeness
This commit is contained in:
parent
099d774634
commit
2df4d182f9
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue