From 39e8d6ae96bbef67dad12f9b6b09f611ec1efcdc Mon Sep 17 00:00:00 2001 From: janis Date: Wed, 29 Oct 2025 16:21:01 +0100 Subject: [PATCH] move defintions out of tokeniser into include file --- lang/src/tokeniser.asm | 231 +++++------------------------------------ lang/src/tokeniser.inc | 210 +++++++++++++++++++++++++++++++++++++ 2 files changed, 237 insertions(+), 204 deletions(-) create mode 100644 lang/src/tokeniser.inc diff --git a/lang/src/tokeniser.asm b/lang/src/tokeniser.asm index a5e548f..6b050a7 100644 --- a/lang/src/tokeniser.asm +++ b/lang/src/tokeniser.asm @@ -23,6 +23,8 @@ global tokeniser_print global find_lexeme global expect_token global unwrap_token +global peek_expect_token +global peek_lexeme ;; ============================= ;; Tokeniser functions @@ -115,210 +117,7 @@ global TOKENS global LEXEME_LENS global NUM_LEXEMES -align 8 -LEXEMES: - dq LEX_NOT_A_LEXEME - dq LEX_LET - dq LEX_IF - dq LEX_ELSE - dq LEX_FN - dq LEX_RETURN - dq LEX_LOOP - dq LEX_BREAK - dq LEX_CONTINUE - dq LEX_TRUE - dq LEX_FALSE - dq LEX_BOOL - dq LEX_ARROW - dq LEX_I32 - dq LEX_U32 - dq LEX_EQUALS - dq LEX_PLUS - dq LEX_MINUS - dq LEX_RPARENS - dq LEX_LPARENS - dq LEX_RBRACE - dq LEX_LBRACE - dq LEX_COLON - dq LEX_SEMI - dq LEX_COMMA - dq LEX_PIPE - dq LEX_AMP - dq LEX_EQEQ - dq LEX_LBRACKET - dq LEX_RBRACKET - -align 8 -TOKENS: - db TOKEN_EOF ;; 0 - db TOKEN_LET ;; 1 - db TOKEN_IF ;; 2 - db TOKEN_ELSE ;; 3 - db TOKEN_FN ;; 4 - db TOKEN_RETURN ;; 5 - db TOKEN_LOOP ;; 6 - db TOKEN_BREAK ;; 7 - db TOKEN_CONTINUE ;; 8 - db TOKEN_TRUE ;; 9 - db TOKEN_FALSE ;; 10 - db TOKEN_BOOL ;; 11 - db TOKEN_ARROW ;; 12 - db TOKEN_I32 ;; 13 - db TOKEN_U32 ;; 14 - db TOKEN_EQUALS ;; 15 - db TOKEN_PLUS ;; 16 - db TOKEN_MINUS ;; 17 - db TOKEN_RPARENS ;; 18 - db TOKEN_LPARENS ;; 19 - db TOKEN_RBRACE ;; 20 - db TOKEN_LBRACE ;; 21 - db TOKEN_COLON ;; 22 - db TOKEN_SEMI ;; 23 - db TOKEN_COMMA ;; 24 - db TOKEN_PIPE ;; 25 - db TOKEN_AMP ;; 26 - db TOKEN_EQEQ ;; 27 - db TOKEN_LBRACKET ;; 28 - db TOKEN_RBRACKET ;; 29 - -align 8 -LEXEME_LENS: - dq 0 - dq LEX_LET_len - dq LEX_IF_len - dq LEX_ELSE_len - dq LEX_FN_len - dq LEX_RETURN_len - dq LEX_LOOP_len - dq LEX_BREAK_len - dq LEX_CONTINUE_len - dq LEX_TRUE_len - dq LEX_FALSE_len - dq LEX_BOOL_len - dq LEX_ARROW_len - dq LEX_I32_len - dq LEX_U32_len - dq LEX_EQUALS_len - dq LEX_PLUS_len - dq LEX_MINUS_len - dq LEX_RPARENS_len - dq LEX_LPARENS_len - dq LEX_RBRACE_len - dq LEX_LBRACE_len - dq LEX_COLON_len - dq LEX_SEMI_len - dq LEX_COMMA_len - dq LEX_PIPE_len - dq LEX_AMP_len - dq LEX_EQEQ_len - dq LEX_LBRACKET_len - dq LEX_RBRACKET_len - -align 8 -NUM_LEXEMES: dq 30 - - LEX_NOT_A_LEXEME db "", 0 - TOKEN_EOF equ 0 - TOKEN_LET equ 1 - LEX_LET db "let" - LEX_LET_len equ $ - LEX_LET - TOKEN_IF equ 2 - LEX_IF db "if" - LEX_IF_len equ $ - LEX_IF - TOKEN_ELSE equ 3 - LEX_ELSE db "else" - LEX_ELSE_len equ $ - LEX_ELSE - TOKEN_FN equ 4 - 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 - LEX_AMP db "&" - LEX_AMP_len equ $ - LEX_AMP - TOKEN_EQEQ equ 27 - LEX_EQEQ db "==" - LEX_EQEQ_len equ $ - LEX_EQEQ - TOKEN_LBRACKET equ 28 - LEX_LBRACKET db "[" - LEX_LBRACKET_len equ $ - LEX_LBRACKET - TOKEN_RBRACKET equ 29 - LEX_RBRACKET db "]" - LEX_RBRACKET_len equ $ - LEX_RBRACKET - TOKEN_IDENT equ 30 - LEX_IDENT db "" - LEX_IDENT_len equ $ - LEX_IDENT - TOKEN_NUMBER equ 31 - LEX_NUMBER db "" - LEX_NUMBER_len equ $ - LEX_NUMBER - TOKEN_STRING equ 32 - LEX_STRING db "" - LEX_STRING_len equ $ - LEX_STRING - TOKEN_COMMENT equ 33 - LEX_COMMENT db "" - LEX_COMMENT_len equ $ - LEX_COMMENT - +%include "src/tokeniser.inc" section .text ;; rdi: length of previously matched lexeme @@ -743,3 +542,27 @@ unwrap_token: ret .panic: call panic + +;; dil: expected token +peek_expect_token: + push rbp + mov rbp, rsp + push qword [rel cursor] + call expect_token + pop rdi + mov [rel cursor], rdi + pop rbp + ret + +;; rdi: out-struct pointer +peek_lexeme: + push rbp + mov rbp, rsp + push rdi + push qword [rel cursor] ; save cursor + call find_lexeme + pop rdi + mov [rel cursor], rdi ; restore cursor + pop rax + pop rbp + ret diff --git a/lang/src/tokeniser.inc b/lang/src/tokeniser.inc new file mode 100644 index 0000000..39d308f --- /dev/null +++ b/lang/src/tokeniser.inc @@ -0,0 +1,210 @@ +section .rdata +align 8 +LEXEMES: + dq LEX_NOT_A_LEXEME + dq LEX_LET + dq LEX_IF + dq LEX_ELSE + dq LEX_FN + dq LEX_RETURN + dq LEX_LOOP + dq LEX_BREAK + dq LEX_CONTINUE + dq LEX_TRUE + dq LEX_FALSE + dq LEX_BOOL + dq LEX_ARROW + dq LEX_I32 + dq LEX_U32 + dq LEX_EQUALS + dq LEX_PLUS + dq LEX_MINUS + dq LEX_RPARENS + dq LEX_LPARENS + dq LEX_RBRACE + dq LEX_LBRACE + dq LEX_COLON + dq LEX_SEMI + dq LEX_COMMA + dq LEX_PIPE + dq LEX_AMP + dq LEX_EQEQ + dq LEX_LBRACKET + dq LEX_RBRACKET + dq LEX_VOID + +align 8 +TOKENS: + db TOKEN_EOF ;; 0 + db TOKEN_LET ;; 1 + db TOKEN_IF ;; 2 + db TOKEN_ELSE ;; 3 + db TOKEN_FN ;; 4 + db TOKEN_RETURN ;; 5 + db TOKEN_LOOP ;; 6 + db TOKEN_BREAK ;; 7 + db TOKEN_CONTINUE ;; 8 + db TOKEN_TRUE ;; 9 + db TOKEN_FALSE ;; 10 + db TOKEN_BOOL ;; 11 + db TOKEN_ARROW ;; 12 + db TOKEN_I32 ;; 13 + db TOKEN_U32 ;; 14 + db TOKEN_EQUALS ;; 15 + db TOKEN_PLUS ;; 16 + db TOKEN_MINUS ;; 17 + db TOKEN_RPARENS ;; 18 + db TOKEN_LPARENS ;; 19 + db TOKEN_RBRACE ;; 20 + db TOKEN_LBRACE ;; 21 + db TOKEN_COLON ;; 22 + db TOKEN_SEMI ;; 23 + db TOKEN_COMMA ;; 24 + db TOKEN_PIPE ;; 25 + db TOKEN_AMP ;; 26 + db TOKEN_EQEQ ;; 27 + db TOKEN_LBRACKET ;; 28 + db TOKEN_RBRACKET ;; 29 + db TOKEN_VOID ;; 30 + +align 8 +LEXEME_LENS: + dq 0 + dq LEX_LET_len + dq LEX_IF_len + dq LEX_ELSE_len + dq LEX_FN_len + dq LEX_RETURN_len + dq LEX_LOOP_len + dq LEX_BREAK_len + dq LEX_CONTINUE_len + dq LEX_TRUE_len + dq LEX_FALSE_len + dq LEX_BOOL_len + dq LEX_ARROW_len + dq LEX_I32_len + dq LEX_U32_len + dq LEX_EQUALS_len + dq LEX_PLUS_len + dq LEX_MINUS_len + dq LEX_RPARENS_len + dq LEX_LPARENS_len + dq LEX_RBRACE_len + dq LEX_LBRACE_len + dq LEX_COLON_len + dq LEX_SEMI_len + dq LEX_COMMA_len + dq LEX_PIPE_len + dq LEX_AMP_len + dq LEX_EQEQ_len + dq LEX_LBRACKET_len + dq LEX_RBRACKET_len + dq LEX_VOID_len + +align 8 +NUM_LEXEMES: dq 30 + + LEX_NOT_A_LEXEME db "", 0 + TOKEN_EOF equ 0 + TOKEN_LET equ 1 + LEX_LET db "let" + LEX_LET_len equ $ - LEX_LET + TOKEN_IF equ 2 + LEX_IF db "if" + LEX_IF_len equ $ - LEX_IF + TOKEN_ELSE equ 3 + LEX_ELSE db "else" + LEX_ELSE_len equ $ - LEX_ELSE + TOKEN_FN equ 4 + 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 + LEX_AMP db "&" + LEX_AMP_len equ $ - LEX_AMP + TOKEN_EQEQ equ 27 + LEX_EQEQ db "==" + LEX_EQEQ_len equ $ - LEX_EQEQ + TOKEN_LBRACKET equ 28 + LEX_LBRACKET db "[" + LEX_LBRACKET_len equ $ - LEX_LBRACKET + TOKEN_RBRACKET equ 29 + LEX_RBRACKET db "]" + LEX_RBRACKET_len equ $ - LEX_RBRACKET + TOKEN_VOID equ 30 + LEX_VOID db "void" + LEX_VOID_len equ $ - LEX_VOID + TOKEN_IDENT equ 31 + LEX_IDENT db "" + LEX_IDENT_len equ $ - LEX_IDENT + TOKEN_NUMBER equ 32 + LEX_NUMBER db "" + LEX_NUMBER_len equ $ - LEX_NUMBER + TOKEN_STRING equ 33 + LEX_STRING db "" + LEX_STRING_len equ $ - LEX_STRING + TOKEN_COMMENT equ 34 + LEX_COMMENT db "" + LEX_COMMENT_len equ $ - LEX_COMMENT \ No newline at end of file