From b1b48813d2a8a1bd5716a3b7e958427ee45ae50b Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 3 Nov 2025 21:53:25 +0100 Subject: [PATCH] can parse call expressions --- lang/src/ast.asm | 86 +++++++++++++++++----- lang/tests/ast.rs | 128 ++++++++++++++++----------------- lang/tests/shared/ast_debug.rs | 1 + lang/tests/shared/defs.rs | 7 +- 4 files changed, 139 insertions(+), 83 deletions(-) diff --git a/lang/src/ast.asm b/lang/src/ast.asm index 4c53dad..460f3eb 100644 --- a/lang/src/ast.asm +++ b/lang/src/ast.asm @@ -1305,11 +1305,11 @@ symkey_cmp: mov [rsp], rsi mov [rsp + 8], rdx - mov al, byte [rsi] ; a.kind - mov bl, byte [rdx] ; b.kind - cmp al, bl - jl .a_less - jg .a_greater + ; mov al, byte [rsi] ; a.kind + ; mov bl, byte [rdx] ; b.kind + ; cmp al, bl + ; jl .a_less + ; jg .a_greater mov rax, [rsi + 8] ; a.scope_index mov rbx, [rdx + 8] ; b.scope_index @@ -1328,6 +1328,12 @@ symkey_cmp: mov rsi, [rsp] mov rdx, [rsp + 8] + mov al, byte [rsi] ; a.kind + mov bl, byte [rdx] ; b.kind + cmp al, bl + jl .a_less + jg .a_greater + mov rax, [rsi + 16] ; a.span mov rbx, [rdx + 16] ; b.span cmp rax, rbx @@ -1353,9 +1359,10 @@ section .rdata SYM_KEY_SCOPE_NAME equ 2 ; :u8 SYM_KEY_PARENT_SCOPE equ 3 ; :u8 SYM_KEY_START_LOCALS equ 4 ; :u8 - SYM_KEY_ARG equ 5 ; :u8 - SYM_KEY_VAR equ 6 ; :u8 - SYM_KEY_END_LOCALS equ 7 ; :u8 + SYM_KEY_FUNCTION equ 5 ; :u8 + SYM_KEY_ARG equ 6 ; :u8 + SYM_KEY_VAR equ 7 ; :u8 + SYM_KEY_END_LOCALS equ 8 ; :u8 ;; end-consts section .text @@ -1507,9 +1514,29 @@ ast_build_symtable_for_each: jmp .insert_scope .func: - ; use function name as scope name - mov rbx, [rax + 8] ; AstNode.data + + ; insert function symbol + mov byte [rsp + 32], SYM_KEY_FUNCTION ; SymKey.kind + mov rdx, [rsp + 88] ; index + mov qword [rsp + 40], rdx ; SymKey.scope_index + mov rdx, [rax + 24] ; AstNode.span + mov qword [rsp + 48], rdx ; SymKey.span + mov rdx, [rbx + 0] ; Func.name + mov rcx, [rbx + 8] ; Func.name_len + mov [rsp + 56], rdx ; SymKey.ident + mov [rsp + 64], rcx ; SymKey.ident_len + mov rdx, [rsp + 16] ; index + mov [rsp + 72], rdx ; SymEntry.index + mov qword [rsp + 80], 0 ; SymEntry.extra + + mov rdi, [rsp + 8] ; Ctx.symtable + lea rsi, [rsp + 32] ; &SymEntry + mov rcx, 0 ; cmp_ctx + mov rdx, symkey_cmp ; cmp + call vec_insert_sorted + + ; use function name as scope name mov rdx, [rbx + 0] ; Func.name mov rcx, [rbx + 8] ; Func.name_len @@ -1519,12 +1546,13 @@ ast_build_symtable_for_each: .insert_scope: ; insert scope entry mov byte [rsp + 32], SYM_KEY_SCOPE ; SymKey.kind - mov rdx, [rsp + 16] ; index - mov qword [rsp + 40], rdx ; SymKey.scope_index - mov rdx, [rax + 24] ; AstNode.span - mov qword [rsp + 48], rdx ; SymKey.span - mov qword [rsp + 56], 1 ; SymKey.ident - mov qword [rsp + 64], 0 ; SymKey.ident_len + mov rdx, [rsp + 16] ; index + mov qword [rsp + 40], rdx ; SymKey.scope_index + mov rax, [rsp + 24] ; *AstNode + mov rdx, [rax + 24] ; AstNode.span + mov qword [rsp + 48], rdx ; SymKey.span + mov qword [rsp + 56], 1 ; SymKey.ident + mov qword [rsp + 64], 0 ; SymKey.ident_len mov rdi, [rsp + 8] ; Ctx.symtable lea rsi, [rsp + 32] ; &SymEntry @@ -1699,6 +1727,27 @@ ast_walk_for_each: je .return_statement cmp bl, AST_IF je .if_expr + cmp bl, AST_CALL + je .call + jmp .check_scope + +.call: + mov rbx, [rax + 8] ; AstNode.data = *AstCallExpr + mov rax, [rbx + 0] ; AstCallExpr.callee + push rax ; push callee index + + mov r15, [rbx + 16] ; AstCallExpr.args_len + xor r14, r14 ; index +.call_params: + cmp r14, r15 + jge .call_params_done + mov rdx, [rbx + 8] ; AstCallExpr.args + lea rdx, [rdx + r14*8] + mov rax, [rdx] ; arg index + push rax ; push arg index + inc r14 + jmp .call_params +.call_params_done: jmp .check_scope .func: @@ -1898,6 +1947,11 @@ ast_resolve_var_refs_for_each: call vec_get mov rbx, rax ; *SymEntry + ; check symbol entry kind + mov al, byte [rbx + 0] ; SymEntry.key.kind + cmp al, SYM_KEY_START_LOCALS + jb .parent + ; compare symbol ident with var_ref ident mov rdi, [rbx + 24] ; SymEntry.key.ident mov rsi, [rbx + 32] ; SymEntry.key.ident_len diff --git a/lang/tests/ast.rs b/lang/tests/ast.rs index a708ee3..4e841c3 100644 --- a/lang/tests/ast.rs +++ b/lang/tests/ast.rs @@ -58,75 +58,75 @@ fn main() { }; } - // print_ast( - // b"fn main() -> void { return 1 * 2 + 3 * 4; }", - // |ast| unsafe { parse_func(ast) }, - // ); + print_ast( + b"fn main() -> void { return 1 * 2 + 3 * 4; }", + |ast| unsafe { parse_func(ast) }, + ); - // print_ast(b"3 + 4", |ast| unsafe { parse_expr(ast) }); - // print_ast(b"fn main() -> void { return 1 + 2; }", |ast| unsafe { - // parse_func(ast) - // }); - // print_ast( - // b"fn main() -> void { ;;;return (1 + (2)); }", - // |ast| unsafe { parse_func(ast) }, - // ); - // print_ast( - // b"fn main() -> void { return (1 + (2 * 3)) / 4; }", - // |ast| unsafe { parse_func(ast) }, - // ); - // print_ast(b"fn main() -> void { return 1 + 2 * 3; }", |ast| unsafe { - // parse_func(ast) - // }); + print_ast(b"3 + 4", |ast| unsafe { parse_expr(ast) }); + print_ast(b"fn main() -> void { return 1 + 2; }", |ast| unsafe { + parse_func(ast) + }); + print_ast( + b"fn main() -> void { ;;;return (1 + (2)); }", + |ast| unsafe { parse_func(ast) }, + ); + print_ast( + b"fn main() -> void { return (1 + (2 * 3)) / 4; }", + |ast| unsafe { parse_func(ast) }, + ); + print_ast(b"fn main() -> void { return 1 + 2 * 3; }", |ast| unsafe { + parse_func(ast) + }); - // print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe { - // parse_func(ast) - // }); - // print_ast( - // b"fn main(a: u32) -> void { let x: u32 = a + 4; }", - // |ast| unsafe { parse_func(ast) }, - // ); - // print_ast( - // b"fn main(a: u32) -> void { - // let y: u32 = a + 4; - // let y: *u32 = &y; - // return *y; - // }", - // |ast| unsafe { parse_func(ast) }, - // ); - // print_ast( - // b"fn main(a: u32) -> void { - // let y: u32 = a + 4; - // { - // let y: u32 = 10; - // } - // let y: *u32 = &y; - // return *y; - // }", - // |ast| unsafe { parse_func(ast) }, - // ); - // print_ast( - // b"fn main(a: *u32, b: u32) -> void { - // *a = b; - // a = &b; - // }", - // |ast| unsafe { parse_func(ast) }, - // ); - - // print_ast( - // b"fn main(a: u32) -> void { - // if (a == 0) { - // return 1; - // } else { - // return 0; - // } - // }", - // |ast| unsafe { parse_func(ast) }, - // ); + print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe { + parse_func(ast) + }); + print_ast( + b"fn main(a: u32) -> void { let x: u32 = a + 4; }", + |ast| unsafe { parse_func(ast) }, + ); + print_ast( + b"fn main(a: u32) -> void { + let y: u32 = a + 4; + let y: *u32 = &y; + return *y; + }", + |ast| unsafe { parse_func(ast) }, + ); + print_ast( + b"fn main(a: u32) -> void { + let y: u32 = a + 4; + { + let y: u32 = 10; + } + let y: *u32 = &y; + return *y; + }", + |ast| unsafe { parse_func(ast) }, + ); + print_ast( + b"fn main(a: *u32, b: u32) -> void { + *a = b; + a = &b; + }", + |ast| unsafe { parse_func(ast) }, + ); print_ast( b"fn main(a: u32) -> void { -return a(1,2); + if (a == 0) { + return 1; + } else { + return 0; + } + }", + |ast| unsafe { parse_func(ast) }, + ); + + print_ast( + b"fn main(a: u32) -> void { +return main(1); }", |ast| unsafe { parse_func(ast) }, ); diff --git a/lang/tests/shared/ast_debug.rs b/lang/tests/shared/ast_debug.rs index dd413b0..7a81968 100644 --- a/lang/tests/shared/ast_debug.rs +++ b/lang/tests/shared/ast_debug.rs @@ -153,6 +153,7 @@ impl core::fmt::Display for util::defs::SymEntry { util::defs::SYM_KEY_PARENT_SCOPE => "ParentScope", util::defs::SYM_KEY_ARG => "Argument", util::defs::SYM_KEY_VAR => "Variable", + util::defs::SYM_KEY_FUNCTION => "Function", _ => "Unknown", }) }) diff --git a/lang/tests/shared/defs.rs b/lang/tests/shared/defs.rs index 3492017..a56928f 100644 --- a/lang/tests/shared/defs.rs +++ b/lang/tests/shared/defs.rs @@ -39,9 +39,10 @@ pub const SYM_KEY_SCOPE: u8 = 1; pub const SYM_KEY_SCOPE_NAME: u8 = 2; pub const SYM_KEY_PARENT_SCOPE: u8 = 3; pub const SYM_KEY_START_LOCALS: u8 = 4; -pub const SYM_KEY_ARG: u8 = 5; -pub const SYM_KEY_VAR: u8 = 6; -pub const SYM_KEY_END_LOCALS: u8 = 7; +pub const SYM_KEY_FUNCTION: u8 = 5; +pub const SYM_KEY_ARG: u8 = 6; +pub const SYM_KEY_VAR: u8 = 7; +pub const SYM_KEY_END_LOCALS: u8 = 8; pub const AST_FUNCTION: u8 = 1; pub const AST_BLOCK: u8 = 2; pub const AST_VARIABLE: u8 = 3;