This commit is contained in:
janis 2025-10-18 10:59:30 +02:00
parent 8a0c822533
commit 81417de6ca
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 61 additions and 9 deletions

View file

@ -233,50 +233,100 @@ LEXEME_LENS: dq \
LEX_FN db "fn"
LEX_FN_len equ $ - LEX_FN
TOKEN_RETURN equ 5
LEX_RETURN db "return"
LEX_RETURN_len equ $ - LEX_RETURN
TOKEN_LOOP equ 6
LEX_LOOP db "loop"
LEX_LOOP_len equ $ - LEX_LOOP
TOKEN_BREAK equ 7
LEX_BREAK db "break"
LEX_BREAK_len equ $ - LEX_BREAK
TOKEN_CONTINUE equ 8
LEX_CONTINUE db "continue"
LEX_CONTINUE_len equ $ - LEX_CONTINUE
TOKEN_TRUE equ 9
LEX_TRUE db "true"
LEX_TRUE_len equ $ - LEX_TRUE
TOKEN_FALSE equ 10
LEX_FALSE db "false"
LEX_FALSE_len equ $ - LEX_FALSE
TOKEN_BOOL equ 11
LEX_BOOL db "bool"
LEX_BOOL_len equ $ - LEX_BOOL
TOKEN_ARROW equ 12
LEX_ARROW db "->"
LEX_ARROW_len equ $ - LEX_ARROW
TOKEN_I32 equ 13
LEX_I32 db "i32"
LEX_I32_len equ $ - LEX_I32
TOKEN_U32 equ 14
LEX_U32 db "u32"
LEX_U32_len equ $ - LEX_U32
TOKEN_EQUALS equ 15
LEX_EQUALS db "="
LEX_EQUALS_len equ $ - LEX_EQUALS
TOKEN_PLUS equ 16
LEX_PLUS db "+"
LEX_PLUS_len equ $ - LEX_PLUS
TOKEN_MINUS equ 17
LEX_MINUS db "-"
LEX_MINUS_len equ $ - LEX_MINUS
TOKEN_RPARENS equ 18
LEX_RPARENS db ")"
LEX_RPARENS_len equ $ - LEX_RPARENS
TOKEN_LPARENS equ 19
LEX_LPARENS db "("
LEX_LPARENS_len equ $ - LEX_LPARENS
TOKEN_RBRACE equ 20
LEX_RBRACE db "}"
LEX_RBRACE_len equ $ - LEX_RBRACE
TOKEN_LBRACE equ 21
LEX_LBRACE db "{"
LEX_LBRACE_len equ $ - LEX_LBRACE
TOKEN_COLON equ 22
LEX_COLON db ":"
LEX_COLON_len equ $ - LEX_COLON
TOKEN_SEMI equ 23
LEX_SEMI db ";"
LEX_SEMI_len equ $ - LEX_SEMI
TOKEN_COMMA equ 24
LEX_COMMA db ","
LEX_COMMA_len equ $ - LEX_COMMA
TOKEN_PIPE equ 25
LEX_PIPE db "|"
LEX_PIPE_len equ $ - LEX_PIPE
TOKEN_AMP equ 26
TOKEN_IDENT equ 27
TOKEN_NUMBER equ 28
LEX_AMP db "&"
LEX_AMP_len equ $ - LEX_AMP
TOKEN_EQEQ equ 27
LEX_EQEQ db "=="
LEX_EQEQ_len equ $ - LEX_EQEQ
TOKEN_IDENT equ 28
LEX_IDENT db "<identifier>"
LEX_IDENT_len equ $ - LEX_IDENT
TOKEN_NUMBER equ 29
LEX_NUMBER db "<number>"
LEX_NUMBER_len equ $ - LEX_NUMBER
section .text
;; rcx: pointer to lexeme
;; rdx: length of lexeme
;; r8: token to return if matched
;; rcx: lexeme index
;; Returns:
;; rax: token if matched, 0 if not matched
try_lexeme:
push r8
push r15
push rcx ; save lexeme index
; compare lexeme with cursor
mov r9, [cursor]
mov r8, [buffer]
add r8, r9
mov rax, [buffer_len]
sub rax, r9
mov rdx, [LEXEME_LENS + rcx*8]
cmp rax, rdx
jl .not_equal
; compare memory
mov rcx, [LEXEMES + rcx*8]
mov r9, rdx
call streq
cmp rax, 1
@ -314,6 +364,7 @@ try_lexeme:
jmp .try_lexeme_loop
.done_ident:
mov [cursor], r15
pop rcx
pop r15
pop r8
mov rax, TOKEN_IDENT
@ -322,11 +373,13 @@ try_lexeme:
mov rax, [cursor]
add rax, rdx
mov [cursor], rax
pop rcx
pop r15
pop r8
mov rax, r8
mov rax, rcx
ret
.not_equal:
pop rcx
pop r15
pop r8
xor rax, rax
@ -355,9 +408,7 @@ tokeniser_next_token:
; TODO: numbers, idents
jge .skip
; try lexeme
mov rcx, [LEXEMES + r15*8]
mov rdx, [LEXEME_LENS + r15*8]
mov r8, [TOKENS + r15]
mov rcx, r15
call try_lexeme
cmp rax, 0
jne .return_token

1
lang/src/test.m Normal file
View file

@ -0,0 +1 @@
let fn if