From 81417de6cadedb0ddc9cc19313cb267833682c4f Mon Sep 17 00:00:00 2001 From: janis Date: Sat, 18 Oct 2025 10:59:30 +0200 Subject: [PATCH] asdf --- lang/src/main.asm | 69 ++++++++++++++++++++++++++++++++++++++++------- lang/src/test.m | 1 + 2 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 lang/src/test.m diff --git a/lang/src/main.asm b/lang/src/main.asm index e7e6341..2887770 100644 --- a/lang/src/main.asm +++ b/lang/src/main.asm @@ -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 "" + LEX_IDENT_len equ $ - LEX_IDENT + TOKEN_NUMBER equ 29 + LEX_NUMBER db "" + 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 diff --git a/lang/src/test.m b/lang/src/test.m new file mode 100644 index 0000000..84c5dd5 --- /dev/null +++ b/lang/src/test.m @@ -0,0 +1 @@ +let fn if