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