asdf
This commit is contained in:
parent
8a0c822533
commit
81417de6ca
|
|
@ -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
1
lang/src/test.m
Normal file
|
|
@ -0,0 +1 @@
|
|||
let fn if
|
||||
Loading…
Reference in a new issue