can parse call expressions
This commit is contained in:
parent
9abd3f0f69
commit
b1b48813d2
|
|
@ -1305,11 +1305,11 @@ symkey_cmp:
|
||||||
mov [rsp], rsi
|
mov [rsp], rsi
|
||||||
mov [rsp + 8], rdx
|
mov [rsp + 8], rdx
|
||||||
|
|
||||||
mov al, byte [rsi] ; a.kind
|
; mov al, byte [rsi] ; a.kind
|
||||||
mov bl, byte [rdx] ; b.kind
|
; mov bl, byte [rdx] ; b.kind
|
||||||
cmp al, bl
|
; cmp al, bl
|
||||||
jl .a_less
|
; jl .a_less
|
||||||
jg .a_greater
|
; jg .a_greater
|
||||||
|
|
||||||
mov rax, [rsi + 8] ; a.scope_index
|
mov rax, [rsi + 8] ; a.scope_index
|
||||||
mov rbx, [rdx + 8] ; b.scope_index
|
mov rbx, [rdx + 8] ; b.scope_index
|
||||||
|
|
@ -1328,6 +1328,12 @@ symkey_cmp:
|
||||||
|
|
||||||
mov rsi, [rsp]
|
mov rsi, [rsp]
|
||||||
mov rdx, [rsp + 8]
|
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 rax, [rsi + 16] ; a.span
|
||||||
mov rbx, [rdx + 16] ; b.span
|
mov rbx, [rdx + 16] ; b.span
|
||||||
cmp rax, rbx
|
cmp rax, rbx
|
||||||
|
|
@ -1353,9 +1359,10 @@ section .rdata
|
||||||
SYM_KEY_SCOPE_NAME equ 2 ; :u8
|
SYM_KEY_SCOPE_NAME equ 2 ; :u8
|
||||||
SYM_KEY_PARENT_SCOPE equ 3 ; :u8
|
SYM_KEY_PARENT_SCOPE equ 3 ; :u8
|
||||||
SYM_KEY_START_LOCALS equ 4 ; :u8
|
SYM_KEY_START_LOCALS equ 4 ; :u8
|
||||||
SYM_KEY_ARG equ 5 ; :u8
|
SYM_KEY_FUNCTION equ 5 ; :u8
|
||||||
SYM_KEY_VAR equ 6 ; :u8
|
SYM_KEY_ARG equ 6 ; :u8
|
||||||
SYM_KEY_END_LOCALS equ 7 ; :u8
|
SYM_KEY_VAR equ 7 ; :u8
|
||||||
|
SYM_KEY_END_LOCALS equ 8 ; :u8
|
||||||
;; end-consts
|
;; end-consts
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
|
|
@ -1507,9 +1514,29 @@ ast_build_symtable_for_each:
|
||||||
jmp .insert_scope
|
jmp .insert_scope
|
||||||
|
|
||||||
.func:
|
.func:
|
||||||
; use function name as scope name
|
|
||||||
|
|
||||||
mov rbx, [rax + 8] ; AstNode.data
|
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 rdx, [rbx + 0] ; Func.name
|
||||||
mov rcx, [rbx + 8] ; Func.name_len
|
mov rcx, [rbx + 8] ; Func.name_len
|
||||||
|
|
||||||
|
|
@ -1519,12 +1546,13 @@ ast_build_symtable_for_each:
|
||||||
.insert_scope:
|
.insert_scope:
|
||||||
; insert scope entry
|
; insert scope entry
|
||||||
mov byte [rsp + 32], SYM_KEY_SCOPE ; SymKey.kind
|
mov byte [rsp + 32], SYM_KEY_SCOPE ; SymKey.kind
|
||||||
mov rdx, [rsp + 16] ; index
|
mov rdx, [rsp + 16] ; index
|
||||||
mov qword [rsp + 40], rdx ; SymKey.scope_index
|
mov qword [rsp + 40], rdx ; SymKey.scope_index
|
||||||
mov rdx, [rax + 24] ; AstNode.span
|
mov rax, [rsp + 24] ; *AstNode
|
||||||
mov qword [rsp + 48], rdx ; SymKey.span
|
mov rdx, [rax + 24] ; AstNode.span
|
||||||
mov qword [rsp + 56], 1 ; SymKey.ident
|
mov qword [rsp + 48], rdx ; SymKey.span
|
||||||
mov qword [rsp + 64], 0 ; SymKey.ident_len
|
mov qword [rsp + 56], 1 ; SymKey.ident
|
||||||
|
mov qword [rsp + 64], 0 ; SymKey.ident_len
|
||||||
|
|
||||||
mov rdi, [rsp + 8] ; Ctx.symtable
|
mov rdi, [rsp + 8] ; Ctx.symtable
|
||||||
lea rsi, [rsp + 32] ; &SymEntry
|
lea rsi, [rsp + 32] ; &SymEntry
|
||||||
|
|
@ -1699,6 +1727,27 @@ ast_walk_for_each:
|
||||||
je .return_statement
|
je .return_statement
|
||||||
cmp bl, AST_IF
|
cmp bl, AST_IF
|
||||||
je .if_expr
|
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
|
jmp .check_scope
|
||||||
|
|
||||||
.func:
|
.func:
|
||||||
|
|
@ -1898,6 +1947,11 @@ ast_resolve_var_refs_for_each:
|
||||||
call vec_get
|
call vec_get
|
||||||
mov rbx, rax ; *SymEntry
|
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
|
; compare symbol ident with var_ref ident
|
||||||
mov rdi, [rbx + 24] ; SymEntry.key.ident
|
mov rdi, [rbx + 24] ; SymEntry.key.ident
|
||||||
mov rsi, [rbx + 32] ; SymEntry.key.ident_len
|
mov rsi, [rbx + 32] ; SymEntry.key.ident_len
|
||||||
|
|
|
||||||
|
|
@ -58,75 +58,75 @@ fn main() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main() -> void { return 1 * 2 + 3 * 4; }",
|
b"fn main() -> void { return 1 * 2 + 3 * 4; }",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
// );
|
);
|
||||||
|
|
||||||
// print_ast(b"3 + 4", |ast| unsafe { parse_expr(ast) });
|
print_ast(b"3 + 4", |ast| unsafe { parse_expr(ast) });
|
||||||
// print_ast(b"fn main() -> void { return 1 + 2; }", |ast| unsafe {
|
print_ast(b"fn main() -> void { return 1 + 2; }", |ast| unsafe {
|
||||||
// parse_func(ast)
|
parse_func(ast)
|
||||||
// });
|
});
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main() -> void { ;;;return (1 + (2)); }",
|
b"fn main() -> void { ;;;return (1 + (2)); }",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
// );
|
);
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main() -> void { return (1 + (2 * 3)) / 4; }",
|
b"fn main() -> void { return (1 + (2 * 3)) / 4; }",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
// );
|
);
|
||||||
// print_ast(b"fn main() -> void { return 1 + 2 * 3; }", |ast| unsafe {
|
print_ast(b"fn main() -> void { return 1 + 2 * 3; }", |ast| unsafe {
|
||||||
// parse_func(ast)
|
parse_func(ast)
|
||||||
// });
|
});
|
||||||
|
|
||||||
// print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe {
|
print_ast(b"fn main() -> void { let x: u32 = 4; }", |ast| unsafe {
|
||||||
// parse_func(ast)
|
parse_func(ast)
|
||||||
// });
|
});
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main(a: u32) -> void { let x: u32 = a + 4; }",
|
b"fn main(a: u32) -> void { let x: u32 = a + 4; }",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
// );
|
);
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main(a: u32) -> void {
|
b"fn main(a: u32) -> void {
|
||||||
// let y: u32 = a + 4;
|
let y: u32 = a + 4;
|
||||||
// let y: *u32 = &y;
|
let y: *u32 = &y;
|
||||||
// return *y;
|
return *y;
|
||||||
// }",
|
}",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
// );
|
);
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main(a: u32) -> void {
|
b"fn main(a: u32) -> void {
|
||||||
// let y: u32 = a + 4;
|
let y: u32 = a + 4;
|
||||||
// {
|
{
|
||||||
// let y: u32 = 10;
|
let y: u32 = 10;
|
||||||
// }
|
}
|
||||||
// let y: *u32 = &y;
|
let y: *u32 = &y;
|
||||||
// return *y;
|
return *y;
|
||||||
// }",
|
}",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
// );
|
);
|
||||||
// print_ast(
|
print_ast(
|
||||||
// b"fn main(a: *u32, b: u32) -> void {
|
b"fn main(a: *u32, b: u32) -> void {
|
||||||
// *a = b;
|
*a = b;
|
||||||
// a = &b;
|
a = &b;
|
||||||
// }",
|
}",
|
||||||
// |ast| unsafe { parse_func(ast) },
|
|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(
|
print_ast(
|
||||||
b"fn main(a: u32) -> void {
|
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) },
|
|ast| unsafe { parse_func(ast) },
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,7 @@ impl core::fmt::Display for util::defs::SymEntry {
|
||||||
util::defs::SYM_KEY_PARENT_SCOPE => "ParentScope",
|
util::defs::SYM_KEY_PARENT_SCOPE => "ParentScope",
|
||||||
util::defs::SYM_KEY_ARG => "Argument",
|
util::defs::SYM_KEY_ARG => "Argument",
|
||||||
util::defs::SYM_KEY_VAR => "Variable",
|
util::defs::SYM_KEY_VAR => "Variable",
|
||||||
|
util::defs::SYM_KEY_FUNCTION => "Function",
|
||||||
_ => "Unknown",
|
_ => "Unknown",
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,10 @@ pub const SYM_KEY_SCOPE: u8 = 1;
|
||||||
pub const SYM_KEY_SCOPE_NAME: u8 = 2;
|
pub const SYM_KEY_SCOPE_NAME: u8 = 2;
|
||||||
pub const SYM_KEY_PARENT_SCOPE: u8 = 3;
|
pub const SYM_KEY_PARENT_SCOPE: u8 = 3;
|
||||||
pub const SYM_KEY_START_LOCALS: u8 = 4;
|
pub const SYM_KEY_START_LOCALS: u8 = 4;
|
||||||
pub const SYM_KEY_ARG: u8 = 5;
|
pub const SYM_KEY_FUNCTION: u8 = 5;
|
||||||
pub const SYM_KEY_VAR: u8 = 6;
|
pub const SYM_KEY_ARG: u8 = 6;
|
||||||
pub const SYM_KEY_END_LOCALS: u8 = 7;
|
pub const SYM_KEY_VAR: u8 = 7;
|
||||||
|
pub const SYM_KEY_END_LOCALS: u8 = 8;
|
||||||
pub const AST_FUNCTION: u8 = 1;
|
pub const AST_FUNCTION: u8 = 1;
|
||||||
pub const AST_BLOCK: u8 = 2;
|
pub const AST_BLOCK: u8 = 2;
|
||||||
pub const AST_VARIABLE: u8 = 3;
|
pub const AST_VARIABLE: u8 = 3;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue