lang/src/parse/lexer.s
2025-04-29 19:00:46 +02:00

123 lines
2.1 KiB
ArmAsm

%include "./src/inc/token.s"
%include "./src/inc/lexer.s"
%include "./src/inc/expression.s"
%include "./src/inc/asm_output.s"
%include "./src/inc/regs.s"
section .text
extern malloc
extern err_malloc
extern exit
extern putstr
extern create_expressions
extern strcmp
extern VAL_OP_LOAD
extern VAL_OP_ADD
extern VAL_VAR
extern VAL_CONST
extern putchar
extern putnumber
extern putendl
extern get_vars
extern insert_var
extern insert_mov
extern load_var_rax
extern load_rax_var
extern add_const_rax
extern add_var_rax
extern sub_const_rax
extern sub_var_rax
extern xor_reg
extern lex_load
extern lex_eundefined
global lex
lex: ; rax: lex* (rdi: char *file_content)
push rbp
mov rbp, rsp
sub rsp, 32
push rbx
mov [rbp - 8], rdi
; allocate lexer
mov rdi, LEX_SIZE
call malloc
cmp rax, 0
je err_malloc
mov [rbp - 24], rax ; store lex on stack
lea rsi, [rbp - 16] ; int* expr_cnt
mov rdi, [rbp - 8] ; restore file_content
call create_expressions
mov rdi, [rbp - 24]
mov [rdi + LEX_EXPR], rax
mov rax, [rbp - 16]
mov [rdi + LEX_EXPR_CNT], rax
call get_vars
mov rax, [rbp - 24]
lea rcx, [rax + LEX_EXPR_IDX]
.process_expressions:
mov rdi, [rbp - 24]
mov esi, [rdi + LEX_EXPR_CNT]
cmp dword [rcx], esi
je .done
push rcx
call lex_load
pop rcx
inc dword [rcx]
jmp .process_expressions
.done:
pop rbx
mov rsp, rbp
pop rbp
ret
global look_up_var
look_up_var: ; rax: bool (rdi: lex*, rsi: name*)
push rbp
mov rbp, rsp
xor rax, rax
xor rcx, rcx
mov edx, dword [rdi + LEX_VAR_CNT]
mov rdi, [rdi + LEX_VAR]
.loop_vars:
cmp rcx, rdx
je .not_found
push rdi
mov rdi, [rdi]
call strcmp
pop rdi
cmp rax, 0
je .found
inc rcx
add rdi, VAR_SIZE
jmp .loop_vars
.not_found:
mov rdi, rsi
call lex_eundefined
.found:
mov rax, [rdi + VAR_OFFS]
.done:
mov rsp, rbp
pop rbp
ret