can parse call expressions

This commit is contained in:
janis 2025-11-03 21:53:25 +01:00
parent 9abd3f0f69
commit b1b48813d2
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
4 changed files with 139 additions and 83 deletions

View file

@ -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

View file

@ -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) },
);

View file

@ -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",
})
})

View file

@ -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;