From 2df4d182f928ab328a653c85129b071709f2aefc Mon Sep 17 00:00:00 2001 From: janis Date: Thu, 30 Oct 2025 00:31:51 +0100 Subject: [PATCH] ast: placeness --- lang/src/ast.asm | 77 ++++++++++++++++++++++++++++++++++++++- lang/tests/shared/defs.rs | 4 +- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/lang/src/ast.asm b/lang/src/ast.asm index 5c011da..8fea220 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -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 diff --git a/lang/tests/shared/defs.rs b/lang/tests/shared/defs.rs index 6b1cb5b..df0959a 100644 --- a/lang/tests/shared/defs.rs +++ b/lang/tests/shared/defs.rs @@ -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;